feat(i18n): migrate emergency, infection control, audit log pages to vue-i18n (~700 keys)
This commit is contained in:
@@ -4021,5 +4021,679 @@
|
||||
"confirm": "OK",
|
||||
"cancel": "Cancel",
|
||||
"confirmBeforeSubmit": "Please confirm before submitting"
|
||||
},
|
||||
"emergency": {
|
||||
"common": {
|
||||
"status": "Status",
|
||||
"search": "Search",
|
||||
"operation": "Action",
|
||||
"operationSuccess": "Operation successful",
|
||||
"edit": "Edit",
|
||||
"delete": "Delete",
|
||||
"confirmDelete": "Confirm delete?",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"complete": "Complete",
|
||||
"completed": "Completed",
|
||||
"deleted": "Deleted",
|
||||
"submit": "Submit"
|
||||
},
|
||||
"triage": {
|
||||
"title": "Emergency Triage Management",
|
||||
"levelRange": "Level I-V",
|
||||
"inTreatment": "In Treatment",
|
||||
"todayTotal": "Today's Total",
|
||||
"refresh": "Refresh",
|
||||
"patientName": "Patient Name",
|
||||
"triageLevel": "Triage Level",
|
||||
"statusWaiting": "Waiting",
|
||||
"statusInTreatment": "In Treatment",
|
||||
"statusCompleted": "Completed",
|
||||
"addTriage": "New Triage",
|
||||
"editTriage": "Edit Triage",
|
||||
"patient": "Patient",
|
||||
"level": "Level",
|
||||
"chiefComplaint": "Chief Complaint",
|
||||
"temperature": "Temp",
|
||||
"pulse": "Pulse",
|
||||
"systolicBp": "Systolic BP",
|
||||
"spo2": "SpO2",
|
||||
"consciousness": "Consciousness",
|
||||
"area": "Area",
|
||||
"nurse": "Triage Nurse",
|
||||
"callNumber": "Call",
|
||||
"patientId": "Patient ID",
|
||||
"level1": "Level I Critical",
|
||||
"level2": "Level II Emergent",
|
||||
"level3": "Level III Urgent",
|
||||
"level4": "Level IV Less Urgent",
|
||||
"level5": "Level V Non-Urgent",
|
||||
"chiefComplaintPlaceholder": "Describe main symptoms",
|
||||
"respiration": "Respiration",
|
||||
"diastolicBp": "Diastolic BP",
|
||||
"consciousnessState": "Consciousness State",
|
||||
"consciousAwake": "Awake",
|
||||
"consciousDrowsy": "Drowsy",
|
||||
"consciousComa": "Coma",
|
||||
"triageArea": "Triage Area",
|
||||
"areaRescue": "Rescue Zone",
|
||||
"areaObservation": "Observation Zone",
|
||||
"areaConsultRoom": "Consult Room",
|
||||
"areaGeneral": "General Zone",
|
||||
"called": "Called"
|
||||
},
|
||||
"rescue": {
|
||||
"title": "Rescue Management",
|
||||
"chiefDoctor": "Chief Doctor",
|
||||
"rescueResult": "Rescue Result",
|
||||
"resultSuccess": "Success",
|
||||
"resultFailed": "Failed",
|
||||
"resultInProgress": "In Progress",
|
||||
"startRescue": "Start Rescue",
|
||||
"editRecord": "Edit Rescue Record",
|
||||
"patientId": "Patient ID",
|
||||
"triageId": "Triage ID",
|
||||
"startTime": "Start Time",
|
||||
"endTime": "End Time",
|
||||
"rescueTeam": "Rescue Team",
|
||||
"procedures": "Procedures",
|
||||
"medications": "Medications",
|
||||
"result": "Result",
|
||||
"endRescue": "End Rescue",
|
||||
"recordResult": "Record Result",
|
||||
"recordResultTitle": "Record Rescue Result",
|
||||
"outcome": "Outcome",
|
||||
"outcomePlaceholder": "Patient outcome",
|
||||
"teamMembers": "Team members",
|
||||
"proceduresPlaceholder": "Procedure records",
|
||||
"medicationsPlaceholder": "Medication records",
|
||||
"rescueEnded": "Rescue ended",
|
||||
"resultRecorded": "Result recorded"
|
||||
},
|
||||
"observation": {
|
||||
"title": "Emergency Observation Management",
|
||||
"doctor": "Doctor",
|
||||
"bedNo": "Bed No.",
|
||||
"disposition": "Disposition",
|
||||
"dispAdmit": "Admit",
|
||||
"dispDischarge": "Discharge",
|
||||
"dispTransfer": "Transfer",
|
||||
"dispDeath": "Death",
|
||||
"addObservation": "New Observation",
|
||||
"editObservation": "Edit Observation",
|
||||
"patientId": "Patient ID",
|
||||
"bed": "Bed",
|
||||
"doctorLabel": "Doctor",
|
||||
"diagnosis": "Diagnosis",
|
||||
"startTime": "Start Time",
|
||||
"endTime": "End Time",
|
||||
"duration": "Duration(h)",
|
||||
"observing": "Observing",
|
||||
"dischargeAction": "Discharge/Disposition",
|
||||
"dischargeTitle": "Discharge/Disposition",
|
||||
"bedNoLabel": "Bed No.",
|
||||
"discharged": "Discharged/Disposition recorded"
|
||||
},
|
||||
"greentrack": {
|
||||
"title": "Green Channel Management",
|
||||
"totalCases": "Total Cases",
|
||||
"achievedCases": "Achieved Cases",
|
||||
"achievementRate": "Achievement Rate",
|
||||
"avgDoorToTx": "Avg Door-to-Tx Time",
|
||||
"refreshStats": "Refresh Stats",
|
||||
"diseaseType": "Disease Type",
|
||||
"isAchieved": "Achieved?",
|
||||
"achieved": "Achieved",
|
||||
"notAchieved": "Not Achieved",
|
||||
"activate": "Activate Green Channel",
|
||||
"patientId": "Patient ID",
|
||||
"doorToTx": "Door-to-Tx(min)",
|
||||
"targetTime": "Target Time(min)",
|
||||
"achievedLabel": "Achieved",
|
||||
"pendingEvaluation": "Pending",
|
||||
"activateTime": "Activate Time",
|
||||
"completeTime": "Complete Time",
|
||||
"completeEvaluation": "Complete Evaluation",
|
||||
"activateTitle": "Activate Green Channel",
|
||||
"diseaseTypePlaceholder": "e.g. Acute MI, Stroke",
|
||||
"targetTimeLabel": "Target Time(min)",
|
||||
"activateBtn": "Activate",
|
||||
"completeEvaluationTitle": "Complete Evaluation",
|
||||
"doorToTxLabel": "Door-to-Tx(min)",
|
||||
"selectPatient": "Please select a patient",
|
||||
"activated": "Green channel activated",
|
||||
"evaluationComplete": "Evaluation complete"
|
||||
}
|
||||
},
|
||||
"infection": {
|
||||
"case": {
|
||||
"title": "Infection Case Surveillance",
|
||||
"patientName": "Patient Name",
|
||||
"infectionType": "Infection Type",
|
||||
"nosocomial": "Hospital Infection",
|
||||
"community": "Community Infection",
|
||||
"status": "Status",
|
||||
"reported": "Reported",
|
||||
"confirmed": "Confirmed",
|
||||
"rejected": "Rejected",
|
||||
"query": "Search",
|
||||
"patient": "Patient",
|
||||
"type": "Type",
|
||||
"infectionSite": "Infection Site",
|
||||
"pathogen": "Pathogen",
|
||||
"reporter": "Reporter",
|
||||
"reportTime": "Report Time",
|
||||
"statusCol": "Status",
|
||||
"reviewResult": "Review Result"
|
||||
},
|
||||
"warning": {
|
||||
"title": "Epidemic Warning",
|
||||
"refresh": "Refresh",
|
||||
"addWarning": "Add Warning",
|
||||
"level1": "Level 1 Warning",
|
||||
"level2": "Level 2 Warning",
|
||||
"level3": "Level 3 Warning",
|
||||
"totalWarnings": "Total Warnings",
|
||||
"warningLevel": "Warning Level",
|
||||
"diseaseType": "Disease Type",
|
||||
"respiratory": "Respiratory",
|
||||
"intestinal": "Intestinal",
|
||||
"blood": "Blood-borne",
|
||||
"vector": "Vector-borne",
|
||||
"other": "Other",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"diseaseName": "Disease Name",
|
||||
"caseCount": "Case Count",
|
||||
"threshold": "Threshold",
|
||||
"affectedArea": "Affected Area",
|
||||
"department": "Report Department",
|
||||
"reporter": "Reporter",
|
||||
"warningTime": "Warning Time",
|
||||
"addDialogTitle": "Add Epidemic Warning",
|
||||
"diseaseNamePlaceholder": "Enter disease name",
|
||||
"pleaseSelect": "Please select",
|
||||
"affectedAreaPlaceholder": "Enter affected area",
|
||||
"departmentPlaceholder": "Enter department",
|
||||
"detailInfo": "Detail: ",
|
||||
"level1Short": "L1",
|
||||
"level2Short": "L2",
|
||||
"level3Short": "L3",
|
||||
"addSuccess": "Added successfully"
|
||||
},
|
||||
"outbreak": {
|
||||
"title": "Outbreak Alert",
|
||||
"ruleConfig": "Alert Rule Configuration",
|
||||
"checkDays": "Check Days",
|
||||
"yellowThreshold": "Yellow Threshold",
|
||||
"redThreshold": "Red Threshold",
|
||||
"executeCheck": "Execute Check",
|
||||
"checkResult": "Check Result Overview",
|
||||
"recentCases": "Recent Cases",
|
||||
"newWarnings": "New Warnings",
|
||||
"checkTime": "Check Time",
|
||||
"warningList": "Warning Record List",
|
||||
"refresh": "Refresh",
|
||||
"warningLevel": "Warning Level",
|
||||
"yellowWarning": "Yellow Warning",
|
||||
"redWarning": "Red Warning",
|
||||
"status": "Status",
|
||||
"statusPending": "Pending",
|
||||
"statusProcessing": "Processing",
|
||||
"statusHandled": "Handled",
|
||||
"statusExcluded": "Excluded",
|
||||
"infectionType": "Infection Type",
|
||||
"department": "Department",
|
||||
"caseCount": "Case Count",
|
||||
"threshold": "Threshold",
|
||||
"checkDaysCol": "Check Days",
|
||||
"statusCol": "Status",
|
||||
"handler": "Handler",
|
||||
"handleResult": "Handle Result",
|
||||
"warningTime": "Warning Time",
|
||||
"action": "Action",
|
||||
"process": "Process",
|
||||
"exclude": "Exclude",
|
||||
"processDialogTitle": "Process Warning",
|
||||
"handleResultPlaceholder": "Enter handle result",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"checkSuccess": "Check complete, {count} new warnings",
|
||||
"checkFailed": "Check failed: ",
|
||||
"enterHandleResult": "Please enter handle result",
|
||||
"processSuccess": "Processed successfully",
|
||||
"processFailed": "Process failed",
|
||||
"confirmExclude": "Confirm exclude this warning?",
|
||||
"tip": "Tip",
|
||||
"falseReportExclude": "False report exclude",
|
||||
"excluded": "Excluded",
|
||||
"operationFailed": "Operation failed",
|
||||
"unknown": "Unknown",
|
||||
"unknownError": "Unknown error"
|
||||
},
|
||||
"surveillance": {
|
||||
"title": "Targeted Surveillance",
|
||||
"refresh": "Refresh",
|
||||
"addMonitor": "Add Monitor",
|
||||
"exportReport": "Export Report",
|
||||
"statTotal": "Total Monitors",
|
||||
"statICU": "ICU Infections",
|
||||
"statSSI": "SSI",
|
||||
"statCLABSI": "CLABSI",
|
||||
"statVAP": "VAP",
|
||||
"statAvgRate": "Avg Infection Rate",
|
||||
"surveillanceType": "Surveillance Type",
|
||||
"typeICU": "ICU Infection",
|
||||
"typeSSI": "Surgical Site Infection(SSI)",
|
||||
"typeCLABSI": "CLABSI",
|
||||
"typeVAP": "Ventilator-Associated Pneumonia(VAP)",
|
||||
"typeCAUTI": "CAUTI",
|
||||
"typeMDR": "MDR Surveillance",
|
||||
"status": "Status",
|
||||
"statusOngoing": "Ongoing",
|
||||
"statusCompleted": "Completed",
|
||||
"statusPaused": "Paused",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"monitorDept": "Department",
|
||||
"monitorCount": "Patients",
|
||||
"infectionCount": "Infections",
|
||||
"infectionRate": "Infection Rate",
|
||||
"deviceUsageRate": "Device Usage Rate",
|
||||
"monitorPeriod": "Period",
|
||||
"remark": "Remark",
|
||||
"detail": "Detail",
|
||||
"addDialogTitle": "Add Surveillance",
|
||||
"monitorTypeLabel": "Type",
|
||||
"deptPlaceholder": "Enter department",
|
||||
"countLabel": "Patients",
|
||||
"infectionLabel": "Infections",
|
||||
"deviceLabel": "Device Usage(%)",
|
||||
"periodLabel": "Period",
|
||||
"periodPlaceholder": "e.g. 2026-01-01 ~ 2026-06-30",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"addSuccess": "Added successfully",
|
||||
"exportInfo": "Export feature in development",
|
||||
"typeICUShort": "ICU",
|
||||
"typeSSIShort": "SSI",
|
||||
"typeCLABSIShort": "CLABSI",
|
||||
"typeVAPShort": "VAP",
|
||||
"typeCAUTIShort": "CAUTI",
|
||||
"typeMDRShort": "MDR",
|
||||
"detailInfo": "Detail: "
|
||||
},
|
||||
"hygiene": {
|
||||
"title": "Hand Hygiene Management",
|
||||
"refresh": "Refresh",
|
||||
"addRecord": "Add Record",
|
||||
"viewStats": "View Stats",
|
||||
"statTotal": "Total Observations",
|
||||
"statCompliant": "Compliant",
|
||||
"statNonCompliant": "Non-Compliant",
|
||||
"statRate": "Compliance Rate",
|
||||
"statDepts": "Departments",
|
||||
"statPassRate": "Pass Rate",
|
||||
"department": "Department",
|
||||
"complianceType": "Compliance",
|
||||
"compliant": "Compliant",
|
||||
"nonCompliant": "Non-Compliant",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"staffName": "Staff",
|
||||
"handwashType": "Handwash Type",
|
||||
"observationTime": "Observation Time",
|
||||
"opportunities": "Opportunities",
|
||||
"compliantCount": "Compliant Count",
|
||||
"recordTime": "Record Time",
|
||||
"addDialogTitle": "Add Hand Hygiene Record",
|
||||
"deptPlaceholder": "Enter department",
|
||||
"namePlaceholder": "Enter name",
|
||||
"soap": "Soap & Water",
|
||||
"sanitizer": "Hand Sanitizer",
|
||||
"surgical": "Surgical Hand Antisepsis",
|
||||
"opportunityPlaceholder": "e.g. Before patient contact",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"statsTitle": "Hand Hygiene Statistics",
|
||||
"statsTotal": "Total Observations",
|
||||
"statsCompliant": "Compliant Count",
|
||||
"statsRate": "Compliance Rate",
|
||||
"statsNonCompliant": "Non-Compliant Count",
|
||||
"close": "Close",
|
||||
"addSuccess": "Added successfully"
|
||||
},
|
||||
"resistant": {
|
||||
"title": "MDR Surveillance",
|
||||
"refresh": "Refresh",
|
||||
"addRecord": "Add Record",
|
||||
"statDetected": "Detected",
|
||||
"statIsolated": "Isolated",
|
||||
"statIsolationRate": "Isolation Rate",
|
||||
"statCureRate": "Cure Rate",
|
||||
"bacteriaType": "Bacteria Type",
|
||||
"mdrPsa": "MDR Pseudomonas",
|
||||
"isolationStatus": "Isolation Status",
|
||||
"isolated": "Isolated",
|
||||
"released": "Released",
|
||||
"notIsolated": "Not Isolated",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"patient": "Patient",
|
||||
"department": "Department",
|
||||
"sampleType": "Sample Type",
|
||||
"isolationDate": "Isolation Date",
|
||||
"releaseDate": "Release Date",
|
||||
"antibioticUsage": "Antibiotic Usage",
|
||||
"reportTime": "Report Time",
|
||||
"addDialogTitle": "Add MDR Record",
|
||||
"patientPlaceholder": "Enter patient name",
|
||||
"selectPlaceholder": "Please select",
|
||||
"deptPlaceholder": "Enter department",
|
||||
"samplePlaceholder": "e.g. Sputum, Blood, Urine",
|
||||
"antibioticPlaceholder": "Enter antibiotic usage",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"addSuccess": "Added successfully"
|
||||
},
|
||||
"exposure": {
|
||||
"title": "Occupational Exposure Management",
|
||||
"refresh": "Refresh",
|
||||
"addReport": "New Report",
|
||||
"totalExposure": "Total Exposures",
|
||||
"bloodExposure": "Blood Exposure",
|
||||
"bodyFluidExposure": "Body Fluid Exposure",
|
||||
"followupRate": "Follow-up Rate",
|
||||
"exposureType": "Exposure Type",
|
||||
"needleStick": "Needle Stick",
|
||||
"chemicalExposure": "Chemical Exposure",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"staffName": "Exposed Staff",
|
||||
"department": "Department",
|
||||
"exposureSource": "Exposure Source",
|
||||
"exposureDate": "Exposure Time",
|
||||
"exposureSite": "Exposure Site",
|
||||
"exposureLevel": "Exposure Level",
|
||||
"status": "Status",
|
||||
"statusCompleted": "Completed",
|
||||
"statusInProgress": "In Progress",
|
||||
"statusPending": "Pending",
|
||||
"reportTime": "Report Time",
|
||||
"addDialogTitle": "New Occupational Exposure Report",
|
||||
"placeholderName": "Enter name",
|
||||
"placeholderDept": "Enter department",
|
||||
"placeholderSelect": "Please select",
|
||||
"placeholderSource": "e.g. HIV-positive patient blood",
|
||||
"placeholderSite": "e.g. Left index finger",
|
||||
"levelLight": "Mild",
|
||||
"levelMedium": "Moderate",
|
||||
"levelHeavy": "Severe",
|
||||
"treatment": "Treatment",
|
||||
"placeholderTreatment": "Enter treatment measures",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"addSuccess": "Added successfully"
|
||||
},
|
||||
"environment": {
|
||||
"title": "Environmental Monitoring",
|
||||
"refresh": "Refresh",
|
||||
"addMonitor": "New Monitor",
|
||||
"viewRate": "View Pass Rate",
|
||||
"sampleType": "Sample Type",
|
||||
"sampleAir": "Air",
|
||||
"sampleSurface": "Surface",
|
||||
"sampleHand": "Hand Sample",
|
||||
"sampleDisinfectant": "Disinfectant in Use",
|
||||
"sampleDevice": "Medical Device",
|
||||
"monitorResult": "Result",
|
||||
"qualified": "Qualified",
|
||||
"unqualified": "Unqualified",
|
||||
"query": "Search",
|
||||
"reset": "Reset",
|
||||
"sampleLocation": "Sample Location",
|
||||
"sampleDate": "Sample Date",
|
||||
"bacterialCount": "Bacterial Count (CFU)",
|
||||
"standardLimit": "Standard Limit",
|
||||
"exceedRate": "Exceed Rate",
|
||||
"monitorPerson": "Monitor",
|
||||
"recordTime": "Record Time",
|
||||
"addDialogTitle": "New Environmental Monitoring",
|
||||
"placeholderSelect": "Please select",
|
||||
"placeholderLocation": "Enter sample location",
|
||||
"placeholderDate": "Select date",
|
||||
"placeholderPerson": "Enter monitor name",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"rateDialogTitle": "Environmental Monitoring Pass Rate",
|
||||
"rateTotal": "Total Monitors",
|
||||
"rateQualified": "Qualified",
|
||||
"rateUnqualified": "Unqualified",
|
||||
"ratePercent": "Pass Rate",
|
||||
"close": "Close",
|
||||
"addSuccess": "Added successfully",
|
||||
"cardTotal": "Total Monitors",
|
||||
"cardQualified": "Qualified",
|
||||
"cardUnqualified": "Unqualified",
|
||||
"cardRate": "Pass Rate",
|
||||
"cardTypes": "Sample Types",
|
||||
"cardAvgBacterial": "Avg Bacterial"
|
||||
},
|
||||
"detail": {
|
||||
"title": "Infection Surveillance Statistics",
|
||||
"queryConditions": "Query Conditions",
|
||||
"department": "Department",
|
||||
"deptId": "Dept ID",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
"query": "Search",
|
||||
"totalCases": "Total Cases",
|
||||
"reported": "Reported",
|
||||
"confirmed": "Confirmed",
|
||||
"infectionRate": "Infection Rate",
|
||||
"byType": "By Infection Type",
|
||||
"infectionType": "Infection Type",
|
||||
"caseCount": "Case Count",
|
||||
"bySite": "By Infection Site",
|
||||
"infectionSite": "Infection Site",
|
||||
"trend": "Infection Trend",
|
||||
"date": "Date",
|
||||
"total": "Total",
|
||||
"rejected": "Rejected",
|
||||
"loadFailed": "Load failed",
|
||||
"unknownError": "Unknown error"
|
||||
},
|
||||
"screening": {
|
||||
"title": "Automated Infection Case Screening",
|
||||
"ruleConfig": "Screening Rule Configuration",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
"placeholderStartDate": "Select start date",
|
||||
"placeholderEndDate": "Select end date",
|
||||
"infectionType": "Infection Type",
|
||||
"all": "All",
|
||||
"hospitalInfection": "Hospital Infection",
|
||||
"communityInfection": "Community Infection",
|
||||
"minDays": "Min Hospital Days",
|
||||
"runScreening": "Run Screening",
|
||||
"resultOverview": "Screening Result Overview",
|
||||
"screenedCount": "Screened Cases",
|
||||
"suspectedCount": "Suspected Cases",
|
||||
"screenTime": "Screening Time",
|
||||
"resultList": "Screening Result List",
|
||||
"refresh": "Refresh",
|
||||
"patientName": "Patient Name",
|
||||
"infectionSite": "Infection Site",
|
||||
"pathogen": "Pathogen",
|
||||
"diagnosisDate": "Diagnosis Date",
|
||||
"reportTime": "Report Time",
|
||||
"status": "Status",
|
||||
"statusReported": "Reported",
|
||||
"statusReviewed": "Reviewed",
|
||||
"statusConfirmed": "Confirmed",
|
||||
"statusRejected": "Rejected",
|
||||
"reviewResult": "Review Result",
|
||||
"confirmed": "Confirmed",
|
||||
"rejected": "Rejected",
|
||||
"screeningDone": "Screening completed",
|
||||
"screeningFailed": "Screening failed",
|
||||
"unknownError": "Unknown error"
|
||||
},
|
||||
"antibiotic": {
|
||||
"title": "Antibiotic Usage Management",
|
||||
"patientName": "Patient Name",
|
||||
"medicalNo": "Medical No.",
|
||||
"drugName": "Antibiotic Name",
|
||||
"dosage": "Dosage",
|
||||
"usage": "Usage",
|
||||
"course": "Course (Days)",
|
||||
"level": "Antibiotic Level",
|
||||
"indication": "Indication",
|
||||
"doctorName": "Doctor",
|
||||
"department": "Department",
|
||||
"useDate": "Use Date"
|
||||
},
|
||||
"enhanced": {
|
||||
"title": "Infection Control Enhanced",
|
||||
"outbreakTab": "Outbreak Alert",
|
||||
"surveillanceTab": "Targeted Surveillance",
|
||||
"handHygieneTab": "Hand Hygiene Monitoring",
|
||||
"mdrTab": "Multi-Drug Resistant Organisms",
|
||||
"envMonitorTab": "Environmental Monitoring",
|
||||
"addWarning": "Add Warning",
|
||||
"addMonitor": "Add Monitor",
|
||||
"addRecord": "Add Record",
|
||||
"department": "Department",
|
||||
"infectionType": "Infection Type",
|
||||
"caseCount": "Case Count",
|
||||
"warningLevel": "Warning Level",
|
||||
"redWarning": "Red",
|
||||
"yellowWarning": "Yellow",
|
||||
"status": "Status",
|
||||
"statusPending": "Pending",
|
||||
"statusProcessing": "Processing",
|
||||
"statusProcessed": "Processed",
|
||||
"statusExcluded": "Excluded",
|
||||
"warningTime": "Warning Time",
|
||||
"operation": "Operation",
|
||||
"handle": "Handle",
|
||||
"exclude": "Exclude",
|
||||
"monitorType": "Monitor Type",
|
||||
"icuMonitor": "ICU Monitor",
|
||||
"surgicalSite": "Surgical Site",
|
||||
"catheterRelated": "Catheter Related",
|
||||
"other": "Other",
|
||||
"unknown": "Unknown",
|
||||
"monitorObject": "Monitor Object",
|
||||
"totalCases": "Total Cases",
|
||||
"infectionCases": "Infection Cases",
|
||||
"infectionRate": "Infection Rate",
|
||||
"startDate": "Start Date",
|
||||
"totalObserve": "Total Observations",
|
||||
"totalComply": "Total Compliance",
|
||||
"overallRate": "Overall Compliance Rate",
|
||||
"monitorDate": "Monitor Date",
|
||||
"observeCount": "Observations",
|
||||
"complyCount": "Compliance",
|
||||
"complyRate": "Compliance Rate",
|
||||
"observer": "Observer",
|
||||
"patient": "Patient",
|
||||
"bacteriaName": "Bacteria",
|
||||
"resistanceType": "Resistance Type",
|
||||
"specimenType": "Specimen Type",
|
||||
"isolationStatus": "Isolation Status",
|
||||
"notIsolated": "Not Isolated",
|
||||
"isolated": "Isolated",
|
||||
"released": "Released",
|
||||
"reportDate": "Report Date",
|
||||
"isolate": "Isolate",
|
||||
"release": "Release",
|
||||
"monitorItem": "Monitor Item",
|
||||
"standardValue": "Standard Value",
|
||||
"actualValue": "Actual Value",
|
||||
"result": "Result",
|
||||
"tester": "Tester",
|
||||
"envAir": "Air",
|
||||
"envSurface": "Surface",
|
||||
"envHand": "Hand",
|
||||
"envDisinfectant": "Disinfectant",
|
||||
"envSterile": "Sterile Items",
|
||||
"qualified": "Qualified",
|
||||
"unqualified": "Unqualified",
|
||||
"addOutbreakWarning": "Add Outbreak Warning",
|
||||
"addHandHygiene": "Add Hand Hygiene Record",
|
||||
"addMdrRecord": "Add MDR Record",
|
||||
"addEnvMonitor": "Add Environmental Monitor",
|
||||
"patientName": "Patient Name",
|
||||
"bacteriaNameLabel": "Bacteria Name",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"promptHandleResult": "Please enter handling result",
|
||||
"handleWarning": "Handle Warning",
|
||||
"handleSuccess": "Handled successfully",
|
||||
"confirmExclude": "Confirm exclude this warning?",
|
||||
"excluded": "Excluded",
|
||||
"confirmIsolate": "Confirm mark as isolated?",
|
||||
"confirmIsolateTitle": "Confirm Isolation",
|
||||
"confirmRelease": "Confirm release isolation?",
|
||||
"confirmReleaseTitle": "Confirm Release",
|
||||
"addSuccess": "Added successfully"
|
||||
}
|
||||
},
|
||||
"auditlog": {
|
||||
"title": "Audit Log",
|
||||
"userName": "User",
|
||||
"module": "Module",
|
||||
"action": "Action",
|
||||
"method": "Method",
|
||||
"result": "Result",
|
||||
"resultSuccess": "Success",
|
||||
"resultFail": "Fail",
|
||||
"query": "Search",
|
||||
"durationMs": "Duration(ms)",
|
||||
"time": "Time",
|
||||
"operation": "Operation",
|
||||
"confirmDelete": "Confirm delete?",
|
||||
"delete": "Delete",
|
||||
"deleted": "Deleted",
|
||||
"detailTitle": "Audit Log Detail",
|
||||
"duration": "Duration",
|
||||
"params": "Params",
|
||||
"error": "Error",
|
||||
"riskLow": "Low",
|
||||
"riskMedium": "Medium",
|
||||
"riskHigh": "High",
|
||||
"riskCritical": "Critical",
|
||||
"unknown": "Unknown",
|
||||
"businessLogin": "Login",
|
||||
"businessLogout": "Logout",
|
||||
"businessQuery": "Query",
|
||||
"businessInsert": "Insert",
|
||||
"businessUpdate": "Update",
|
||||
"businessDelete": "Delete",
|
||||
"businessExport": "Export",
|
||||
"enhanced": {
|
||||
"title": "Audit Log Management",
|
||||
"hideStats": "Hide Stats",
|
||||
"showStats": "View Stats",
|
||||
"auditStats": "Audit Statistics",
|
||||
"totalLogs": "Total Logs",
|
||||
"highRiskOps": "High Risk Operations",
|
||||
"criticalRisk": "Critical Risk",
|
||||
"byModule": "By Module",
|
||||
"byRiskLevel": "By Risk Level",
|
||||
"riskLevel": "Risk Level",
|
||||
"businessType": "Business Type",
|
||||
"dateRangeSep": "to",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
"reset": "Reset",
|
||||
"detail": "Detail",
|
||||
"tenant": "Tenant",
|
||||
"department": "Department",
|
||||
"userAgent": "User Agent"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4021,5 +4021,679 @@
|
||||
"confirm": "Xác Nhận",
|
||||
"cancel": "Hủy Bỏ",
|
||||
"confirmBeforeSubmit": "Vui lòng xác nhận trước khi gửi"
|
||||
},
|
||||
"emergency": {
|
||||
"common": {
|
||||
"status": "Trạng thái",
|
||||
"search": "Tìm kiếm",
|
||||
"operation": "Thao tác",
|
||||
"operationSuccess": "Thao tác thành công",
|
||||
"edit": "Sửa",
|
||||
"delete": "Xóa",
|
||||
"confirmDelete": "Xác nhận xóa?",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"complete": "Hoàn thành",
|
||||
"completed": "Đã hoàn thành",
|
||||
"deleted": "Đã xóa",
|
||||
"submit": "Gửi"
|
||||
},
|
||||
"triage": {
|
||||
"title": "Quản lý phân loại cấp cứu",
|
||||
"levelRange": "Mức I-V",
|
||||
"inTreatment": "Đang khám",
|
||||
"todayTotal": "Tổng hôm nay",
|
||||
"refresh": "Làm mới",
|
||||
"patientName": "Tên bệnh nhân",
|
||||
"triageLevel": "Mức phân loại",
|
||||
"statusWaiting": "Chờ khám",
|
||||
"statusInTreatment": "Đang khám",
|
||||
"statusCompleted": "Đã hoàn thành",
|
||||
"addTriage": "Thêm phân loại",
|
||||
"editTriage": "Sửa phân loại",
|
||||
"patient": "Bệnh nhân",
|
||||
"level": "Mức",
|
||||
"chiefComplaint": "Triệu chứng chính",
|
||||
"temperature": "Nhiệt độ",
|
||||
"pulse": "Mạch",
|
||||
"systolicBp": "Huyết áp tâm thu",
|
||||
"spo2": "SpO2",
|
||||
"consciousness": "Ý thức",
|
||||
"area": "Khu vực",
|
||||
"nurse": "Điều dưỡng phân loại",
|
||||
"callNumber": "Gọi số",
|
||||
"patientId": "Mã BN",
|
||||
"level1": "Mức I Nguy kịch",
|
||||
"level2": "Mức II Nghiêm trọng",
|
||||
"level3": "Mức III Cấp cứu",
|
||||
"level4": "Mức IV Bán cấp",
|
||||
"level5": "Mức V Không khẩn cấp",
|
||||
"chiefComplaintPlaceholder": "Mô tả triệu chứng chính",
|
||||
"respiration": "Hô hấp",
|
||||
"diastolicBp": "Huyết áp tâm trương",
|
||||
"consciousnessState": "Trạng thái ý thức",
|
||||
"consciousAwake": "Tỉnh",
|
||||
"consciousDrowsy": "Buồn ngủ",
|
||||
"consciousComa": "Hôn mê",
|
||||
"triageArea": "Khu phân loại",
|
||||
"areaRescue": "Khu cấp cứu",
|
||||
"areaObservation": "Khu theo dõi",
|
||||
"areaConsultRoom": "Phòng khám",
|
||||
"areaGeneral": "Khu thường",
|
||||
"called": "Đã gọi"
|
||||
},
|
||||
"rescue": {
|
||||
"title": "Quản lý cấp cứu",
|
||||
"chiefDoctor": "Bác sĩ chính",
|
||||
"rescueResult": "Kết quả cấp cứu",
|
||||
"resultSuccess": "Thành công",
|
||||
"resultFailed": "Thất bại",
|
||||
"resultInProgress": "Đang tiến hành",
|
||||
"startRescue": "Bắt đầu cấp cứu",
|
||||
"editRecord": "Sửa hồ sơ cấp cứu",
|
||||
"patientId": "Mã BN",
|
||||
"triageId": "Mã phân loại",
|
||||
"startTime": "Thời gian bắt đầu",
|
||||
"endTime": "Thời gian kết thúc",
|
||||
"rescueTeam": "Đội cấp cứu",
|
||||
"procedures": "Thủ thuật",
|
||||
"medications": "Thuốc",
|
||||
"result": "Kết quả",
|
||||
"endRescue": "Kết thúc cấp cứu",
|
||||
"recordResult": "Ghi nhận kết quả",
|
||||
"recordResultTitle": "Ghi nhận kết quả cấp cứu",
|
||||
"outcome": "Tiên lượng",
|
||||
"outcomePlaceholder": "Tiên lượng bệnh nhân",
|
||||
"teamMembers": "Thành viên đội",
|
||||
"proceduresPlaceholder": "Ghi nhận thủ thuật",
|
||||
"medicationsPlaceholder": "Ghi nhận thuốc",
|
||||
"rescueEnded": "Đã kết thúc cấp cứu",
|
||||
"resultRecorded": "Đã ghi nhận kết quả"
|
||||
},
|
||||
"observation": {
|
||||
"title": "Quản lý theo dõi cấp cứu",
|
||||
"doctor": "Bác sĩ",
|
||||
"bedNo": "Số giường",
|
||||
"disposition": "Tiên lượng",
|
||||
"dispAdmit": "Nhập viện",
|
||||
"dispDischarge": "Xuất viện",
|
||||
"dispTransfer": "Chuyển khoa",
|
||||
"dispDeath": "Tử vong",
|
||||
"addObservation": "Thêm theo dõi",
|
||||
"editObservation": "Sửa theo dõi",
|
||||
"patientId": "Mã BN",
|
||||
"bed": "Giường",
|
||||
"doctorLabel": "Bác sĩ",
|
||||
"diagnosis": "Chẩn đoán",
|
||||
"startTime": "Thời gian bắt đầu",
|
||||
"endTime": "Thời gian kết thúc",
|
||||
"duration": "Thời gian theo dõi(h)",
|
||||
"observing": "Đang theo dõi",
|
||||
"dischargeAction": "Xuất viện/Tiên lượng",
|
||||
"dischargeTitle": "Xuất viện/Tiên lượng",
|
||||
"bedNoLabel": "Số giường",
|
||||
"discharged": "Đã xuất viện/ghi nhận tiên lượng"
|
||||
},
|
||||
"greentrack": {
|
||||
"title": "Quản lý luồng xanh",
|
||||
"totalCases": "Tổng số ca",
|
||||
"achievedCases": "Ca đạt chuẩn",
|
||||
"achievementRate": "Tỷ lệ đạt",
|
||||
"avgDoorToTx": "Thời gian Door-to-Tx TB",
|
||||
"refreshStats": "Làm mới thống kê",
|
||||
"diseaseType": "Loại bệnh",
|
||||
"isAchieved": "Đạt chuẩn?",
|
||||
"achieved": "Đạt",
|
||||
"notAchieved": "Chưa đạt",
|
||||
"activate": "Kích hoạt luồng xanh",
|
||||
"patientId": "Mã BN",
|
||||
"doorToTx": "Door-to-Tx(phút)",
|
||||
"targetTime": "Thời gian mục tiêu(phút)",
|
||||
"achievedLabel": "Đạt chuẩn",
|
||||
"pendingEvaluation": "Chờ đánh giá",
|
||||
"activateTime": "Thời gian kích hoạt",
|
||||
"completeTime": "Thời gian hoàn thành",
|
||||
"completeEvaluation": "Hoàn thành đánh giá",
|
||||
"activateTitle": "Kích hoạt luồng xanh",
|
||||
"diseaseTypePlaceholder": "VD: Nhồi máu cơ tim, Đột quỵ",
|
||||
"targetTimeLabel": "Thời gian mục tiêu(phút)",
|
||||
"activateBtn": "Kích hoạt",
|
||||
"completeEvaluationTitle": "Hoàn thành đánh giá",
|
||||
"doorToTxLabel": "Door-to-Tx(phút)",
|
||||
"selectPatient": "Vui lòng chọn bệnh nhân",
|
||||
"activated": "Đã kích hoạt luồng xanh",
|
||||
"evaluationComplete": "Đã hoàn thành đánh giá"
|
||||
}
|
||||
},
|
||||
"infection": {
|
||||
"case": {
|
||||
"title": "Giám sát ca nhiễm trùng",
|
||||
"patientName": "Tên bệnh nhân",
|
||||
"infectionType": "Loại nhiễm trùng",
|
||||
"nosocomial": "Nhiễm trùng bệnh viện",
|
||||
"community": "Nhiễm trùng cộng đồng",
|
||||
"status": "Trạng thái",
|
||||
"reported": "Đã báo cáo",
|
||||
"confirmed": "Đã xác nhận",
|
||||
"rejected": "Đã từ chối",
|
||||
"query": "Tìm kiếm",
|
||||
"patient": "Bệnh nhân",
|
||||
"type": "Loại",
|
||||
"infectionSite": "Vị trí nhiễm trùng",
|
||||
"pathogen": "Tác nhân gây bệnh",
|
||||
"reporter": "Người báo cáo",
|
||||
"reportTime": "Thời gian báo cáo",
|
||||
"statusCol": "Trạng thái",
|
||||
"reviewResult": "Kết quả duyệt"
|
||||
},
|
||||
"warning": {
|
||||
"title": "Cảnh báo dịch bệnh",
|
||||
"refresh": "Làm mới",
|
||||
"addWarning": "Thêm cảnh báo",
|
||||
"level1": "Cảnh báo cấp 1",
|
||||
"level2": "Cảnh báo cấp 2",
|
||||
"level3": "Cảnh báo cấp 3",
|
||||
"totalWarnings": "Tổng cảnh báo",
|
||||
"warningLevel": "Mức cảnh báo",
|
||||
"diseaseType": "Loại bệnh",
|
||||
"respiratory": "Bệnh hô hấp",
|
||||
"intestinal": "Bệnh đường ruột",
|
||||
"blood": "Bệnh qua đường máu",
|
||||
"vector": "Bệnh qua trung gian",
|
||||
"other": "Khác",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"diseaseName": "Tên bệnh",
|
||||
"caseCount": "Số ca",
|
||||
"threshold": "Ngưỡng",
|
||||
"affectedArea": "Khu vực ảnh hưởng",
|
||||
"department": "Khoa báo cáo",
|
||||
"reporter": "Người báo cáo",
|
||||
"warningTime": "Thời gian cảnh báo",
|
||||
"addDialogTitle": "Thêm cảnh báo dịch bệnh",
|
||||
"diseaseNamePlaceholder": "Nhập tên bệnh",
|
||||
"pleaseSelect": "Vui lòng chọn",
|
||||
"affectedAreaPlaceholder": "Nhập khu vực ảnh hưởng",
|
||||
"departmentPlaceholder": "Nhập khoa báo cáo",
|
||||
"detailInfo": "Chi tiết: ",
|
||||
"level1Short": "C1",
|
||||
"level2Short": "C2",
|
||||
"level3Short": "C3",
|
||||
"addSuccess": "Thêm thành công"
|
||||
},
|
||||
"outbreak": {
|
||||
"title": "Cảnh báo bùng phát",
|
||||
"ruleConfig": "Cấu hình quy tắc cảnh báo",
|
||||
"checkDays": "Số ngày kiểm tra",
|
||||
"yellowThreshold": "Ngưỡng vàng",
|
||||
"redThreshold": "Ngưỡng đỏ",
|
||||
"executeCheck": "Thực hiện kiểm tra",
|
||||
"checkResult": "Tổng quan kết quả",
|
||||
"recentCases": "Ca bệnh gần đây",
|
||||
"newWarnings": "Cảnh báo mới",
|
||||
"checkTime": "Thời gian kiểm tra",
|
||||
"warningList": "Danh sách cảnh báo",
|
||||
"refresh": "Làm mới",
|
||||
"warningLevel": "Mức cảnh báo",
|
||||
"yellowWarning": "Cảnh báo vàng",
|
||||
"redWarning": "Cảnh báo đỏ",
|
||||
"status": "Trạng thái",
|
||||
"statusPending": "Chờ xử lý",
|
||||
"statusProcessing": "Đang xử lý",
|
||||
"statusHandled": "Đã xử lý",
|
||||
"statusExcluded": "Đã loại trừ",
|
||||
"infectionType": "Loại nhiễm khuẩn",
|
||||
"department": "Khoa",
|
||||
"caseCount": "Số ca",
|
||||
"threshold": "Ngưỡng",
|
||||
"checkDaysCol": "Số ngày kiểm tra",
|
||||
"statusCol": "Trạng thái",
|
||||
"handler": "Người xử lý",
|
||||
"handleResult": "Kết quả xử lý",
|
||||
"warningTime": "Thời gian cảnh báo",
|
||||
"action": "Thao tác",
|
||||
"process": "Xử lý",
|
||||
"exclude": "Loại trừ",
|
||||
"processDialogTitle": "Xử lý cảnh báo",
|
||||
"handleResultPlaceholder": "Nhập kết quả xử lý",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"checkSuccess": "Kiểm tra hoàn tất, {count} cảnh báo mới",
|
||||
"checkFailed": "Kiểm tra thất bại: ",
|
||||
"enterHandleResult": "Vui lòng nhập kết quả xử lý",
|
||||
"processSuccess": "Xử lý thành công",
|
||||
"processFailed": "Xử lý thất bại",
|
||||
"confirmExclude": "Xác nhận loại trừ cảnh báo này?",
|
||||
"tip": "Mẹo",
|
||||
"falseReportExclude": "Loại trừ báo cáo sai",
|
||||
"excluded": "Đã loại trừ",
|
||||
"operationFailed": "Thao tác thất bại",
|
||||
"unknown": "Không xác định",
|
||||
"unknownError": "Lỗi không xác định"
|
||||
},
|
||||
"surveillance": {
|
||||
"title": "Giám sát mục tiêu",
|
||||
"refresh": "Làm mới",
|
||||
"addMonitor": "Thêm giám sát",
|
||||
"exportReport": "Xuất báo cáo",
|
||||
"statTotal": "Tổng giám sát",
|
||||
"statICU": "Nhiễm ICU",
|
||||
"statSSI": "SSI",
|
||||
"statCLABSI": "CLABSI",
|
||||
"statVAP": "VAP",
|
||||
"statAvgRate": "TB tỷ lệ nhiễm",
|
||||
"surveillanceType": "Loại giám sát",
|
||||
"typeICU": "Nhiễm ICU",
|
||||
"typeSSI": "Nhiễm vết mổ(SSI)",
|
||||
"typeCLABSI": "CLABSI",
|
||||
"typeVAP": "Viêm phổi(VAP)",
|
||||
"typeCAUTI": "CAUTI",
|
||||
"typeMDR": "Giám sát đa kháng",
|
||||
"status": "Trạng thái",
|
||||
"statusOngoing": "Đang tiến hành",
|
||||
"statusCompleted": "Hoàn thành",
|
||||
"statusPaused": "Tạm dừng",
|
||||
"startDate": "Ngày bắt đầu",
|
||||
"endDate": "Ngày kết thúc",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"monitorDept": "Khoa",
|
||||
"monitorCount": "Số bệnh nhân",
|
||||
"infectionCount": "Số ca nhiễm",
|
||||
"infectionRate": "Tỷ lệ nhiễm",
|
||||
"deviceUsageRate": "Tỷ lệ sử dụng thiết bị",
|
||||
"monitorPeriod": "Chu kỳ",
|
||||
"remark": "Ghi chú",
|
||||
"detail": "Chi tiết",
|
||||
"addDialogTitle": "Thêm giám sát",
|
||||
"monitorTypeLabel": "Loại",
|
||||
"deptPlaceholder": "Nhập khoa",
|
||||
"countLabel": "Số bệnh nhân",
|
||||
"infectionLabel": "Số ca nhiễm",
|
||||
"deviceLabel": "Tỷ lệ sử dụng TB(%)",
|
||||
"periodLabel": "Chu kỳ",
|
||||
"periodPlaceholder": "VD: 2026-01-01 ~ 2026-06-30",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"addSuccess": "Thêm thành công",
|
||||
"exportInfo": "Chức năng xuất đang phát triển",
|
||||
"typeICUShort": "ICU",
|
||||
"typeSSIShort": "SSI",
|
||||
"typeCLABSIShort": "CLABSI",
|
||||
"typeVAPShort": "VAP",
|
||||
"typeCAUTIShort": "CAUTI",
|
||||
"typeMDRShort": "MDR",
|
||||
"detailInfo": "Chi tiết: "
|
||||
},
|
||||
"hygiene": {
|
||||
"title": "Quản lý vệ sinh tay",
|
||||
"refresh": "Làm mới",
|
||||
"addRecord": "Thêm bản ghi",
|
||||
"viewStats": "Xem thống kê",
|
||||
"statTotal": "Tổng quan sát",
|
||||
"statCompliant": "Tuân thủ",
|
||||
"statNonCompliant": "Không tuân thủ",
|
||||
"statRate": "Tỷ lệ tuân thủ",
|
||||
"statDepts": "Số khoa",
|
||||
"statPassRate": "Tỷ lệ đạt",
|
||||
"department": "Khoa",
|
||||
"complianceType": "Tuân thủ",
|
||||
"compliant": "Tuân thủ",
|
||||
"nonCompliant": "Không tuân thủ",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"staffName": "Nhân viên",
|
||||
"handwashType": "Loại rửa tay",
|
||||
"observationTime": "Thời gian quan sát",
|
||||
"opportunities": "Cơ hội vệ sinh tay",
|
||||
"compliantCount": "Số lần tuân thủ",
|
||||
"recordTime": "Thời gian ghi nhận",
|
||||
"addDialogTitle": "Thêm bản ghi vệ sinh tay",
|
||||
"deptPlaceholder": "Nhập khoa",
|
||||
"namePlaceholder": "Nhập họ tên",
|
||||
"soap": "Xà phòng",
|
||||
"sanitizer": "Dung dịch sát khuẩn",
|
||||
"surgical": "Sát khuẩn tay phẫu thuật",
|
||||
"opportunityPlaceholder": "VD: Trước khi tiếp xúc bệnh nhân",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"statsTitle": "Thống kê vệ sinh tay",
|
||||
"statsTotal": "Tổng quan sát",
|
||||
"statsCompliant": "Số lần tuân thủ",
|
||||
"statsRate": "Tỷ lệ tuân thủ",
|
||||
"statsNonCompliant": "Số lần không tuân thủ",
|
||||
"close": "Đóng",
|
||||
"addSuccess": "Thêm thành công"
|
||||
},
|
||||
"resistant": {
|
||||
"title": "Giám sát vi khuẩn đa kháng",
|
||||
"refresh": "Làm mới",
|
||||
"addRecord": "Thêm bản ghi",
|
||||
"statDetected": "Phát hiện",
|
||||
"statIsolated": "Đã cách ly",
|
||||
"statIsolationRate": "Tỷ lệ cách ly",
|
||||
"statCureRate": "Tỷ lệ khỏi",
|
||||
"bacteriaType": "Loại vi khuẩn",
|
||||
"mdrPsa": "MDR Pseudomonas",
|
||||
"isolationStatus": "Trạng thái cách ly",
|
||||
"isolated": "Đã cách ly",
|
||||
"released": "Đã giải phóng",
|
||||
"notIsolated": "Chưa cách ly",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"patient": "Bệnh nhân",
|
||||
"department": "Khoa",
|
||||
"sampleType": "Loại mẫu",
|
||||
"isolationDate": "Ngày cách ly",
|
||||
"releaseDate": "Ngày giải phóng",
|
||||
"antibioticUsage": "Sử dụng kháng sinh",
|
||||
"reportTime": "Thời gian báo cáo",
|
||||
"addDialogTitle": "Thêm bản ghi vi khuẩn đa kháng",
|
||||
"patientPlaceholder": "Nhập tên bệnh nhân",
|
||||
"selectPlaceholder": "Vui lòng chọn",
|
||||
"deptPlaceholder": "Nhập khoa",
|
||||
"samplePlaceholder": "VD: Đờm, Máu, Nước tiểu",
|
||||
"antibioticPlaceholder": "Nhập tình trạng sử dụng kháng sinh",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"addSuccess": "Thêm thành công"
|
||||
},
|
||||
"exposure": {
|
||||
"title": "Quản lý phơi nhiễm nghề nghiệp",
|
||||
"refresh": "Làm mới",
|
||||
"addReport": "Thêm báo cáo",
|
||||
"totalExposure": "Tổng phơi nhiễm",
|
||||
"bloodExposure": "Phơi nhiễm máu",
|
||||
"bodyFluidExposure": "Phơi nhiễm dịch cơ thể",
|
||||
"followupRate": "Tỷ lệ theo dõi",
|
||||
"exposureType": "Loại phơi nhiễm",
|
||||
"needleStick": "Kim đâm",
|
||||
"chemicalExposure": "Phơi nhiễm hóa chất",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"staffName": "Nhân viên phơi nhiễm",
|
||||
"department": "Khoa",
|
||||
"exposureSource": "Nguồn phơi nhiễm",
|
||||
"exposureDate": "Thời gian phơi nhiễm",
|
||||
"exposureSite": "Vị trí phơi nhiễm",
|
||||
"exposureLevel": "Mức độ phơi nhiễm",
|
||||
"status": "Trạng thái",
|
||||
"statusCompleted": "Hoàn thành",
|
||||
"statusInProgress": "Đang xử lý",
|
||||
"statusPending": "Chờ xử lý",
|
||||
"reportTime": "Thời gian báo cáo",
|
||||
"addDialogTitle": "Thêm báo cáo phơi nhiễm nghề nghiệp",
|
||||
"placeholderName": "Nhập họ tên",
|
||||
"placeholderDept": "Nhập khoa",
|
||||
"placeholderSelect": "Vui lòng chọn",
|
||||
"placeholderSource": "VD: Máu bệnh nhân dương tính HIV",
|
||||
"placeholderSite": "VD: Ngón trỏ tay trái",
|
||||
"levelLight": "Nhẹ",
|
||||
"levelMedium": "Trung bình",
|
||||
"levelHeavy": "Nặng",
|
||||
"treatment": "Biện pháp xử lý",
|
||||
"placeholderTreatment": "Nhập biện pháp xử lý",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"addSuccess": "Thêm thành công"
|
||||
},
|
||||
"environment": {
|
||||
"title": "Giám sát môi trường",
|
||||
"refresh": "Làm mới",
|
||||
"addMonitor": "Thêm giám sát",
|
||||
"viewRate": "Xem tỷ lệ đạt",
|
||||
"sampleType": "Loại mẫu",
|
||||
"sampleAir": "Không khí",
|
||||
"sampleSurface": "Bề mặt",
|
||||
"sampleHand": "Mẫu tay",
|
||||
"sampleDisinfectant": "Dung dịch khử trùng",
|
||||
"sampleDevice": "Thiết bị y tế",
|
||||
"monitorResult": "Kết quả",
|
||||
"qualified": "Đạt",
|
||||
"unqualified": "Không đạt",
|
||||
"query": "Tìm kiếm",
|
||||
"reset": "Đặt lại",
|
||||
"sampleLocation": "Địa điểm lấy mẫu",
|
||||
"sampleDate": "Ngày lấy mẫu",
|
||||
"bacterialCount": "Số lượng vi khuẩn (CFU)",
|
||||
"standardLimit": "Giới hạn chuẩn",
|
||||
"exceedRate": "Tỷ lệ vượt",
|
||||
"monitorPerson": "Người giám sát",
|
||||
"recordTime": "Thời gian ghi nhận",
|
||||
"addDialogTitle": "Thêm giám sát môi trường",
|
||||
"placeholderSelect": "Vui lòng chọn",
|
||||
"placeholderLocation": "Nhập địa điểm lấy mẫu",
|
||||
"placeholderDate": "Chọn ngày",
|
||||
"placeholderPerson": "Nhập tên người giám sát",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"rateDialogTitle": "Thống kê tỷ lệ đạt giám sát môi trường",
|
||||
"rateTotal": "Tổng giám sát",
|
||||
"rateQualified": "Đạt",
|
||||
"rateUnqualified": "Không đạt",
|
||||
"ratePercent": "Tỷ lệ đạt",
|
||||
"close": "Đóng",
|
||||
"addSuccess": "Thêm thành công",
|
||||
"cardTotal": "Tổng giám sát",
|
||||
"cardQualified": "Đạt",
|
||||
"cardUnqualified": "Không đạt",
|
||||
"cardRate": "Tỷ lệ đạt",
|
||||
"cardTypes": "Loại mẫu",
|
||||
"cardAvgBacterial": "TB vi khuẩn"
|
||||
},
|
||||
"detail": {
|
||||
"title": "Thống kê giám sát nhiễm trùng",
|
||||
"queryConditions": "Điều kiện truy vấn",
|
||||
"department": "Khoa",
|
||||
"deptId": "Mã khoa",
|
||||
"startDate": "Ngày bắt đầu",
|
||||
"endDate": "Ngày kết thúc",
|
||||
"query": "Tìm kiếm",
|
||||
"totalCases": "Tổng số ca",
|
||||
"reported": "Đã báo cáo",
|
||||
"confirmed": "Đã xác nhận",
|
||||
"infectionRate": "Tỷ lệ nhiễm trùng",
|
||||
"byType": "Phân loại theo loại nhiễm trùng",
|
||||
"infectionType": "Loại nhiễm trùng",
|
||||
"caseCount": "Số ca",
|
||||
"bySite": "Phân loại theo vị trí nhiễm trùng",
|
||||
"infectionSite": "Vị trí nhiễm trùng",
|
||||
"trend": "Xu hướng nhiễm trùng",
|
||||
"date": "Ngày",
|
||||
"total": "Tổng",
|
||||
"rejected": "Đã từ chối",
|
||||
"loadFailed": "Tải thất bại",
|
||||
"unknownError": "Lỗi không xác định"
|
||||
},
|
||||
"screening": {
|
||||
"title": "Sàng lọc tự động ca nhiễm trùng",
|
||||
"ruleConfig": "Cấu hình quy tắc sàng lọc",
|
||||
"startDate": "Ngày bắt đầu",
|
||||
"endDate": "Ngày kết thúc",
|
||||
"placeholderStartDate": "Chọn ngày bắt đầu",
|
||||
"placeholderEndDate": "Chọn ngày kết thúc",
|
||||
"infectionType": "Loại nhiễm trùng",
|
||||
"all": "Tất cả",
|
||||
"hospitalInfection": "Nhiễm trùng bệnh viện",
|
||||
"communityInfection": "Nhiễm trùng cộng đồng",
|
||||
"minDays": "Ngưỡng số ngày nhập viện",
|
||||
"runScreening": "Chạy sàng lọc",
|
||||
"resultOverview": "Tổng quan kết quả sàng lọc",
|
||||
"screenedCount": "Số ca sàng lọc",
|
||||
"suspectedCount": "Số ca nghi ngờ",
|
||||
"screenTime": "Thời gian sàng lọc",
|
||||
"resultList": "Danh sách kết quả sàng lọc",
|
||||
"refresh": "Làm mới",
|
||||
"patientName": "Tên bệnh nhân",
|
||||
"infectionSite": "Vị trí nhiễm trùng",
|
||||
"pathogen": "Tác nhân gây bệnh",
|
||||
"diagnosisDate": "Ngày chẩn đoán",
|
||||
"reportTime": "Thời gian báo cáo",
|
||||
"status": "Trạng thái",
|
||||
"statusReported": "Đã báo cáo",
|
||||
"statusReviewed": "Đã duyệt",
|
||||
"statusConfirmed": "Đã xác nhận",
|
||||
"statusRejected": "Đã từ chối",
|
||||
"reviewResult": "Kết quả duyệt",
|
||||
"confirmed": "Xác nhận",
|
||||
"rejected": "Từ chối",
|
||||
"screeningDone": "Sàng lọc hoàn tất",
|
||||
"screeningFailed": "Sàng lọc thất bại",
|
||||
"unknownError": "Lỗi không xác định"
|
||||
},
|
||||
"antibiotic": {
|
||||
"title": "Quản lý sử dụng kháng sinh",
|
||||
"patientName": "Tên bệnh nhân",
|
||||
"medicalNo": "Số bệnh án",
|
||||
"drugName": "Tên kháng sinh",
|
||||
"dosage": "Liều lượng",
|
||||
"usage": "Cách dùng",
|
||||
"course": "Liệu trình (Ngày)",
|
||||
"level": "Cấp bậc kháng sinh",
|
||||
"indication": "Chỉ định",
|
||||
"doctorName": "Bác sĩ kê đơn",
|
||||
"department": "Khoa",
|
||||
"useDate": "Ngày sử dụng"
|
||||
},
|
||||
"enhanced": {
|
||||
"title": "Quản lý nhiễm khuẩn tăng cường",
|
||||
"outbreakTab": "Cảnh báo bùng phát",
|
||||
"surveillanceTab": "Giám sát mục tiêu",
|
||||
"handHygieneTab": "Giám sát vệ sinh tay",
|
||||
"mdrTab": "Vi khuẩn đa kháng",
|
||||
"envMonitorTab": "Giám sát môi trường",
|
||||
"addWarning": "Thêm cảnh báo",
|
||||
"addMonitor": "Thêm giám sát",
|
||||
"addRecord": "Thêm bản ghi",
|
||||
"department": "Khoa",
|
||||
"infectionType": "Loại nhiễm khuẩn",
|
||||
"caseCount": "Số ca",
|
||||
"warningLevel": "Mức cảnh báo",
|
||||
"redWarning": "Đỏ",
|
||||
"yellowWarning": "Vàng",
|
||||
"status": "Trạng thái",
|
||||
"statusPending": "Chờ xử lý",
|
||||
"statusProcessing": "Đang xử lý",
|
||||
"statusProcessed": "Đã xử lý",
|
||||
"statusExcluded": "Đã loại trừ",
|
||||
"warningTime": "Thời gian cảnh báo",
|
||||
"operation": "Thao tác",
|
||||
"handle": "Xử lý",
|
||||
"exclude": "Loại trừ",
|
||||
"monitorType": "Loại giám sát",
|
||||
"icuMonitor": "Giám sát ICU",
|
||||
"surgicalSite": "Vị trí phẫu thuật",
|
||||
"catheterRelated": "Liên quan catheter",
|
||||
"other": "Khác",
|
||||
"unknown": "Không xác định",
|
||||
"monitorObject": "Đối tượng giám sát",
|
||||
"totalCases": "Tổng số ca",
|
||||
"infectionCases": "Số ca nhiễm",
|
||||
"infectionRate": "Tỷ lệ nhiễm",
|
||||
"startDate": "Ngày bắt đầu",
|
||||
"totalObserve": "Tổng lượt quan sát",
|
||||
"totalComply": "Tổng lượt tuân thủ",
|
||||
"overallRate": "Tỷ lệ tuân thủ chung",
|
||||
"monitorDate": "Ngày giám sát",
|
||||
"observeCount": "Số lượt quan sát",
|
||||
"complyCount": "Số lượt tuân thủ",
|
||||
"complyRate": "Tỷ lệ tuân thủ",
|
||||
"observer": "Người quan sát",
|
||||
"patient": "Bệnh nhân",
|
||||
"bacteriaName": "Vi khuẩn",
|
||||
"resistanceType": "Loại kháng thuốc",
|
||||
"specimenType": "Loại mẫu bệnh phẩm",
|
||||
"isolationStatus": "Trạng thái cách ly",
|
||||
"notIsolated": "Chưa cách ly",
|
||||
"isolated": "Đã cách ly",
|
||||
"released": "Đã giải phóng",
|
||||
"reportDate": "Ngày báo cáo",
|
||||
"isolate": "Cách ly",
|
||||
"release": "Giải phóng",
|
||||
"monitorItem": "Hạng mục giám sát",
|
||||
"standardValue": "Giá trị chuẩn",
|
||||
"actualValue": "Giá trị đo",
|
||||
"result": "Kết quả",
|
||||
"tester": "Người kiểm tra",
|
||||
"envAir": "Không khí",
|
||||
"envSurface": "Bề mặt",
|
||||
"envHand": "Tay",
|
||||
"envDisinfectant": "Dung dịch khử trùng",
|
||||
"envSterile": "Vật tư vô trùng",
|
||||
"qualified": "Đạt",
|
||||
"unqualified": "Không đạt",
|
||||
"addOutbreakWarning": "Thêm cảnh báo bùng phát",
|
||||
"addHandHygiene": "Thêm giám sát vệ sinh tay",
|
||||
"addMdrRecord": "Thêm bản ghi vi khuẩn đa kháng",
|
||||
"addEnvMonitor": "Thêm giám sát môi trường",
|
||||
"patientName": "Tên bệnh nhân",
|
||||
"bacteriaNameLabel": "Tên vi khuẩn",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác nhận",
|
||||
"promptHandleResult": "Vui lòng nhập kết quả xử lý",
|
||||
"handleWarning": "Xử lý cảnh báo",
|
||||
"handleSuccess": "Xử lý thành công",
|
||||
"confirmExclude": "Xác nhận loại trừ cảnh báo này?",
|
||||
"excluded": "Đã loại trừ",
|
||||
"confirmIsolate": "Xác nhận đánh dấu cách ly?",
|
||||
"confirmIsolateTitle": "Xác nhận cách ly",
|
||||
"confirmRelease": "Xác nhận giải phóng cách ly?",
|
||||
"confirmReleaseTitle": "Xác nhận giải phóng",
|
||||
"addSuccess": "Thêm thành công"
|
||||
}
|
||||
},
|
||||
"auditlog": {
|
||||
"title": "Nhật ký kiểm toán",
|
||||
"userName": "Người dùng",
|
||||
"module": "Mô-đun",
|
||||
"action": "Hành động",
|
||||
"method": "Phương thức",
|
||||
"result": "Kết quả",
|
||||
"resultSuccess": "Thành công",
|
||||
"resultFail": "Thất bại",
|
||||
"query": "Tìm kiếm",
|
||||
"durationMs": "Thời gian(ms)",
|
||||
"time": "Thời gian",
|
||||
"operation": "Thao tác",
|
||||
"confirmDelete": "Xác nhận xóa?",
|
||||
"delete": "Xóa",
|
||||
"deleted": "Đã xóa",
|
||||
"detailTitle": "Chi tiết nhật ký kiểm toán",
|
||||
"duration": "Thời lượng",
|
||||
"params": "Tham số",
|
||||
"error": "Lỗi",
|
||||
"riskLow": "Thấp",
|
||||
"riskMedium": "Trung bình",
|
||||
"riskHigh": "Cao",
|
||||
"riskCritical": "Nghiêm trọng",
|
||||
"unknown": "Không xác định",
|
||||
"businessLogin": "Đăng nhập",
|
||||
"businessLogout": "Đăng xuất",
|
||||
"businessQuery": "Truy vấn",
|
||||
"businessInsert": "Thêm mới",
|
||||
"businessUpdate": "Cập nhật",
|
||||
"businessDelete": "Xóa",
|
||||
"businessExport": "Xuất",
|
||||
"enhanced": {
|
||||
"title": "Quản lý nhật ký kiểm toán",
|
||||
"hideStats": "Ẩn thống kê",
|
||||
"showStats": "Xem thống kê",
|
||||
"auditStats": "Thống kê kiểm toán",
|
||||
"totalLogs": "Tổng số nhật ký",
|
||||
"highRiskOps": "Thao tác rủi ro cao",
|
||||
"criticalRisk": "Rủi ro nghiêm trọng",
|
||||
"byModule": "Theo mô-đun",
|
||||
"byRiskLevel": "Theo mức độ rủi ro",
|
||||
"riskLevel": "Mức độ rủi ro",
|
||||
"businessType": "Loại nghiệp vụ",
|
||||
"dateRangeSep": "đến",
|
||||
"startDate": "Ngày bắt đầu",
|
||||
"endDate": "Ngày kết thúc",
|
||||
"reset": "Đặt lại",
|
||||
"detail": "Chi tiết",
|
||||
"tenant": "Thuê bao",
|
||||
"department": "Khoa",
|
||||
"userAgent": "User Agent"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4023,5 +4023,679 @@
|
||||
"confirm": "确 定",
|
||||
"cancel": "取 消",
|
||||
"confirmBeforeSubmit": "请确认后再提交"
|
||||
},
|
||||
"emergency": {
|
||||
"common": {
|
||||
"status": "状态",
|
||||
"search": "查询",
|
||||
"operation": "操作",
|
||||
"operationSuccess": "操作成功",
|
||||
"edit": "编辑",
|
||||
"delete": "删除",
|
||||
"confirmDelete": "确定删除?",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"complete": "完成",
|
||||
"completed": "已完成",
|
||||
"deleted": "已删除",
|
||||
"submit": "提交"
|
||||
},
|
||||
"triage": {
|
||||
"title": "急诊分诊管理",
|
||||
"levelRange": "Ⅰ~Ⅴ级",
|
||||
"inTreatment": "就诊中",
|
||||
"todayTotal": "今日总量",
|
||||
"refresh": "刷新",
|
||||
"patientName": "患者姓名",
|
||||
"triageLevel": "分诊级别",
|
||||
"statusWaiting": "待诊",
|
||||
"statusInTreatment": "就诊中",
|
||||
"statusCompleted": "已完成",
|
||||
"addTriage": "新增分诊",
|
||||
"editTriage": "编辑分诊",
|
||||
"patient": "患者",
|
||||
"level": "级别",
|
||||
"chiefComplaint": "主诉",
|
||||
"temperature": "体温",
|
||||
"pulse": "脉搏",
|
||||
"systolicBp": "收缩压",
|
||||
"spo2": "血氧",
|
||||
"consciousness": "意识",
|
||||
"area": "区域",
|
||||
"nurse": "分诊护士",
|
||||
"callNumber": "叫号",
|
||||
"patientId": "患者ID",
|
||||
"level1": "Ⅰ级 濒死",
|
||||
"level2": "Ⅱ级 危重",
|
||||
"level3": "Ⅲ级 急症",
|
||||
"level4": "Ⅳ级 亚急",
|
||||
"level5": "Ⅴ级 非紧急",
|
||||
"chiefComplaintPlaceholder": "主要症状描述",
|
||||
"respiration": "呼吸",
|
||||
"diastolicBp": "舒张压",
|
||||
"consciousnessState": "意识状态",
|
||||
"consciousAwake": "清醒",
|
||||
"consciousDrowsy": "嗜睡",
|
||||
"consciousComa": "昏迷",
|
||||
"triageArea": "分诊区域",
|
||||
"areaRescue": "抢救区",
|
||||
"areaObservation": "留观区",
|
||||
"areaConsultRoom": "诊室",
|
||||
"areaGeneral": "普通区",
|
||||
"called": "已叫号"
|
||||
},
|
||||
"rescue": {
|
||||
"title": "抢救管理",
|
||||
"chiefDoctor": "主任医师",
|
||||
"rescueResult": "抢救结果",
|
||||
"resultSuccess": "成功",
|
||||
"resultFailed": "失败",
|
||||
"resultInProgress": "进行中",
|
||||
"startRescue": "开始抢救",
|
||||
"editRecord": "编辑抢救记录",
|
||||
"patientId": "患者ID",
|
||||
"triageId": "分诊ID",
|
||||
"startTime": "开始时间",
|
||||
"endTime": "结束时间",
|
||||
"rescueTeam": "抢救团队",
|
||||
"procedures": "抢救操作",
|
||||
"medications": "用药",
|
||||
"result": "结果",
|
||||
"endRescue": "结束抢救",
|
||||
"recordResult": "记录结果",
|
||||
"recordResultTitle": "记录抢救结果",
|
||||
"outcome": "转归",
|
||||
"outcomePlaceholder": "患者转归",
|
||||
"teamMembers": "团队成员",
|
||||
"proceduresPlaceholder": "操作记录",
|
||||
"medicationsPlaceholder": "用药记录",
|
||||
"rescueEnded": "抢救已结束",
|
||||
"resultRecorded": "结果已记录"
|
||||
},
|
||||
"observation": {
|
||||
"title": "急诊留观管理",
|
||||
"doctor": "医生",
|
||||
"bedNo": "床位号",
|
||||
"disposition": "转归",
|
||||
"dispAdmit": "住院",
|
||||
"dispDischarge": "出院",
|
||||
"dispTransfer": "转科",
|
||||
"dispDeath": "死亡",
|
||||
"addObservation": "新增留观",
|
||||
"editObservation": "编辑留观",
|
||||
"patientId": "患者ID",
|
||||
"bed": "床位",
|
||||
"doctorLabel": "医生",
|
||||
"diagnosis": "诊断",
|
||||
"startTime": "开始时间",
|
||||
"endTime": "结束时间",
|
||||
"duration": "观察时长(h)",
|
||||
"observing": "观察中",
|
||||
"dischargeAction": "出院/转归",
|
||||
"dischargeTitle": "出院/转归",
|
||||
"bedNoLabel": "床位号",
|
||||
"discharged": "已出院/转归"
|
||||
},
|
||||
"greentrack": {
|
||||
"title": "绿色通道管理",
|
||||
"totalCases": "总例数",
|
||||
"achievedCases": "达标例数",
|
||||
"achievementRate": "达标率",
|
||||
"avgDoorToTx": "平均Door-to-Tx时间",
|
||||
"refreshStats": "刷新统计",
|
||||
"diseaseType": "疾病类型",
|
||||
"isAchieved": "是否达标",
|
||||
"achieved": "达标",
|
||||
"notAchieved": "未达标",
|
||||
"activate": "激活绿色通道",
|
||||
"patientId": "患者ID",
|
||||
"doorToTx": "Door-to-Tx(min)",
|
||||
"targetTime": "目标时间(min)",
|
||||
"achievedLabel": "达标",
|
||||
"pendingEvaluation": "待评估",
|
||||
"activateTime": "激活时间",
|
||||
"completeTime": "完成时间",
|
||||
"completeEvaluation": "完成评估",
|
||||
"activateTitle": "激活绿色通道",
|
||||
"diseaseTypePlaceholder": "如: 急性心肌梗死、脑卒中",
|
||||
"targetTimeLabel": "目标时间(min)",
|
||||
"activateBtn": "激活",
|
||||
"completeEvaluationTitle": "完成评估",
|
||||
"doorToTxLabel": "Door-to-Tx(min)",
|
||||
"selectPatient": "请选择患者",
|
||||
"activated": "绿色通道已激活",
|
||||
"evaluationComplete": "评估完成"
|
||||
}
|
||||
},
|
||||
"infection": {
|
||||
"case": {
|
||||
"title": "院感病例监测",
|
||||
"patientName": "患者姓名",
|
||||
"infectionType": "感染类型",
|
||||
"nosocomial": "医院感染",
|
||||
"community": "社区感染",
|
||||
"status": "状态",
|
||||
"reported": "已上报",
|
||||
"confirmed": "已确认",
|
||||
"rejected": "已拒绝",
|
||||
"query": "查询",
|
||||
"patient": "患者",
|
||||
"type": "类型",
|
||||
"infectionSite": "感染部位",
|
||||
"pathogen": "病原体",
|
||||
"reporter": "上报人",
|
||||
"reportTime": "上报时间",
|
||||
"statusCol": "状态",
|
||||
"reviewResult": "审核意见"
|
||||
},
|
||||
"warning": {
|
||||
"title": "疫情预警",
|
||||
"refresh": "刷新",
|
||||
"addWarning": "新增预警",
|
||||
"level1": "一级预警",
|
||||
"level2": "二级预警",
|
||||
"level3": "三级预警",
|
||||
"totalWarnings": "总预警数",
|
||||
"warningLevel": "预警级别",
|
||||
"diseaseType": "疾病类型",
|
||||
"respiratory": "呼吸道传染病",
|
||||
"intestinal": "肠道传染病",
|
||||
"blood": "血源性传染病",
|
||||
"vector": "虫媒传染病",
|
||||
"other": "其他",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"diseaseName": "疾病名称",
|
||||
"caseCount": "病例数",
|
||||
"threshold": "阈值",
|
||||
"affectedArea": "影响区域",
|
||||
"department": "报告科室",
|
||||
"reporter": "报告人",
|
||||
"warningTime": "预警时间",
|
||||
"addDialogTitle": "新增疫情预警",
|
||||
"diseaseNamePlaceholder": "请输入疾病名称",
|
||||
"pleaseSelect": "请选择",
|
||||
"affectedAreaPlaceholder": "请输入影响区域",
|
||||
"departmentPlaceholder": "请输入报告科室",
|
||||
"detailInfo": "详情: ",
|
||||
"level1Short": "一级",
|
||||
"level2Short": "二级",
|
||||
"level3Short": "三级",
|
||||
"addSuccess": "新增成功"
|
||||
},
|
||||
"outbreak": {
|
||||
"title": "暴发预警",
|
||||
"ruleConfig": "预警规则配置",
|
||||
"checkDays": "检测天数",
|
||||
"yellowThreshold": "黄色预警阈值",
|
||||
"redThreshold": "红色预警阈值",
|
||||
"executeCheck": "执行检测",
|
||||
"checkResult": "检测结果概览",
|
||||
"recentCases": "近期病例数",
|
||||
"newWarnings": "新增预警数",
|
||||
"checkTime": "检测时间",
|
||||
"warningList": "预警记录列表",
|
||||
"refresh": "刷新",
|
||||
"warningLevel": "预警级别",
|
||||
"yellowWarning": "黄色预警",
|
||||
"redWarning": "红色预警",
|
||||
"status": "状态",
|
||||
"statusPending": "待处理",
|
||||
"statusProcessing": "处理中",
|
||||
"statusHandled": "已处理",
|
||||
"statusExcluded": "已排除",
|
||||
"infectionType": "感染类型",
|
||||
"department": "科室",
|
||||
"caseCount": "病例数",
|
||||
"threshold": "阈值",
|
||||
"checkDaysCol": "检测天数",
|
||||
"statusCol": "状态",
|
||||
"handler": "处理人",
|
||||
"handleResult": "处理结果",
|
||||
"warningTime": "预警时间",
|
||||
"action": "操作",
|
||||
"process": "处理",
|
||||
"exclude": "排除",
|
||||
"processDialogTitle": "处理预警",
|
||||
"handleResultPlaceholder": "请输入处理结果",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"checkSuccess": "检测完成,新增 {count} 条预警",
|
||||
"checkFailed": "检测失败: ",
|
||||
"enterHandleResult": "请输入处理结果",
|
||||
"processSuccess": "处理成功",
|
||||
"processFailed": "处理失败",
|
||||
"confirmExclude": "确认排除该预警?",
|
||||
"tip": "提示",
|
||||
"falseReportExclude": "误报排除",
|
||||
"excluded": "已排除",
|
||||
"operationFailed": "操作失败",
|
||||
"unknown": "未知",
|
||||
"unknownError": "未知错误"
|
||||
},
|
||||
"surveillance": {
|
||||
"title": "目标性监测",
|
||||
"refresh": "刷新",
|
||||
"addMonitor": "新增监测",
|
||||
"exportReport": "导出报告",
|
||||
"statTotal": "总监测数",
|
||||
"statICU": "ICU感染",
|
||||
"statSSI": "SSI感染",
|
||||
"statCLABSI": "CLABSI",
|
||||
"statVAP": "VAP",
|
||||
"statAvgRate": "平均感染率",
|
||||
"surveillanceType": "监测类型",
|
||||
"typeICU": "ICU感染",
|
||||
"typeSSI": "手术部位感染(SSI)",
|
||||
"typeCLABSI": "导管相关血流感染(CLABSI)",
|
||||
"typeVAP": "呼吸机相关肺炎(VAP)",
|
||||
"typeCAUTI": "导尿管相关尿路感染(CAUTI)",
|
||||
"typeMDR": "多重耐药菌监测",
|
||||
"status": "状态",
|
||||
"statusOngoing": "进行中",
|
||||
"statusCompleted": "已完成",
|
||||
"statusPaused": "已暂停",
|
||||
"startDate": "开始日期",
|
||||
"endDate": "结束日期",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"monitorDept": "监测科室",
|
||||
"monitorCount": "监测人数",
|
||||
"infectionCount": "感染数",
|
||||
"infectionRate": "感染率",
|
||||
"deviceUsageRate": "器械使用率",
|
||||
"monitorPeriod": "监测周期",
|
||||
"remark": "备注",
|
||||
"detail": "详情",
|
||||
"addDialogTitle": "新增监测",
|
||||
"monitorTypeLabel": "监测类型",
|
||||
"deptPlaceholder": "请输入科室名称",
|
||||
"countLabel": "监测人数",
|
||||
"infectionLabel": "感染人数",
|
||||
"deviceLabel": "器械使用率(%)",
|
||||
"periodLabel": "监测周期",
|
||||
"periodPlaceholder": "如: 2026-01-01 ~ 2026-06-30",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"addSuccess": "新增成功",
|
||||
"exportInfo": "导出功能开发中",
|
||||
"typeICUShort": "ICU感染",
|
||||
"typeSSIShort": "手术部位感染",
|
||||
"typeCLABSIShort": "导管相关血流感染",
|
||||
"typeVAPShort": "呼吸机相关肺炎",
|
||||
"typeCAUTIShort": "导尿管相关尿路感染",
|
||||
"typeMDRShort": "多重耐药菌监测",
|
||||
"detailInfo": "详情: "
|
||||
},
|
||||
"hygiene": {
|
||||
"title": "手卫生管理",
|
||||
"refresh": "刷新",
|
||||
"addRecord": "新增记录",
|
||||
"viewStats": "查看统计",
|
||||
"statTotal": "总观察数",
|
||||
"statCompliant": "依从数",
|
||||
"statNonCompliant": "不依从数",
|
||||
"statRate": "依从率",
|
||||
"statDepts": "科室数",
|
||||
"statPassRate": "达标率",
|
||||
"department": "科室",
|
||||
"complianceType": "依从性",
|
||||
"compliant": "依从",
|
||||
"nonCompliant": "不依从",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"staffName": "人员",
|
||||
"handwashType": "洗手类型",
|
||||
"observationTime": "观察时间",
|
||||
"opportunities": "手卫生时机",
|
||||
"compliantCount": "依从次数",
|
||||
"recordTime": "记录时间",
|
||||
"addDialogTitle": "新增手卫生记录",
|
||||
"deptPlaceholder": "请输入科室",
|
||||
"namePlaceholder": "请输入姓名",
|
||||
"soap": "洗手液洗手",
|
||||
"sanitizer": "速干手消毒剂",
|
||||
"surgical": "外科手消毒",
|
||||
"opportunityPlaceholder": "如: 接触患者前",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"statsTitle": "手卫生统计",
|
||||
"statsTotal": "总观察次数",
|
||||
"statsCompliant": "依从次数",
|
||||
"statsRate": "依从率",
|
||||
"statsNonCompliant": "不依从次数",
|
||||
"close": "关闭",
|
||||
"addSuccess": "新增成功"
|
||||
},
|
||||
"resistant": {
|
||||
"title": "多重耐药菌监测",
|
||||
"refresh": "刷新",
|
||||
"addRecord": "新增记录",
|
||||
"statDetected": "耐药菌检出",
|
||||
"statIsolated": "已隔离",
|
||||
"statIsolationRate": "隔离率",
|
||||
"statCureRate": "治愈率",
|
||||
"bacteriaType": "耐药菌类型",
|
||||
"mdrPsa": "MDR铜绿",
|
||||
"isolationStatus": "隔离状态",
|
||||
"isolated": "已隔离",
|
||||
"released": "解除隔离",
|
||||
"notIsolated": "未隔离",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"patient": "患者",
|
||||
"department": "科室",
|
||||
"sampleType": "标本类型",
|
||||
"isolationDate": "隔离日期",
|
||||
"releaseDate": "解除日期",
|
||||
"antibioticUsage": "抗菌药物使用",
|
||||
"reportTime": "报告时间",
|
||||
"addDialogTitle": "新增多重耐药菌记录",
|
||||
"patientPlaceholder": "请输入患者姓名",
|
||||
"selectPlaceholder": "请选择",
|
||||
"deptPlaceholder": "请输入科室",
|
||||
"samplePlaceholder": "如: 痰液、血液、尿液",
|
||||
"antibioticPlaceholder": "请输入抗菌药物使用情况",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"addSuccess": "新增成功"
|
||||
},
|
||||
"exposure": {
|
||||
"title": "职业暴露管理",
|
||||
"refresh": "刷新",
|
||||
"addReport": "新增报告",
|
||||
"totalExposure": "总暴露数",
|
||||
"bloodExposure": "血液暴露",
|
||||
"bodyFluidExposure": "体液暴露",
|
||||
"followupRate": "随访率",
|
||||
"exposureType": "暴露类型",
|
||||
"needleStick": "针刺伤",
|
||||
"chemicalExposure": "化学暴露",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"staffName": "暴露人员",
|
||||
"department": "科室",
|
||||
"exposureSource": "暴露源",
|
||||
"exposureDate": "暴露时间",
|
||||
"exposureSite": "暴露部位",
|
||||
"exposureLevel": "暴露程度",
|
||||
"status": "处理状态",
|
||||
"statusCompleted": "已完成",
|
||||
"statusInProgress": "处理中",
|
||||
"statusPending": "待处理",
|
||||
"reportTime": "报告时间",
|
||||
"addDialogTitle": "新增职业暴露报告",
|
||||
"placeholderName": "请输入姓名",
|
||||
"placeholderDept": "请输入科室",
|
||||
"placeholderSelect": "请选择",
|
||||
"placeholderSource": "如: HIV阳性患者血液",
|
||||
"placeholderSite": "如: 左手食指",
|
||||
"levelLight": "轻度",
|
||||
"levelMedium": "中度",
|
||||
"levelHeavy": "重度",
|
||||
"treatment": "处理措施",
|
||||
"placeholderTreatment": "请输入处理措施",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"addSuccess": "新增成功"
|
||||
},
|
||||
"environment": {
|
||||
"title": "环境监测",
|
||||
"refresh": "刷新",
|
||||
"addMonitor": "新增监测",
|
||||
"viewRate": "查看合格率",
|
||||
"sampleType": "采样类型",
|
||||
"sampleAir": "空气",
|
||||
"sampleSurface": "物体表面",
|
||||
"sampleHand": "手采样",
|
||||
"sampleDisinfectant": "使用中消毒液",
|
||||
"sampleDevice": "医疗器械",
|
||||
"monitorResult": "监测结果",
|
||||
"qualified": "合格",
|
||||
"unqualified": "不合格",
|
||||
"query": "查询",
|
||||
"reset": "重置",
|
||||
"sampleLocation": "采样地点",
|
||||
"sampleDate": "采样日期",
|
||||
"bacterialCount": "菌落数(CFU)",
|
||||
"standardLimit": "标准限值",
|
||||
"exceedRate": "超标率",
|
||||
"monitorPerson": "监测人",
|
||||
"recordTime": "记录时间",
|
||||
"addDialogTitle": "新增环境监测",
|
||||
"placeholderSelect": "请选择",
|
||||
"placeholderLocation": "请输入采样地点",
|
||||
"placeholderDate": "选择日期",
|
||||
"placeholderPerson": "请输入监测人",
|
||||
"cancel": "取消",
|
||||
"confirm": "确定",
|
||||
"rateDialogTitle": "环境监测合格率统计",
|
||||
"rateTotal": "总监测数",
|
||||
"rateQualified": "合格数",
|
||||
"rateUnqualified": "不合格数",
|
||||
"ratePercent": "合格率",
|
||||
"close": "关闭",
|
||||
"addSuccess": "新增成功",
|
||||
"cardTotal": "总监测数",
|
||||
"cardQualified": "合格数",
|
||||
"cardUnqualified": "不合格数",
|
||||
"cardRate": "合格率",
|
||||
"cardTypes": "采样类型",
|
||||
"cardAvgBacterial": "平均菌落"
|
||||
},
|
||||
"detail": {
|
||||
"title": "院感监测统计",
|
||||
"queryConditions": "查询条件",
|
||||
"department": "科室",
|
||||
"deptId": "科室ID",
|
||||
"startDate": "开始日期",
|
||||
"endDate": "结束日期",
|
||||
"query": "查询",
|
||||
"totalCases": "总病例数",
|
||||
"reported": "已上报",
|
||||
"confirmed": "已确认",
|
||||
"infectionRate": "感染率",
|
||||
"byType": "按感染类型分布",
|
||||
"infectionType": "感染类型",
|
||||
"caseCount": "病例数",
|
||||
"bySite": "按感染部位分布",
|
||||
"infectionSite": "感染部位",
|
||||
"trend": "感染趋势",
|
||||
"date": "日期",
|
||||
"total": "总计",
|
||||
"rejected": "已驳回",
|
||||
"loadFailed": "加载失败",
|
||||
"unknownError": "未知错误"
|
||||
},
|
||||
"screening": {
|
||||
"title": "院感病例自动筛查",
|
||||
"ruleConfig": "筛查规则配置",
|
||||
"startDate": "开始日期",
|
||||
"endDate": "结束日期",
|
||||
"placeholderStartDate": "选择开始日期",
|
||||
"placeholderEndDate": "选择结束日期",
|
||||
"infectionType": "感染类型",
|
||||
"all": "全部",
|
||||
"hospitalInfection": "医院感染",
|
||||
"communityInfection": "社区感染",
|
||||
"minDays": "住院天数阈值",
|
||||
"runScreening": "执行筛查",
|
||||
"resultOverview": "筛查结果概览",
|
||||
"screenedCount": "筛查病例数",
|
||||
"suspectedCount": "疑似病例数",
|
||||
"screenTime": "筛查时间",
|
||||
"resultList": "筛查结果列表",
|
||||
"refresh": "刷新",
|
||||
"patientName": "患者姓名",
|
||||
"infectionSite": "感染部位",
|
||||
"pathogen": "病原体",
|
||||
"diagnosisDate": "诊断日期",
|
||||
"reportTime": "上报时间",
|
||||
"status": "状态",
|
||||
"statusReported": "已上报",
|
||||
"statusReviewed": "已审核",
|
||||
"statusConfirmed": "已确认",
|
||||
"statusRejected": "已驳回",
|
||||
"reviewResult": "审核结果",
|
||||
"confirmed": "确认",
|
||||
"rejected": "驳回",
|
||||
"screeningDone": "筛查完成",
|
||||
"screeningFailed": "筛查失败",
|
||||
"unknownError": "未知错误"
|
||||
},
|
||||
"antibiotic": {
|
||||
"title": "抗菌药物使用管理",
|
||||
"patientName": "患者姓名",
|
||||
"medicalNo": "病历号",
|
||||
"drugName": "抗菌药物名称",
|
||||
"dosage": "剂量",
|
||||
"usage": "用法",
|
||||
"course": "疗程(天)",
|
||||
"level": "抗菌药物级别",
|
||||
"indication": "适应症",
|
||||
"doctorName": "开单医生",
|
||||
"department": "科室",
|
||||
"useDate": "使用日期"
|
||||
},
|
||||
"enhanced": {
|
||||
"title": "院感管理增强",
|
||||
"outbreakTab": "暴发预警",
|
||||
"surveillanceTab": "目标性监测",
|
||||
"handHygieneTab": "手卫生监测",
|
||||
"mdrTab": "多重耐药菌",
|
||||
"envMonitorTab": "环境卫生学监测",
|
||||
"addWarning": "新增预警",
|
||||
"addMonitor": "新增监测",
|
||||
"addRecord": "新增记录",
|
||||
"department": "科室",
|
||||
"infectionType": "感染类型",
|
||||
"caseCount": "病例数",
|
||||
"warningLevel": "预警级别",
|
||||
"redWarning": "🔴 红色",
|
||||
"yellowWarning": "🟡 黄色",
|
||||
"status": "状态",
|
||||
"statusPending": "待处理",
|
||||
"statusProcessing": "处理中",
|
||||
"statusProcessed": "已处理",
|
||||
"statusExcluded": "已排除",
|
||||
"warningTime": "预警时间",
|
||||
"operation": "操作",
|
||||
"handle": "处理",
|
||||
"exclude": "排除",
|
||||
"monitorType": "监测类型",
|
||||
"icuMonitor": "ICU监测",
|
||||
"surgicalSite": "手术部位",
|
||||
"catheterRelated": "导管相关",
|
||||
"other": "其他",
|
||||
"unknown": "未知",
|
||||
"monitorObject": "监测对象",
|
||||
"totalCases": "总例数",
|
||||
"infectionCases": "感染例数",
|
||||
"infectionRate": "感染率",
|
||||
"startDate": "开始日期",
|
||||
"totalObserve": "总观察次数",
|
||||
"totalComply": "总依从次数",
|
||||
"overallRate": "总体依从率",
|
||||
"monitorDate": "监测日期",
|
||||
"observeCount": "观察次数",
|
||||
"complyCount": "依从次数",
|
||||
"complyRate": "依从率",
|
||||
"observer": "观察者",
|
||||
"patient": "患者",
|
||||
"bacteriaName": "菌种",
|
||||
"resistanceType": "耐药类型",
|
||||
"specimenType": "标本类型",
|
||||
"isolationStatus": "隔离状态",
|
||||
"notIsolated": "未隔离",
|
||||
"isolated": "已隔离",
|
||||
"released": "已解除",
|
||||
"reportDate": "报告日期",
|
||||
"isolate": "隔离",
|
||||
"release": "解除",
|
||||
"monitorItem": "监测项目",
|
||||
"standardValue": "标准值",
|
||||
"actualValue": "实测值",
|
||||
"result": "结果",
|
||||
"tester": "检测人",
|
||||
"envAir": "空气",
|
||||
"envSurface": "物表",
|
||||
"envHand": "手",
|
||||
"envDisinfectant": "消毒液",
|
||||
"envSterile": "无菌物品",
|
||||
"qualified": "合格",
|
||||
"unqualified": "不合格",
|
||||
"addOutbreakWarning": "新增暴发预警",
|
||||
"addHandHygiene": "新增手卫生监测",
|
||||
"addMdrRecord": "新增多重耐药菌记录",
|
||||
"addEnvMonitor": "新增环境卫生学监测",
|
||||
"patientName": "患者姓名",
|
||||
"bacteriaNameLabel": "菌种名称",
|
||||
"cancel": "取消",
|
||||
"confirm": "确认",
|
||||
"promptHandleResult": "请输入处理结果",
|
||||
"handleWarning": "处理预警",
|
||||
"handleSuccess": "处理成功",
|
||||
"confirmExclude": "确认排除此预警?",
|
||||
"excluded": "已排除",
|
||||
"confirmIsolate": "确认标记为隔离状态?",
|
||||
"confirmIsolateTitle": "确认隔离",
|
||||
"confirmRelease": "确认解除隔离?",
|
||||
"confirmReleaseTitle": "确认解除",
|
||||
"addSuccess": "新增成功"
|
||||
}
|
||||
},
|
||||
"auditlog": {
|
||||
"title": "审计日志",
|
||||
"userName": "用户",
|
||||
"module": "模块",
|
||||
"action": "操作",
|
||||
"method": "方法",
|
||||
"result": "结果",
|
||||
"resultSuccess": "成功",
|
||||
"resultFail": "失败",
|
||||
"query": "查询",
|
||||
"durationMs": "耗时ms",
|
||||
"time": "时间",
|
||||
"operation": "操作",
|
||||
"confirmDelete": "确定删除?",
|
||||
"delete": "删除",
|
||||
"deleted": "已删除",
|
||||
"detailTitle": "审计日志详情",
|
||||
"duration": "耗时",
|
||||
"params": "参数",
|
||||
"error": "错误",
|
||||
"riskLow": "低",
|
||||
"riskMedium": "中",
|
||||
"riskHigh": "高",
|
||||
"riskCritical": "严重",
|
||||
"unknown": "未知",
|
||||
"businessLogin": "登录",
|
||||
"businessLogout": "登出",
|
||||
"businessQuery": "查询",
|
||||
"businessInsert": "新增",
|
||||
"businessUpdate": "修改",
|
||||
"businessDelete": "删除",
|
||||
"businessExport": "导出",
|
||||
"enhanced": {
|
||||
"title": "审计日志管理",
|
||||
"hideStats": "隐藏统计",
|
||||
"showStats": "查看统计",
|
||||
"auditStats": "审计统计",
|
||||
"totalLogs": "总日志数",
|
||||
"highRiskOps": "高风险操作",
|
||||
"criticalRisk": "严重风险",
|
||||
"byModule": "按模块分布",
|
||||
"byRiskLevel": "按风险级别分布",
|
||||
"riskLevel": "风险级别",
|
||||
"businessType": "业务类型",
|
||||
"dateRangeSep": "至",
|
||||
"startDate": "开始日期",
|
||||
"endDate": "结束日期",
|
||||
"reset": "重置",
|
||||
"detail": "详情",
|
||||
"tenant": "租户",
|
||||
"department": "科室",
|
||||
"userAgent": "用户代理"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,48 +1,48 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">审计日志管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('auditlog.enhanced.title') }}</span>
|
||||
<el-button @click="showStats = !showStats">
|
||||
{{ showStats ? '隐藏统计' : '查看统计' }}
|
||||
{{ showStats ? $t('auditlog.enhanced.hideStats') : $t('auditlog.enhanced.showStats') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 统计面板 -->
|
||||
<el-card v-if="showStats" style="margin-bottom:16px">
|
||||
<template #header>
|
||||
<span>审计统计</span>
|
||||
<span>{{ $t('auditlog.enhanced.auditStats') }}</span>
|
||||
</template>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:24px;font-weight:bold;color:#409eff">{{ stats.totalCount || 0 }}</div>
|
||||
<div style="color:#909399">总日志数</div>
|
||||
<div style="color:#909399">{{ $t('auditlog.enhanced.totalLogs') }}</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:24px;font-weight:bold;color:#e6a23c">{{ stats.highRiskCount || 0 }}</div>
|
||||
<div style="color:#909399">高风险操作</div>
|
||||
<div style="color:#909399">{{ $t('auditlog.enhanced.highRiskOps') }}</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<div style="text-align:center">
|
||||
<div style="font-size:24px;font-weight:bold;color:#f56c6c">{{ stats.criticalCount || 0 }}</div>
|
||||
<div style="color:#909399">严重风险</div>
|
||||
<div style="color:#909399">{{ $t('auditlog.enhanced.criticalRisk') }}</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-divider />
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<div style="font-weight:bold;margin-bottom:8px">按模块分布</div>
|
||||
<div style="font-weight:bold;margin-bottom:8px">{{ $t('auditlog.enhanced.byModule') }}</div>
|
||||
<div v-for="item in stats.moduleStats" :key="item.module" style="display:flex;justify-content:space-between;margin-bottom:4px">
|
||||
<span>{{ item.module || '未知' }}</span>
|
||||
<span>{{ item.module || $t('auditlog.unknown') }}</span>
|
||||
<el-tag size="small">{{ item.count }}</el-tag>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<div style="font-weight:bold;margin-bottom:8px">按风险级别分布</div>
|
||||
<div style="font-weight:bold;margin-bottom:8px">{{ $t('auditlog.enhanced.byRiskLevel') }}</div>
|
||||
<div v-for="item in stats.riskStats" :key="item.risk_level" style="display:flex;justify-content:space-between;margin-bottom:4px">
|
||||
<span>{{ getRiskLabel(item.risk_level) }}</span>
|
||||
<el-tag :type="getRiskType(item.risk_level)" size="small">{{ item.count }}</el-tag>
|
||||
@@ -55,91 +55,91 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.userName"
|
||||
placeholder="用户名"
|
||||
:placeholder="$t('auditlog.userName')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-input
|
||||
v-model="q.module"
|
||||
placeholder="模块"
|
||||
:placeholder="$t('auditlog.module')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-input
|
||||
v-model="q.action"
|
||||
placeholder="操作"
|
||||
:placeholder="$t('auditlog.action')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.riskLevel"
|
||||
placeholder="风险级别"
|
||||
:placeholder="$t('auditlog.enhanced.riskLevel')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option label="低" value="LOW" />
|
||||
<el-option label="中" value="MEDIUM" />
|
||||
<el-option label="高" value="HIGH" />
|
||||
<el-option label="严重" value="CRITICAL" />
|
||||
<el-option :label="$t('auditlog.riskLow')" value="LOW" />
|
||||
<el-option :label="$t('auditlog.riskMedium')" value="MEDIUM" />
|
||||
<el-option :label="$t('auditlog.riskHigh')" value="HIGH" />
|
||||
<el-option :label="$t('auditlog.riskCritical')" value="CRITICAL" />
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.businessType"
|
||||
placeholder="业务类型"
|
||||
:placeholder="$t('auditlog.enhanced.businessType')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option label="登录" value="login" />
|
||||
<el-option label="登出" value="logout" />
|
||||
<el-option label="查询" value="query" />
|
||||
<el-option label="新增" value="insert" />
|
||||
<el-option label="修改" value="update" />
|
||||
<el-option label="删除" value="delete" />
|
||||
<el-option label="导出" value="export" />
|
||||
<el-option :label="$t('auditlog.businessLogin')" value="login" />
|
||||
<el-option :label="$t('auditlog.businessLogout')" value="logout" />
|
||||
<el-option :label="$t('auditlog.businessQuery')" value="query" />
|
||||
<el-option :label="$t('auditlog.businessInsert')" value="insert" />
|
||||
<el-option :label="$t('auditlog.businessUpdate')" value="update" />
|
||||
<el-option :label="$t('auditlog.businessDelete')" value="delete" />
|
||||
<el-option :label="$t('auditlog.businessExport')" value="export" />
|
||||
</el-select>
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:range-separator="$t('auditlog.enhanced.dateRangeSep')"
|
||||
:start-placeholder="$t('auditlog.enhanced.startDate')"
|
||||
:end-placeholder="$t('auditlog.enhanced.endDate')"
|
||||
value-format="YYYY-MM-DD"
|
||||
style="width:240px"
|
||||
/>
|
||||
<el-button type="primary" @click="loadData">查询</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
<el-button type="primary" @click="loadData">{{ $t('auditlog.query') }}</el-button>
|
||||
<el-button @click="resetQuery">{{ $t('auditlog.enhanced.reset') }}</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table :data="tableData" border stripe>
|
||||
<el-table-column prop="userName" label="用户" width="100" />
|
||||
<el-table-column prop="module" label="模块" width="120" />
|
||||
<el-table-column prop="action" label="操作" width="100" />
|
||||
<el-table-column prop="businessType" label="业务类型" width="100">
|
||||
<el-table-column prop="userName" :label="$t('auditlog.userName')" width="100" />
|
||||
<el-table-column prop="module" :label="$t('auditlog.module')" width="120" />
|
||||
<el-table-column prop="action" :label="$t('auditlog.action')" width="100" />
|
||||
<el-table-column prop="businessType" :label="$t('auditlog.enhanced.businessType')" width="100">
|
||||
<template #default="{row}">
|
||||
<el-tag size="small">{{ getBusinessLabel(row.businessType) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="riskLevel" label="风险级别" width="100">
|
||||
<el-table-column prop="riskLevel" :label="$t('auditlog.enhanced.riskLevel')" width="100">
|
||||
<template #default="{row}">
|
||||
<el-tag :type="getRiskType(row.riskLevel)" size="small">
|
||||
{{ getRiskLabel(row.riskLevel) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="method" label="方法" width="70" align="center" />
|
||||
<el-table-column prop="method" :label="$t('auditlog.method')" width="70" align="center" />
|
||||
<el-table-column prop="url" label="URL" min-width="200" show-overflow-tooltip />
|
||||
<el-table-column prop="clientIp" label="IP" width="120" />
|
||||
<el-table-column prop="result" label="结果" width="80" align="center">
|
||||
<el-table-column prop="result" :label="$t('auditlog.result')" width="80" align="center">
|
||||
<template #default="{row}">
|
||||
<el-tag v-if="row.result==='SUCCESS'" type="success" size="small">成功</el-tag>
|
||||
<el-tag v-else type="danger" size="small">失败</el-tag>
|
||||
<el-tag v-if="row.result==='SUCCESS'" type="success" size="small">{{ $t('auditlog.resultSuccess') }}</el-tag>
|
||||
<el-tag v-else type="danger" size="small">{{ $t('auditlog.resultFail') }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="responseTimeMs" label="耗时ms" width="80" align="center" />
|
||||
<el-table-column prop="createTime" label="时间" width="170" />
|
||||
<el-table-column label="操作" width="80">
|
||||
<el-table-column prop="responseTimeMs" :label="$t('auditlog.durationMs')" width="80" align="center" />
|
||||
<el-table-column prop="createTime" :label="$t('auditlog.time')" width="170" />
|
||||
<el-table-column :label="$t('auditlog.operation')" width="80">
|
||||
<template #default="{row}">
|
||||
<el-button type="primary" link size="small" @click="showDetail(row)">详情</el-button>
|
||||
<el-button type="primary" link size="small" @click="showDetail(row)">{{ $t('auditlog.enhanced.detail') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -154,24 +154,24 @@
|
||||
/>
|
||||
|
||||
<!-- 详情弹窗 -->
|
||||
<el-dialog v-model="detailVisible" title="审计日志详情" width="700px">
|
||||
<el-dialog v-model="detailVisible" :title="$t('auditlog.detailTitle')" width="700px">
|
||||
<el-descriptions :column="2" border>
|
||||
<el-descriptions-item label="用户">{{ detail.userName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="模块">{{ detail.module }}</el-descriptions-item>
|
||||
<el-descriptions-item label="操作">{{ detail.action }}</el-descriptions-item>
|
||||
<el-descriptions-item label="业务类型">{{ getBusinessLabel(detail.businessType) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="风险级别">
|
||||
<el-descriptions-item :label="$t('auditlog.userName')">{{ detail.userName }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.module')">{{ detail.module }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.action')">{{ detail.action }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.enhanced.businessType')">{{ getBusinessLabel(detail.businessType) }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.enhanced.riskLevel')">
|
||||
<el-tag :type="getRiskType(detail.riskLevel)">{{ getRiskLabel(detail.riskLevel) }}</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="方法">{{ detail.method }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.method')">{{ detail.method }}</el-descriptions-item>
|
||||
<el-descriptions-item label="URL" :span="2">{{ detail.url }}</el-descriptions-item>
|
||||
<el-descriptions-item label="IP">{{ detail.clientIp }}</el-descriptions-item>
|
||||
<el-descriptions-item label="耗时">{{ detail.responseTimeMs }}ms</el-descriptions-item>
|
||||
<el-descriptions-item label="租户">{{ detail.tenantName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="科室">{{ detail.orgName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="参数" :span="2">{{ detail.params }}</el-descriptions-item>
|
||||
<el-descriptions-item label="错误" :span="2">{{ detail.errorMsg }}</el-descriptions-item>
|
||||
<el-descriptions-item label="用户代理" :span="2">{{ detail.userAgent }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.duration')">{{ detail.responseTimeMs }}ms</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.enhanced.tenant')">{{ detail.tenantName }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.enhanced.department')">{{ detail.orgName }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.params')" :span="2">{{ detail.params }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.error')" :span="2">{{ detail.errorMsg }}</el-descriptions-item>
|
||||
<el-descriptions-item :label="$t('auditlog.enhanced.userAgent')" :span="2">{{ detail.userAgent }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-dialog>
|
||||
</div>
|
||||
@@ -179,9 +179,12 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getEnhancedLogs, getAuditStats } from './api'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
const q = ref({
|
||||
@@ -232,8 +235,8 @@ const showDetail = (row) => {
|
||||
}
|
||||
|
||||
const getRiskLabel = (level) => {
|
||||
const map = { LOW: '低', MEDIUM: '中', HIGH: '高', CRITICAL: '严重' }
|
||||
return map[level] || level || '未知'
|
||||
const map = { LOW: t('auditlog.riskLow'), MEDIUM: t('auditlog.riskMedium'), HIGH: t('auditlog.riskHigh'), CRITICAL: t('auditlog.riskCritical') }
|
||||
return map[level] || level || t('auditlog.unknown')
|
||||
}
|
||||
|
||||
const getRiskType = (level) => {
|
||||
@@ -242,8 +245,8 @@ const getRiskType = (level) => {
|
||||
}
|
||||
|
||||
const getBusinessLabel = (type) => {
|
||||
const map = { login: '登录', logout: '登出', query: '查询', insert: '新增', update: '修改', delete: '删除', export: '导出' }
|
||||
return map[type] || type || '未知'
|
||||
const map = { login: t('auditlog.businessLogin'), logout: t('auditlog.businessLogout'), query: t('auditlog.businessQuery'), insert: t('auditlog.businessInsert'), update: t('auditlog.businessUpdate'), delete: t('auditlog.businessDelete'), export: t('auditlog.businessExport') }
|
||||
return map[type] || type || t('auditlog.unknown')
|
||||
}
|
||||
|
||||
watch(showStats, (val) => {
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">审计日志</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('auditlog.title') }}</span>
|
||||
</div>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.userName"
|
||||
placeholder="用户名"
|
||||
:placeholder="$t('auditlog.userName')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-input
|
||||
v-model="q.module"
|
||||
placeholder="模块"
|
||||
:placeholder="$t('auditlog.module')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-input
|
||||
v-model="q.action"
|
||||
placeholder="操作"
|
||||
:placeholder="$t('auditlog.action')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.result"
|
||||
placeholder="结果"
|
||||
:placeholder="$t('auditlog.result')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="成功"
|
||||
:label="$t('auditlog.resultSuccess')"
|
||||
value="SUCCESS"
|
||||
/>
|
||||
<el-option
|
||||
label="失败"
|
||||
:label="$t('auditlog.resultFail')"
|
||||
value="FAIL"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -41,7 +41,7 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('auditlog.query') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -51,22 +51,22 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="userName"
|
||||
label="用户"
|
||||
:label="$t('auditlog.userName')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="module"
|
||||
label="模块"
|
||||
:label="$t('auditlog.module')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="action"
|
||||
label="操作"
|
||||
:label="$t('auditlog.action')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="method"
|
||||
label="方法"
|
||||
:label="$t('auditlog.method')"
|
||||
width="70"
|
||||
align="center"
|
||||
/>
|
||||
@@ -83,7 +83,7 @@
|
||||
/>
|
||||
<el-table-column
|
||||
prop="result"
|
||||
label="结果"
|
||||
:label="$t('auditlog.result')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -93,35 +93,35 @@
|
||||
type="success"
|
||||
size="small"
|
||||
>
|
||||
成功
|
||||
{{ $t('auditlog.resultSuccess') }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else
|
||||
type="danger"
|
||||
size="small"
|
||||
>
|
||||
失败
|
||||
{{ $t('auditlog.resultFail') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="durationMs"
|
||||
label="耗时ms"
|
||||
:label="$t('auditlog.durationMs')"
|
||||
width="80"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="时间"
|
||||
:label="$t('auditlog.time')"
|
||||
width="170"
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('auditlog.operation')"
|
||||
width="80"
|
||||
>
|
||||
<template #default="{row}">
|
||||
<el-popconfirm
|
||||
title="确定删除?"
|
||||
:title="$t('auditlog.confirmDelete')"
|
||||
@confirm="delItem(row.id)"
|
||||
>
|
||||
<template #reference>
|
||||
@@ -130,7 +130,7 @@
|
||||
link
|
||||
size="small"
|
||||
>
|
||||
删除
|
||||
{{ $t('auditlog.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
@@ -147,23 +147,23 @@
|
||||
/>
|
||||
<el-dialog
|
||||
v-model="detailVisible"
|
||||
title="审计日志详情"
|
||||
:title="$t('auditlog.detailTitle')"
|
||||
width="600px"
|
||||
>
|
||||
<el-descriptions
|
||||
:column="2"
|
||||
border
|
||||
>
|
||||
<el-descriptions-item label="用户">
|
||||
<el-descriptions-item :label="$t('auditlog.userName')">
|
||||
{{ detail.userName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="模块">
|
||||
<el-descriptions-item :label="$t('auditlog.module')">
|
||||
{{ detail.module }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="操作">
|
||||
<el-descriptions-item :label="$t('auditlog.action')">
|
||||
{{ detail.action }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="方法">
|
||||
<el-descriptions-item :label="$t('auditlog.method')">
|
||||
{{ detail.method }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
@@ -175,17 +175,17 @@
|
||||
<el-descriptions-item label="IP">
|
||||
{{ detail.ip }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="耗时">
|
||||
<el-descriptions-item :label="$t('auditlog.duration')">
|
||||
{{ detail.durationMs }}ms
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="参数"
|
||||
:label="$t('auditlog.params')"
|
||||
:span="2"
|
||||
>
|
||||
{{ detail.params }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item
|
||||
label="错误"
|
||||
:label="$t('auditlog.error')"
|
||||
:span="2"
|
||||
>
|
||||
{{ detail.errorMsg }}
|
||||
@@ -196,12 +196,14 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage,del} from './api'
|
||||
const {t} = useI18n()
|
||||
const tableData=ref([]);const total=ref(0)
|
||||
const q=ref({pageNo:1,pageSize: 10,userName:'',module:'',action:'',result:''})
|
||||
const detailVisible=ref(false);const detail=ref({})
|
||||
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success(t('auditlog.deleted'));loadData()}
|
||||
onMounted(()=>loadData())
|
||||
</script>
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">绿色通道管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('emergency.greentrack.title') }}</span>
|
||||
</div>
|
||||
<el-card
|
||||
shadow="never"
|
||||
style="margin-bottom:16px"
|
||||
>
|
||||
<div style="display:flex;gap:32px;align-items:center">
|
||||
<div><span style="color:#909399">总例数</span><br><span style="font-size:24px;font-weight:bold">{{ stats.total||0 }}</span></div>
|
||||
<div><span style="color:#909399">达标例数</span><br><span style="font-size:24px;font-weight:bold;color:#67C23A">{{ stats.achieved||0 }}</span></div>
|
||||
<div><span style="color:#909399">达标率</span><br><span style="font-size:24px;font-weight:bold;color:#409EFF">{{ stats.achievementRate||0 }}%</span></div>
|
||||
<div><span style="color:#909399">平均Door-to-Tx时间</span><br><span style="font-size:24px;font-weight:bold;color:#E6A23C">{{ stats.avgTime||0 }}min</span></div>
|
||||
<div><span style="color:#909399">{{ $t('emergency.greentrack.totalCases') }}</span><br><span style="font-size:24px;font-weight:bold">{{ stats.total||0 }}</span></div>
|
||||
<div><span style="color:#909399">{{ $t('emergency.greentrack.achievedCases') }}</span><br><span style="font-size:24px;font-weight:bold;color:#67C23A">{{ stats.achieved||0 }}</span></div>
|
||||
<div><span style="color:#909399">{{ $t('emergency.greentrack.achievementRate') }}</span><br><span style="font-size:24px;font-weight:bold;color:#409EFF">{{ stats.achievementRate||0 }}%</span></div>
|
||||
<div><span style="color:#909399">{{ $t('emergency.greentrack.avgDoorToTx') }}</span><br><span style="font-size:24px;font-weight:bold;color:#E6A23C">{{ stats.avgTime||0 }}min</span></div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="refreshStats"
|
||||
>
|
||||
刷新统计
|
||||
{{ $t('emergency.greentrack.refreshStats') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.diseaseType"
|
||||
placeholder="疾病类型"
|
||||
:placeholder="$t('emergency.greentrack.diseaseType')"
|
||||
clearable
|
||||
style="width:130px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.isAchieved"
|
||||
placeholder="是否达标"
|
||||
:placeholder="$t('emergency.greentrack.isAchieved')"
|
||||
clearable
|
||||
style="width:110px"
|
||||
>
|
||||
<el-option
|
||||
label="达标"
|
||||
:label="$t('emergency.greentrack.achieved')"
|
||||
:value="true"
|
||||
/><el-option
|
||||
label="未达标"
|
||||
:label="$t('emergency.greentrack.notAchieved')"
|
||||
:value="false"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -45,13 +45,13 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('emergency.common.search') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd"
|
||||
>
|
||||
激活绿色通道
|
||||
{{ $t('emergency.greentrack.activate') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -61,17 +61,17 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientId"
|
||||
label="患者ID"
|
||||
:label="$t('emergency.greentrack.patientId')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="diseaseType"
|
||||
label="疾病类型"
|
||||
:label="$t('emergency.greentrack.diseaseType')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="doorToTreatmentTime"
|
||||
label="Door-to-Tx(min)"
|
||||
:label="$t('emergency.greentrack.doorToTx')"
|
||||
width="130"
|
||||
align="center"
|
||||
>
|
||||
@@ -81,13 +81,13 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="targetTime"
|
||||
label="目标时间(min)"
|
||||
:label="$t('emergency.greentrack.targetTime')"
|
||||
width="120"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="isAchieved"
|
||||
label="达标"
|
||||
:label="$t('emergency.greentrack.achievedLabel')"
|
||||
width="70"
|
||||
align="center"
|
||||
>
|
||||
@@ -97,41 +97,41 @@
|
||||
type="success"
|
||||
size="small"
|
||||
>
|
||||
达标
|
||||
{{ $t('emergency.greentrack.achieved') }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else-if="row.isAchieved===false"
|
||||
type="danger"
|
||||
size="small"
|
||||
>
|
||||
未达标
|
||||
{{ $t('emergency.greentrack.notAchieved') }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else
|
||||
type="info"
|
||||
size="small"
|
||||
>
|
||||
待评估
|
||||
{{ $t('emergency.greentrack.pendingEvaluation') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="doctor"
|
||||
label="医生"
|
||||
:label="$t('emergency.observation.doctor')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="activateTime"
|
||||
label="激活时间"
|
||||
:label="$t('emergency.greentrack.activateTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="completeTime"
|
||||
label="完成时间"
|
||||
:label="$t('emergency.greentrack.completeTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('emergency.common.operation')"
|
||||
width="180"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -143,7 +143,7 @@
|
||||
size="small"
|
||||
@click="showComplete(row)"
|
||||
>
|
||||
完成评估
|
||||
{{ $t('emergency.greentrack.completeEvaluation') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="info"
|
||||
@@ -151,10 +151,10 @@
|
||||
size="small"
|
||||
@click="showEdit(row)"
|
||||
>
|
||||
编辑
|
||||
{{ $t('emergency.common.edit') }}
|
||||
</el-button>
|
||||
<el-popconfirm
|
||||
title="确定删除?"
|
||||
:title="$t('emergency.common.confirmDelete')"
|
||||
@confirm="delItem(row.id)"
|
||||
>
|
||||
<template #reference>
|
||||
@@ -163,7 +163,7 @@
|
||||
link
|
||||
size="small"
|
||||
>
|
||||
删除
|
||||
{{ $t('emergency.common.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
@@ -180,7 +180,7 @@
|
||||
/>
|
||||
<el-dialog
|
||||
v-model="addVisible"
|
||||
title="激活绿色通道"
|
||||
:title="$t('emergency.greentrack.activateTitle')"
|
||||
width="500px"
|
||||
>
|
||||
<el-form
|
||||
@@ -190,7 +190,7 @@
|
||||
label-width="120px"
|
||||
>
|
||||
<el-form-item
|
||||
label="患者ID"
|
||||
:label="$t('emergency.greentrack.selectPatient')"
|
||||
prop="patientId"
|
||||
>
|
||||
<el-input-number
|
||||
@@ -199,41 +199,41 @@
|
||||
style="width:100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="疾病类型">
|
||||
<el-form-item :label="$t('emergency.greentrack.diseaseType')">
|
||||
<el-input
|
||||
v-model="addForm.diseaseType"
|
||||
placeholder="如: 急性心肌梗死、脑卒中"
|
||||
:placeholder="$t('emergency.greentrack.diseaseTypePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="目标时间(min)">
|
||||
<el-form-item :label="$t('emergency.greentrack.targetTimeLabel')">
|
||||
<el-input-number
|
||||
v-model="addForm.targetTime"
|
||||
:min="1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="医生">
|
||||
<el-form-item :label="$t('emergency.observation.doctor')">
|
||||
<el-input v-model="addForm.doctor" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="addVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitAdd"
|
||||
>
|
||||
激活
|
||||
{{ $t('emergency.greentrack.activateBtn') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
v-model="completeVisible"
|
||||
title="完成评估"
|
||||
:title="$t('emergency.greentrack.completeEvaluationTitle')"
|
||||
width="400px"
|
||||
>
|
||||
<el-form label-width="120px">
|
||||
<el-form-item label="Door-to-Tx(min)">
|
||||
<el-form-item :label="$t('emergency.greentrack.doorToTxLabel')">
|
||||
<el-input-number
|
||||
v-model="completeForm.doorToTreatmentTime"
|
||||
:min="1"
|
||||
@@ -242,13 +242,13 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="completeVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="doComplete"
|
||||
>
|
||||
提交
|
||||
{{ $t('emergency.common.submit') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -256,21 +256,23 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage,activate,complete,getStats,del} from './api'
|
||||
const {t}=useI18n()
|
||||
const tableData=ref([]);const total=ref(0);const stats=ref({})
|
||||
const addVisible=ref(false);const completeVisible=ref(false)
|
||||
const addForm=ref({patientId:null,diseaseType:'',targetTime:90,doctor:''})
|
||||
const addFormRef=ref(null)
|
||||
const addFormRules={patientId:[{required:true,message:'请选择患者',trigger:'change'}]}
|
||||
const addFormRules={patientId:[{required:true,message:t('emergency.greentrack.selectPatient'),trigger:'change'}]}
|
||||
const completeForm=ref({doorToTreatmentTime:60});let currentId=null
|
||||
const q=ref({pageNo:1,pageSize: 10,diseaseType:'',isAchieved:null})
|
||||
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
|
||||
const refreshStats=async()=>{const r=await getStats({});stats.value=r.data||{}}
|
||||
const showAdd=()=>{addForm.value={patientId:null,diseaseType:'',targetTime:90,doctor:''};addVisible.value=true}
|
||||
const showComplete=(row)=>{currentId=row.id;completeForm.value={doorToTreatmentTime:60};completeVisible.value=true}
|
||||
const submitAdd=async()=>{if(addFormRef.value){const valid=await addFormRef.value.validate().catch(()=>false);if(!valid)return}await activate(addForm.value);ElMessage.success('绿色通道已激活');addVisible.value=false;loadData();refreshStats()}
|
||||
const doComplete=async()=>{await complete(currentId,completeForm.value);ElMessage.success('评估完成');completeVisible.value=false;loadData();refreshStats()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData();refreshStats()}
|
||||
const submitAdd=async()=>{if(addFormRef.value){const valid=await addFormRef.value.validate().catch(()=>false);if(!valid)return}await activate(addForm.value);ElMessage.success(t('emergency.greentrack.activated'));addVisible.value=false;loadData();refreshStats()}
|
||||
const doComplete=async()=>{await complete(currentId,completeForm.value);ElMessage.success(t('emergency.greentrack.evaluationComplete'));completeVisible.value=false;loadData();refreshStats()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success(t('emergency.common.deleted'));loadData();refreshStats()}
|
||||
onMounted(()=>{loadData();refreshStats()})
|
||||
</script>
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">急诊留观管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('emergency.observation.title') }}</span>
|
||||
</div>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.doctor"
|
||||
placeholder="医生"
|
||||
:placeholder="$t('emergency.observation.doctor')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-input
|
||||
v-model="q.bedNo"
|
||||
placeholder="床位号"
|
||||
:placeholder="$t('emergency.observation.bedNo')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.disposition"
|
||||
placeholder="转归"
|
||||
:placeholder="$t('emergency.observation.disposition')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="住院"
|
||||
:label="$t('emergency.observation.dispAdmit')"
|
||||
value="ADMIT"
|
||||
/><el-option
|
||||
label="出院"
|
||||
:label="$t('emergency.observation.dispDischarge')"
|
||||
value="DISCHARGE"
|
||||
/>
|
||||
<el-option
|
||||
label="转科"
|
||||
:label="$t('emergency.observation.dispTransfer')"
|
||||
value="TRANSFER"
|
||||
/><el-option
|
||||
label="死亡"
|
||||
:label="$t('emergency.observation.dispDeath')"
|
||||
value="DEATH"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -41,13 +41,13 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('emergency.common.search') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd"
|
||||
>
|
||||
新增留观
|
||||
{{ $t('emergency.observation.addObservation') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -57,44 +57,44 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientId"
|
||||
label="患者ID"
|
||||
:label="$t('emergency.observation.patientId')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="bedNo"
|
||||
label="床位"
|
||||
:label="$t('emergency.observation.bed')"
|
||||
width="70"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="doctor"
|
||||
label="医生"
|
||||
:label="$t('emergency.observation.doctor')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="diagnosis"
|
||||
label="诊断"
|
||||
:label="$t('emergency.observation.diagnosis')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="observationStart"
|
||||
label="开始时间"
|
||||
:label="$t('emergency.observation.startTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="observationEnd"
|
||||
label="结束时间"
|
||||
:label="$t('emergency.observation.endTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="observationHours"
|
||||
label="观察时长(h)"
|
||||
:label="$t('emergency.observation.duration')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="disposition"
|
||||
label="转归"
|
||||
:label="$t('emergency.observation.disposition')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -104,19 +104,19 @@
|
||||
:type="row.disposition==='ADMIT'?'warning':row.disposition==='DEATH'?'danger':'success'"
|
||||
size="small"
|
||||
>
|
||||
{{ {ADMIT:'住院',DISCHARGE:'出院',TRANSFER:'转科',DEATH:'死亡'}[row.disposition]||row.disposition }}
|
||||
{{ {$t('emergency.observation.dispAdmit'):t('emergency.observation.dispAdmit'),$t('emergency.observation.dispDischarge'):t('emergency.observation.dispDischarge'),$t('emergency.observation.dispTransfer'):t('emergency.observation.dispTransfer'),$t('emergency.observation.dispDeath'):t('emergency.observation.dispDeath')}[row.disposition]||row.disposition }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else
|
||||
type="info"
|
||||
size="small"
|
||||
>
|
||||
观察中
|
||||
{{ $t('emergency.observation.observing') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('emergency.common.operation')"
|
||||
width="200"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -128,7 +128,7 @@
|
||||
size="small"
|
||||
@click="dischargeItem(row)"
|
||||
>
|
||||
出院/转归
|
||||
{{ $t('emergency.observation.dischargeAction') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="info"
|
||||
@@ -136,10 +136,10 @@
|
||||
size="small"
|
||||
@click="showEdit(row)"
|
||||
>
|
||||
编辑
|
||||
{{ $t('emergency.common.edit') }}
|
||||
</el-button>
|
||||
<el-popconfirm
|
||||
title="确定删除?"
|
||||
:title="$t('emergency.common.confirmDelete')"
|
||||
@confirm="delItem(row.id)"
|
||||
>
|
||||
<template #reference>
|
||||
@@ -148,7 +148,7 @@
|
||||
link
|
||||
size="small"
|
||||
>
|
||||
删除
|
||||
{{ $t('emergency.common.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
@@ -165,14 +165,14 @@
|
||||
/>
|
||||
<el-dialog
|
||||
v-model="dlgVisible"
|
||||
:title="isEdit?'编辑留观':'新增留观'"
|
||||
:title="isEdit?$t('emergency.observation.editObservation'):$t('emergency.observation.addObservation')"
|
||||
width="550px"
|
||||
>
|
||||
<el-form
|
||||
:model="form"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="患者ID">
|
||||
<el-form-item :label="$t('emergency.observation.patientId')">
|
||||
<el-input-number
|
||||
v-model="form.patientId"
|
||||
:min="1"
|
||||
@@ -181,13 +181,13 @@
|
||||
<el-form-item label="分诊ID">
|
||||
<el-input-number v-model="form.triageId" />
|
||||
</el-form-item>
|
||||
<el-form-item label="床位号">
|
||||
<el-form-item :label="$t('emergency.observation.bedNoLabel')">
|
||||
<el-input v-model="form.bedNo" />
|
||||
</el-form-item>
|
||||
<el-form-item label="医生">
|
||||
<el-form-item :label="$t('emergency.observation.doctor')">
|
||||
<el-input v-model="form.doctor" />
|
||||
</el-form-item>
|
||||
<el-form-item label="诊断">
|
||||
<el-form-item :label="$t('emergency.observation.diagnosis')">
|
||||
<el-input
|
||||
v-model="form.diagnosis"
|
||||
type="textarea"
|
||||
@@ -196,36 +196,36 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="dlgVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ $t('emergency.common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
v-model="dischargeVisible"
|
||||
title="出院/转归"
|
||||
:title="$t('emergency.observation.dischargeTitle')"
|
||||
width="400px"
|
||||
>
|
||||
<el-form label-width="100px">
|
||||
<el-form-item label="转归">
|
||||
<el-form-item :label="$t('emergency.observation.disposition')">
|
||||
<el-select v-model="dischargeForm.disposition">
|
||||
<el-option
|
||||
label="住院"
|
||||
:label="$t('emergency.observation.dispAdmit')"
|
||||
value="ADMIT"
|
||||
/><el-option
|
||||
label="出院"
|
||||
:label="$t('emergency.observation.dispDischarge')"
|
||||
value="DISCHARGE"
|
||||
/>
|
||||
<el-option
|
||||
label="转科"
|
||||
:label="$t('emergency.observation.dispTransfer')"
|
||||
value="TRANSFER"
|
||||
/><el-option
|
||||
label="死亡"
|
||||
:label="$t('emergency.observation.dispDeath')"
|
||||
value="DEATH"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -233,13 +233,13 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="dischargeVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="doDischarge"
|
||||
>
|
||||
确认
|
||||
{{ $t('emergency.common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -247,8 +247,10 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage,add,discharge,del} from './api'
|
||||
const {t}=useI18n()
|
||||
const tableData=ref([]);const total=ref(0);const dlgVisible=ref(false);const isEdit=ref(false)
|
||||
const dischargeVisible=ref(false);const dischargeForm=ref({disposition:'ADMIT'});let currentId=null
|
||||
const q=ref({pageNo:1,pageSize: 10,doctor:'',bedNo:'',disposition:''})
|
||||
@@ -256,9 +258,9 @@ const form=ref({patientId:null,triageId:null,bedNo:'',doctor:'',diagnosis:''})
|
||||
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
|
||||
const showAdd=()=>{isEdit.value=false;form.value={patientId:null,triageId:null,bedNo:'',doctor:'',diagnosis:''};dlgVisible.value=true}
|
||||
const showEdit=(row)=>{isEdit.value=true;form.value={...row};dlgVisible.value=true}
|
||||
const submitForm=async()=>{if(isEdit.value){await (await import('./api')).update(form.value||{})}else{await add(form.value)}ElMessage.success('操作成功');dlgVisible.value=false;loadData()}
|
||||
const submitForm=async()=>{if(isEdit.value){await (await import('./api')).update(form.value||{})}else{await add(form.value)}ElMessage.success(t('emergency.common.operationSuccess'));dlgVisible.value=false;loadData()}
|
||||
const dischargeItem=(row)=>{currentId=row.id;dischargeForm.value={disposition:'ADMIT'};dischargeVisible.value=true}
|
||||
const doDischarge=async()=>{await discharge({...dischargeForm.value,id:currentId});ElMessage.success('已出院/转归');dischargeVisible.value=false;loadData()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData()}
|
||||
const doDischarge=async()=>{await discharge({...dischargeForm.value,id:currentId});ElMessage.success(t('emergency.observation.discharged'));dischargeVisible.value=false;loadData()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success(t('emergency.common.deleted'));loadData()}
|
||||
onMounted(()=>loadData())
|
||||
</script>
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">抢救管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('emergency.rescue.title') }}</span>
|
||||
</div>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.chiefDoctor"
|
||||
placeholder="主任医师"
|
||||
:placeholder="$t('emergency.rescue.chiefDoctor')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.rescueResult"
|
||||
placeholder="抢救结果"
|
||||
:placeholder="$t('emergency.rescue.rescueResult')"
|
||||
clearable
|
||||
style="width:110px"
|
||||
>
|
||||
<el-option
|
||||
label="成功"
|
||||
:label="$t('emergency.rescue.resultSuccess')"
|
||||
value="SUCCESS"
|
||||
/><el-option
|
||||
label="失败"
|
||||
:label="$t('emergency.rescue.resultFailed')"
|
||||
value="FAILED"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -28,13 +28,13 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('emergency.common.search') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="danger"
|
||||
@click="showAdd"
|
||||
>
|
||||
开始抢救
|
||||
{{ $t('emergency.rescue.startRescue') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -44,50 +44,50 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientId"
|
||||
label="患者ID"
|
||||
:label="$t('emergency.rescue.patientId')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="triageId"
|
||||
label="分诊ID"
|
||||
:label="$t('emergency.rescue.triageId')"
|
||||
width="80"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="rescueStart"
|
||||
label="开始时间"
|
||||
:label="$t('emergency.rescue.startTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="rescueEnd"
|
||||
label="结束时间"
|
||||
:label="$t('emergency.rescue.endTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="chiefDoctor"
|
||||
label="主任医师"
|
||||
:label="$t('emergency.rescue.chiefDoctor')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="rescueTeam"
|
||||
label="抢救团队"
|
||||
:label="$t('emergency.rescue.rescueTeam')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="procedures"
|
||||
label="抢救操作"
|
||||
:label="$t('emergency.rescue.procedures')"
|
||||
min-width="180"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="medications"
|
||||
label="用药"
|
||||
:label="$t('emergency.rescue.medications')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="rescueResult"
|
||||
label="结果"
|
||||
:label="$t('emergency.rescue.result')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -97,26 +97,26 @@
|
||||
type="success"
|
||||
size="small"
|
||||
>
|
||||
成功
|
||||
{{ $t('emergency.rescue.resultSuccess') }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else-if="row.rescueResult==='FAILED'"
|
||||
type="danger"
|
||||
size="small"
|
||||
>
|
||||
失败
|
||||
{{ $t('emergency.rescue.resultFailed') }}
|
||||
</el-tag>
|
||||
<el-tag
|
||||
v-else
|
||||
type="info"
|
||||
size="small"
|
||||
>
|
||||
进行中
|
||||
{{ $t('emergency.rescue.resultInProgress') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('emergency.common.operation')"
|
||||
width="220"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -128,7 +128,7 @@
|
||||
size="small"
|
||||
@click="endRescueItem(row)"
|
||||
>
|
||||
结束抢救
|
||||
{{ $t('emergency.rescue.endRescue') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.rescueEnd && !row.rescueResult"
|
||||
@@ -137,7 +137,7 @@
|
||||
size="small"
|
||||
@click="showResult(row)"
|
||||
>
|
||||
记录结果
|
||||
{{ $t('emergency.rescue.recordResult') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="info"
|
||||
@@ -145,10 +145,10 @@
|
||||
size="small"
|
||||
@click="showEdit(row)"
|
||||
>
|
||||
编辑
|
||||
{{ $t('emergency.common.edit') }}
|
||||
</el-button>
|
||||
<el-popconfirm
|
||||
title="确定删除?"
|
||||
:title="$t('emergency.common.confirmDelete')"
|
||||
@confirm="delItem(row.id)"
|
||||
>
|
||||
<template #reference>
|
||||
@@ -157,7 +157,7 @@
|
||||
link
|
||||
size="small"
|
||||
>
|
||||
删除
|
||||
{{ $t('emergency.common.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
@@ -174,93 +174,93 @@
|
||||
/>
|
||||
<el-dialog
|
||||
v-model="dlgVisible"
|
||||
:title="isEdit?'编辑抢救记录':'开始抢救'"
|
||||
:title="isEdit?$t('emergency.rescue.editRecord'):$t('emergency.rescue.startRescue')"
|
||||
width="600px"
|
||||
>
|
||||
<el-form
|
||||
:model="form"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="患者ID">
|
||||
<el-form-item :label="$t('emergency.rescue.patientId')">
|
||||
<el-input-number
|
||||
v-model="form.patientId"
|
||||
:min="1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="分诊ID">
|
||||
<el-form-item :label="$t('emergency.rescue.triageId')">
|
||||
<el-input-number v-model="form.triageId" />
|
||||
</el-form-item>
|
||||
<el-form-item label="主任医师">
|
||||
<el-form-item :label="$t('emergency.rescue.chiefDoctor')">
|
||||
<el-input v-model="form.chiefDoctor" />
|
||||
</el-form-item>
|
||||
<el-form-item label="抢救团队">
|
||||
<el-form-item :label="$t('emergency.rescue.rescueTeam')">
|
||||
<el-input
|
||||
v-model="form.rescueTeam"
|
||||
placeholder="团队成员"
|
||||
:placeholder="$t('emergency.rescue.teamMembers')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="抢救操作">
|
||||
<el-form-item :label="$t('emergency.rescue.procedures')">
|
||||
<el-input
|
||||
v-model="form.procedures"
|
||||
type="textarea"
|
||||
placeholder="操作记录"
|
||||
:placeholder="$t('emergency.rescue.proceduresPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="用药">
|
||||
<el-form-item :label="$t('emergency.rescue.medications')">
|
||||
<el-input
|
||||
v-model="form.medications"
|
||||
type="textarea"
|
||||
placeholder="用药记录"
|
||||
:placeholder="$t('emergency.rescue.medicationsPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="dlgVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ $t('emergency.common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
v-model="resultVisible"
|
||||
title="记录抢救结果"
|
||||
:title="$t('emergency.rescue.recordResultTitle')"
|
||||
width="400px"
|
||||
>
|
||||
<el-form
|
||||
:model="resultForm"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="抢救结果">
|
||||
<el-form-item :label="$t('emergency.rescue.rescueResult')">
|
||||
<el-radio-group v-model="resultForm.rescueResult">
|
||||
<el-radio value="SUCCESS">
|
||||
成功
|
||||
{{ $t('emergency.rescue.resultSuccess') }}
|
||||
</el-radio><el-radio value="FAILED">
|
||||
失败
|
||||
{{ $t('emergency.rescue.resultFailed') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="转归">
|
||||
<el-form-item :label="$t('emergency.rescue.outcome')">
|
||||
<el-input
|
||||
v-model="resultForm.outcome"
|
||||
type="textarea"
|
||||
placeholder="患者转归"
|
||||
:placeholder="$t('emergency.rescue.outcomePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="resultVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitResult"
|
||||
>
|
||||
提交
|
||||
{{ $t('emergency.common.submit') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -268,8 +268,10 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage,add,endRescue,updateResult,del} from './api'
|
||||
const {t}=useI18n()
|
||||
const tableData=ref([]);const total=ref(0);const dlgVisible=ref(false);const isEdit=ref(false)
|
||||
const resultVisible=ref(false);const resultForm=ref({rescueResult:'SUCCESS',outcome:''});let currentId=null
|
||||
const q=ref({pageNo:1,pageSize: 10,chiefDoctor:'',rescueResult:''})
|
||||
@@ -278,9 +280,9 @@ const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.
|
||||
const showAdd=()=>{isEdit.value=false;form.value={patientId:null,triageId:null,chiefDoctor:'',rescueTeam:'',procedures:'',medications:''};dlgVisible.value=true}
|
||||
const showEdit=(row)=>{isEdit.value=true;form.value={...row};dlgVisible.value=true}
|
||||
const showResult=(row)=>{currentId=row.id;resultForm.value={rescueResult:'SUCCESS',outcome:''};resultVisible.value=true}
|
||||
const submitForm=async()=>{if(isEdit.value){await (await import('./api')).update(form.value||{})}else{await add(form.value)}ElMessage.success('操作成功');dlgVisible.value=false;loadData()}
|
||||
const endRescueItem=async(row)=>{await endRescue(row);ElMessage.success('抢救已结束');loadData()}
|
||||
const submitResult=async()=>{await updateResult(currentId,resultForm.value);ElMessage.success('结果已记录');resultVisible.value=false;loadData()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData()}
|
||||
const submitForm=async()=>{if(isEdit.value){await (await import('./api')).update(form.value||{})}else{await add(form.value)}ElMessage.success(t('emergency.common.operationSuccess'));dlgVisible.value=false;loadData()}
|
||||
const endRescueItem=async(row)=>{await endRescue(row);ElMessage.success(t('emergency.rescue.rescueEnded'));loadData()}
|
||||
const submitResult=async()=>{await updateResult(currentId,resultForm.value);ElMessage.success(t('emergency.rescue.resultRecorded'));resultVisible.value=false;loadData()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success(t('emergency.common.deleted'));loadData()}
|
||||
onMounted(()=>loadData())
|
||||
</script>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">急诊分诊管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('emergency.triage.title') }}</span>
|
||||
</div>
|
||||
<el-card
|
||||
shadow="never"
|
||||
@@ -17,7 +17,7 @@
|
||||
{{ realtime['level'+i+'Waiting']||0 }}
|
||||
</div>
|
||||
<div style="font-size:12px;color:#909399;margin-top:4px">
|
||||
Ⅰ~Ⅴ级
|
||||
{{ $t('emergency.triage.levelRange') }}
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align:center;min-width:80px">
|
||||
@@ -25,7 +25,7 @@
|
||||
{{ realtime.inTreatment||0 }}
|
||||
</div>
|
||||
<div style="font-size:12px;color:#909399;margin-top:4px">
|
||||
就诊中
|
||||
{{ $t('emergency.triage.inTreatment') }}
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align:center;min-width:80px">
|
||||
@@ -33,27 +33,27 @@
|
||||
{{ realtime.todayTotal||0 }}
|
||||
</div>
|
||||
<div style="font-size:12px;color:#909399;margin-top:4px">
|
||||
今日总量
|
||||
{{ $t('emergency.triage.todayTotal') }}
|
||||
</div>
|
||||
</div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="refreshRealtime"
|
||||
>
|
||||
刷新
|
||||
{{ $t('emergency.triage.refresh') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.patientName"
|
||||
placeholder="患者姓名"
|
||||
:placeholder="$t('emergency.triage.patientName')"
|
||||
clearable
|
||||
style="width:130px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.triageLevel"
|
||||
placeholder="分诊级别"
|
||||
:placeholder="$t('emergency.triage.triageLevel')"
|
||||
clearable
|
||||
style="width:110px"
|
||||
>
|
||||
@@ -66,18 +66,18 @@
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.status"
|
||||
placeholder="状态"
|
||||
:placeholder="$t('emergency.common.status')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="待诊"
|
||||
:label="$t('emergency.triage.statusWaiting')"
|
||||
value="WAITING"
|
||||
/><el-option
|
||||
label="就诊中"
|
||||
:label="$t('emergency.triage.statusInTreatment')"
|
||||
value="IN_TREATMENT"
|
||||
/><el-option
|
||||
label="已完成"
|
||||
:label="$t('emergency.triage.statusCompleted')"
|
||||
value="COMPLETED"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -85,13 +85,13 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('emergency.common.search') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd"
|
||||
>
|
||||
新增分诊
|
||||
{{ $t('emergency.triage.addTriage') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -102,12 +102,12 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientName"
|
||||
label="患者"
|
||||
:label="$t('emergency.triage.patient')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="triageLevel"
|
||||
label="级别"
|
||||
:label="$t('emergency.triage.level')"
|
||||
width="60"
|
||||
align="center"
|
||||
>
|
||||
@@ -123,53 +123,53 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="chiefComplaint"
|
||||
label="主诉"
|
||||
:label="$t('emergency.triage.chiefComplaint')"
|
||||
min-width="180"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="temperature"
|
||||
label="体温"
|
||||
:label="$t('emergency.triage.temperature')"
|
||||
width="60"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="pulse"
|
||||
label="脉搏"
|
||||
:label="$t('emergency.triage.pulse')"
|
||||
width="60"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="systolicBp"
|
||||
label="收缩压"
|
||||
:label="$t('emergency.triage.systolicBp')"
|
||||
width="70"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="spo2"
|
||||
label="血氧"
|
||||
:label="$t('emergency.triage.spo2')"
|
||||
width="60"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="consciousness"
|
||||
label="意识"
|
||||
:label="$t('emergency.triage.consciousness')"
|
||||
width="70"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="area"
|
||||
label="区域"
|
||||
:label="$t('emergency.triage.area')"
|
||||
width="80"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="triageNurse"
|
||||
label="分诊护士"
|
||||
:label="$t('emergency.triage.nurse')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="status"
|
||||
label="状态"
|
||||
:label="$t('emergency.common.status')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -178,12 +178,12 @@
|
||||
:type="row.status==='WAITING'?'danger':row.status==='IN_TREATMENT'?'warning':'success'"
|
||||
size="small"
|
||||
>
|
||||
{{ {WAITING:'待诊',IN_TREATMENT:'就诊中',COMPLETED:'已完成'}[row.status]||row.status }}
|
||||
{{ {$t('emergency.triage.statusWaiting'):'待诊',$t('emergency.triage.statusInTreatment'):'就诊中',$t('emergency.triage.statusCompleted'):'已完成'}[row.status]||row.status }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('emergency.common.operation')"
|
||||
width="200"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -195,7 +195,7 @@
|
||||
size="small"
|
||||
@click="startTreatmentItem(row.id)"
|
||||
>
|
||||
叫号
|
||||
{{ $t('emergency.triage.callNumber') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.status==='IN_TREATMENT'"
|
||||
@@ -204,7 +204,7 @@
|
||||
size="small"
|
||||
@click="completeItem(row.id)"
|
||||
>
|
||||
完成
|
||||
{{ $t('emergency.common.complete') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="info"
|
||||
@@ -212,10 +212,10 @@
|
||||
size="small"
|
||||
@click="showEdit(row)"
|
||||
>
|
||||
编辑
|
||||
{{ $t('emergency.common.edit') }}
|
||||
</el-button>
|
||||
<el-popconfirm
|
||||
title="确定删除?"
|
||||
:title="$t('emergency.common.confirmDelete')"
|
||||
@confirm="delItem(row.id)"
|
||||
>
|
||||
<template #reference>
|
||||
@@ -224,7 +224,7 @@
|
||||
link
|
||||
size="small"
|
||||
>
|
||||
删除
|
||||
{{ $t('emergency.common.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
@@ -241,130 +241,130 @@
|
||||
/>
|
||||
<el-dialog
|
||||
v-model="dlgVisible"
|
||||
:title="isEdit?'编辑分诊':'新增分诊'"
|
||||
:title="isEdit?$t('emergency.triage.editTriage'):$t('emergency.triage.addTriage')"
|
||||
width="600px"
|
||||
>
|
||||
<el-form
|
||||
:model="form"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="患者ID">
|
||||
<el-form-item :label="$t('emergency.triage.patientId')">
|
||||
<el-input-number
|
||||
v-model="form.patientId"
|
||||
:min="1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="患者姓名">
|
||||
<el-form-item :label="$t('emergency.triage.patientName')">
|
||||
<el-input v-model="form.patientName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="分诊级别">
|
||||
<el-form-item :label="$t('emergency.triage.triageLevel')">
|
||||
<el-radio-group v-model="form.triageLevel">
|
||||
<el-radio :value="1">
|
||||
<span style="color:#F56C6C;font-weight:bold">Ⅰ级 濒死</span>
|
||||
<span style="color:#F56C6C;font-weight:bold">{{ $t('emergency.triage.level1') }}</span>
|
||||
</el-radio>
|
||||
<el-radio :value="2">
|
||||
<span style="color:#E6A23C;font-weight:bold">Ⅱ级 危重</span>
|
||||
<span style="color:#E6A23C;font-weight:bold">{{ $t('emergency.triage.level2') }}</span>
|
||||
</el-radio>
|
||||
<el-radio :value="3">
|
||||
<span style="color:#409EFF">Ⅲ级 急症</span>
|
||||
<span style="color:#409EFF">{{ $t('emergency.triage.level3') }}</span>
|
||||
</el-radio>
|
||||
<el-radio :value="4">
|
||||
<span style="color:#67C23A">Ⅳ级 亚急</span>
|
||||
<span style="color:#67C23A">{{ $t('emergency.triage.level4') }}</span>
|
||||
</el-radio>
|
||||
<el-radio :value="5">
|
||||
<span style="color:#909399">Ⅴ级 非紧急</span>
|
||||
<span style="color:#909399">{{ $t('emergency.triage.level5') }}</span>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="主诉">
|
||||
<el-form-item :label="$t('emergency.triage.chiefComplaint')">
|
||||
<el-input
|
||||
v-model="form.chiefComplaint"
|
||||
type="textarea"
|
||||
placeholder="主要症状描述"
|
||||
:placeholder="$t('emergency.triage.chiefComplaintPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="体温">
|
||||
<el-form-item :label="$t('emergency.triage.temperature')">
|
||||
<el-input-number
|
||||
v-model="form.temperature"
|
||||
:precision="1"
|
||||
:step="0.1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="脉搏">
|
||||
<el-form-item :label="$t('emergency.triage.pulse')">
|
||||
<el-input-number
|
||||
v-model="form.pulse"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="呼吸">
|
||||
<el-form-item :label="$t('emergency.triage.respiration')">
|
||||
<el-input-number
|
||||
v-model="form.respiration"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="收缩压">
|
||||
<el-form-item :label="$t('emergency.triage.systolicBp')">
|
||||
<el-input-number
|
||||
v-model="form.systolicBp"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="舒张压">
|
||||
<el-form-item :label="$t('emergency.triage.diastolicBp')">
|
||||
<el-input-number
|
||||
v-model="form.diastolicBp"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="血氧">
|
||||
<el-form-item :label="$t('emergency.triage.spo2')">
|
||||
<el-input-number
|
||||
v-model="form.spo2"
|
||||
:min="0"
|
||||
:max="100"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="意识状态">
|
||||
<el-form-item :label="$t('emergency.triage.consciousnessState')">
|
||||
<el-select v-model="form.consciousness">
|
||||
<el-option
|
||||
label="清醒"
|
||||
:label="$t('emergency.triage.consciousAwake')"
|
||||
value="清醒"
|
||||
/><el-option
|
||||
label="嗜睡"
|
||||
:label="$t('emergency.triage.consciousDrowsy')"
|
||||
value="嗜睡"
|
||||
/><el-option
|
||||
label="昏迷"
|
||||
:label="$t('emergency.triage.consciousComa')"
|
||||
value="昏迷"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分诊区域">
|
||||
<el-form-item :label="$t('emergency.triage.triageArea')">
|
||||
<el-select v-model="form.area">
|
||||
<el-option
|
||||
label="抢救区"
|
||||
:label="$t('emergency.triage.areaRescue')"
|
||||
value="抢救区"
|
||||
/><el-option
|
||||
label="留观区"
|
||||
:label="$t('emergency.triage.areaObservation')"
|
||||
value="留观区"
|
||||
/><el-option
|
||||
label="诊室"
|
||||
:label="$t('emergency.triage.areaConsultRoom')"
|
||||
value="诊室"
|
||||
/><el-option
|
||||
label="普通区"
|
||||
:label="$t('emergency.triage.areaGeneral')"
|
||||
value="普通区"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分诊护士">
|
||||
<el-form-item :label="$t('emergency.triage.nurse')">
|
||||
<el-input v-model="form.triageNurse" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="dlgVisible=false">
|
||||
取消
|
||||
{{ $t('emergency.common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ $t('emergency.common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -372,8 +372,10 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage,getRealtime,add,update,startTreatment,complete,del} from './api'
|
||||
const {t}=useI18n()
|
||||
const tableData=ref([]);const total=ref(0);const dlgVisible=ref(false);const isEdit=ref(false);const realtime=ref({})
|
||||
const q=ref({pageNo:1,pageSize: 10,patientName:'',triageLevel:null,status:''})
|
||||
const form=ref({patientId:null,patientName:'',triageLevel:3,chiefComplaint:'',temperature:36.5,pulse:80,respiration:20,systolicBp:120,diastolicBp:80,spo2:98,consciousness:'清醒',area:'诊室',triageNurse:''})
|
||||
@@ -381,10 +383,10 @@ const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.
|
||||
const refreshRealtime=async()=>{const r=await getRealtime();realtime.value=r.data||{}}
|
||||
const showAdd=()=>{isEdit.value=false;form.value={patientId:null,patientName:'',triageLevel:3,chiefComplaint:'',temperature:36.5,pulse:80,respiration:20,systolicBp:120,diastolicBp:80,spo2:98,consciousness:'清醒',area:'诊室',triageNurse:''};dlgVisible.value=true}
|
||||
const showEdit=(row)=>{isEdit.value=true;form.value={...row};dlgVisible.value=true}
|
||||
const submitForm=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success('操作成功');dlgVisible.value=false;loadData();refreshRealtime()}
|
||||
const startTreatmentItem=async(id)=>{await startTreatment(id);ElMessage.success('已叫号');loadData();refreshRealtime()}
|
||||
const completeItem=async(id)=>{await complete(id);ElMessage.success('已完成');loadData();refreshRealtime()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData();refreshRealtime()}
|
||||
const submitForm=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success(t('emergency.common.operationSuccess'));dlgVisible.value=false;loadData();refreshRealtime()}
|
||||
const startTreatmentItem=async(id)=>{await startTreatment(id);ElMessage.success(t('emergency.triage.called'));loadData();refreshRealtime()}
|
||||
const completeItem=async(id)=>{await complete(id);ElMessage.success(t('emergency.common.completed'));loadData();refreshRealtime()}
|
||||
const delItem=async(id)=>{await del(id);ElMessage.success(t('emergency.common.deleted'));loadData();refreshRealtime()}
|
||||
const rowClassName=({row})=>{if(row.triageLevel===1)return 'emergency-row-critical';if(row.triageLevel===2)return 'emergency-row-severe';return ''}
|
||||
onMounted(()=>{loadData();refreshRealtime()})
|
||||
</script>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="app-container">
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<span>抗菌药物使用管理</span>
|
||||
<span>{{ $t('infection.antibiotic.title') }}</span>
|
||||
</template>
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
@@ -12,63 +12,63 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientName"
|
||||
label="患者姓名"
|
||||
:label="$t('infection.antibiotic.patientName')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="medicalNo"
|
||||
label="病历号"
|
||||
:label="$t('infection.antibiotic.medicalNo')"
|
||||
width="140"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="drugName"
|
||||
label="抗菌药物名称"
|
||||
:label="$t('infection.antibiotic.drugName')"
|
||||
min-width="180"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="dosage"
|
||||
label="剂量"
|
||||
:label="$t('infection.antibiotic.dosage')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="usage"
|
||||
label="用法"
|
||||
:label="$t('infection.antibiotic.usage')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="course"
|
||||
label="疗程(天)"
|
||||
:label="$t('infection.antibiotic.course')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="level"
|
||||
label="抗菌药物级别"
|
||||
:label="$t('infection.antibiotic.level')"
|
||||
width="140"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.level === '限制级' ? 'warning' : row.level === '特殊级' ? 'danger' : 'info'">
|
||||
{{ row.level }}
|
||||
{{ levelText(row.level) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="indication"
|
||||
label="适应症"
|
||||
:label="$t('infection.antibiotic.indication')"
|
||||
min-width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="doctorName"
|
||||
label="开单医生"
|
||||
:label="$t('infection.antibiotic.doctorName')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="deptName"
|
||||
label="科室"
|
||||
:label="$t('infection.antibiotic.deptName')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="useDate"
|
||||
label="使用日期"
|
||||
:label="$t('infection.antibiotic.useDate')"
|
||||
width="120"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -78,10 +78,18 @@
|
||||
|
||||
<script setup name="AntibioticUsage">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
|
||||
function levelText(val) {
|
||||
const map = { '限制级': 'infection.antibiotic.levelRestricted', '特殊级': 'infection.antibiotic.levelSpecial' }
|
||||
return map[val] ? t(map[val]) : t('infection.antibiotic.levelNormal')
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
// TODO: 接入后端API获取抗菌药物使用数据
|
||||
})
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px">
|
||||
<span style="font-size:18px;font-weight:bold">院感病例监测</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ t('infection.case.title') }}</span>
|
||||
</div>
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-input
|
||||
v-model="q.patientName"
|
||||
placeholder="患者姓名"
|
||||
:placeholder="t('infection.case.patientName')"
|
||||
clearable
|
||||
style="width:130px"
|
||||
/>
|
||||
<el-select
|
||||
v-model="q.infectionType"
|
||||
placeholder="感染类型"
|
||||
:placeholder="t('infection.case.infectionType')"
|
||||
clearable
|
||||
style="width:110px"
|
||||
>
|
||||
<el-option
|
||||
label="医院感染"
|
||||
:label="t('infection.case.nosocomial')"
|
||||
value="NOSOCOMIAL"
|
||||
/><el-option
|
||||
label="社区感染"
|
||||
:label="t('infection.case.community')"
|
||||
value="COMMUNITY"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.status"
|
||||
placeholder="状态"
|
||||
:placeholder="t('infection.case.status')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="已上报"
|
||||
:label="t('infection.case.reported')"
|
||||
value="REPORTED"
|
||||
/><el-option
|
||||
label="已确认"
|
||||
:label="t('infection.case.confirmed')"
|
||||
value="CONFIRMED"
|
||||
/><el-option
|
||||
label="已拒绝"
|
||||
:label="t('infection.case.rejected')"
|
||||
value="REJECTED"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -45,7 +45,7 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ t('common.search') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -55,12 +55,12 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientName"
|
||||
label="患者"
|
||||
:label="t('infection.case.patient')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="infectionType"
|
||||
label="类型"
|
||||
:label="t('infection.case.type')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -69,33 +69,33 @@
|
||||
:type="row.infectionType==='NOSOCOMIAL'?'danger':''"
|
||||
size="small"
|
||||
>
|
||||
{{ {NOSOCOMIAL:'医院感染',COMMUNITY:'社区感染'}[row.infectionType]||row.infectionType }}
|
||||
{{ infectionTypeText(row.infectionType) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="infectionSite"
|
||||
label="感染部位"
|
||||
:label="t('infection.case.infectionSite')"
|
||||
width="110"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="pathogen"
|
||||
label="病原体"
|
||||
:label="t('infection.case.pathogen')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="reporterName"
|
||||
label="上报人"
|
||||
:label="t('infection.case.reporter')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="reportTime"
|
||||
label="上报时间"
|
||||
:label="t('infection.case.reportTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="status"
|
||||
label="状态"
|
||||
:label="t('infection.case.status')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -104,13 +104,13 @@
|
||||
:type="row.status==='CONFIRMED'?'success':row.status==='REJECTED'?'danger':'warning'"
|
||||
size="small"
|
||||
>
|
||||
{{ {REPORTED:'已上报',CONFIRMED:'已确认',REJECTED:'已拒绝'}[row.status]||row.status }}
|
||||
{{ statusText(row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="reviewResult"
|
||||
label="审核意见"
|
||||
:label="t('infection.case.reviewResult')"
|
||||
width="100"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -126,9 +126,24 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import {ref,onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {getPage} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const tableData=ref([]);const total=ref(0)
|
||||
const q=ref({pageNo:1,pageSize: 10,patientName:'',infectionType:'',status:''})
|
||||
|
||||
function infectionTypeText(val) {
|
||||
const map = {NOSOCOMIAL: t('infection.case.nosocomial'), COMMUNITY: t('infection.case.community')}
|
||||
return map[val] || val
|
||||
}
|
||||
|
||||
function statusText(val) {
|
||||
const map = {REPORTED: t('infection.case.reported'), CONFIRMED: t('infection.case.confirmed'), REJECTED: t('infection.case.rejected')}
|
||||
return map[val] || val
|
||||
}
|
||||
|
||||
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
|
||||
onMounted(()=>loadData())
|
||||
</script>
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<template>
|
||||
<div class="infection-detail-container">
|
||||
<div class="page-header">
|
||||
<span class="tab-title">院感监测统计</span>
|
||||
<span class="tab-title">{{ $t('infection.detail.title') }}</span>
|
||||
</div>
|
||||
|
||||
<el-card shadow="never" style="margin-bottom: 16px">
|
||||
<template #header>
|
||||
<span>查询条件</span>
|
||||
<span>{{ $t('infection.detail.queryConditions') }}</span>
|
||||
</template>
|
||||
<el-form :model="queryParams" inline>
|
||||
<el-form-item label="科室">
|
||||
<el-input v-model="queryParams.deptId" placeholder="科室ID" clearable style="width: 160px" />
|
||||
<el-form-item :label="$t('infection.detail.department')">
|
||||
<el-input v-model="queryParams.deptId" :placeholder="$t('infection.detail.deptIdPlaceholder')" clearable style="width: 160px" />
|
||||
</el-form-item>
|
||||
<el-form-item label="开始日期">
|
||||
<el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" placeholder="开始日期" />
|
||||
<el-form-item :label="$t('infection.detail.startDate')">
|
||||
<el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('infection.detail.startDate')" />
|
||||
</el-form-item>
|
||||
<el-form-item label="结束日期">
|
||||
<el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" placeholder="结束日期" />
|
||||
<el-form-item :label="$t('infection.detail.endDate')">
|
||||
<el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('infection.detail.endDate')" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="loadData" :loading="loading">查询</el-button>
|
||||
<el-button type="primary" @click="loadData" :loading="loading">{{ $t('common.search') }}</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
@@ -29,7 +29,7 @@
|
||||
<el-card shadow="never">
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" style="color: #409eff">{{ rateData.totalCases || 0 }}</div>
|
||||
<div class="stat-label">总病例数</div>
|
||||
<div class="stat-label">{{ $t('infection.detail.totalCases') }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@@ -37,7 +37,7 @@
|
||||
<el-card shadow="never">
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" style="color: #e6a23c">{{ rateData.reportedCases || 0 }}</div>
|
||||
<div class="stat-label">已上报</div>
|
||||
<div class="stat-label">{{ $t('infection.detail.reportedCases') }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@@ -45,7 +45,7 @@
|
||||
<el-card shadow="never">
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" style="color: #67c23a">{{ rateData.confirmedCases || 0 }}</div>
|
||||
<div class="stat-label">已确认</div>
|
||||
<div class="stat-label">{{ $t('infection.detail.confirmedCases') }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@@ -53,7 +53,7 @@
|
||||
<el-card shadow="never">
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" style="color: #f56c6c">{{ rateData.infectionRate || 0 }}%</div>
|
||||
<div class="stat-label">感染率</div>
|
||||
<div class="stat-label">{{ $t('infection.detail.infectionRate') }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@@ -62,32 +62,32 @@
|
||||
<el-row :gutter="16" style="margin-bottom: 16px">
|
||||
<el-col :span="12">
|
||||
<el-card shadow="never">
|
||||
<template #header><span>按感染类型分布</span></template>
|
||||
<template #header><span>{{ $t('infection.detail.byTypeDistribution') }}</span></template>
|
||||
<el-table :data="typeList" border stripe size="small">
|
||||
<el-table-column prop="type" label="感染类型" />
|
||||
<el-table-column prop="count" label="病例数" width="100" />
|
||||
<el-table-column prop="type" :label="$t('infection.detail.infectionType')" />
|
||||
<el-table-column prop="count" :label="$t('infection.detail.caseCount')" width="100" />
|
||||
</el-table>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-card shadow="never">
|
||||
<template #header><span>按感染部位分布</span></template>
|
||||
<template #header><span>{{ $t('infection.detail.bySiteDistribution') }}</span></template>
|
||||
<el-table :data="siteList" border stripe size="small">
|
||||
<el-table-column prop="site" label="感染部位" />
|
||||
<el-table-column prop="count" label="病例数" width="100" />
|
||||
<el-table-column prop="site" :label="$t('infection.detail.infectionSite')" />
|
||||
<el-table-column prop="count" :label="$t('infection.detail.caseCount')" width="100" />
|
||||
</el-table>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-card shadow="never">
|
||||
<template #header><span>感染趋势</span></template>
|
||||
<template #header><span>{{ $t('infection.detail.trendTitle') }}</span></template>
|
||||
<el-table :data="trendData" v-loading="loading" border stripe style="width: 100%">
|
||||
<el-table-column prop="date" label="日期" width="120" />
|
||||
<el-table-column prop="total" label="总计" width="80" />
|
||||
<el-table-column prop="REPORTED" label="已上报" width="80" />
|
||||
<el-table-column prop="CONFIRMED" label="已确认" width="80" />
|
||||
<el-table-column prop="REJECTED" label="已驳回" width="80" />
|
||||
<el-table-column prop="date" :label="$t('infection.detail.date')" width="120" />
|
||||
<el-table-column prop="total" :label="$t('infection.detail.total')" width="80" />
|
||||
<el-table-column prop="REPORTED" :label="$t('infection.detail.reported')" width="80" />
|
||||
<el-table-column prop="CONFIRMED" :label="$t('infection.detail.confirmed')" width="80" />
|
||||
<el-table-column prop="REJECTED" :label="$t('infection.detail.rejected')" width="80" />
|
||||
</el-table>
|
||||
</el-card>
|
||||
</div>
|
||||
@@ -95,9 +95,12 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getInfectionRateByDept, getInfectionTrend } from '@/api/infection/detail'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const queryParams = reactive({
|
||||
deptId: '',
|
||||
@@ -133,7 +136,7 @@ const loadData = async () => {
|
||||
rateData.value = rateRes.data || {}
|
||||
trendData.value = trendRes.data || []
|
||||
} catch (e) {
|
||||
ElMessage.error('加载失败: ' + (e.message || '未知错误'))
|
||||
ElMessage.error(t('infection.detail.loadFailed') + ': ' + (e.message || t('infection.detail.unknownError')))
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">环境监测</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('infection.environment.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ $t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增监测
|
||||
{{ $t('infection.environment.addMonitor') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
@click="showRate = true"
|
||||
>
|
||||
查看合格率
|
||||
{{ $t('infection.environment.viewRate') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -57,43 +57,43 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.sampleType"
|
||||
placeholder="采样类型"
|
||||
:placeholder="$t('infection.environment.sampleType')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option
|
||||
label="空气"
|
||||
:label="$t('infection.environment.sampleAir')"
|
||||
value="AIR"
|
||||
/>
|
||||
<el-option
|
||||
label="物体表面"
|
||||
:label="$t('infection.environment.sampleSurface')"
|
||||
value="SURFACE"
|
||||
/>
|
||||
<el-option
|
||||
label="手采样"
|
||||
:label="$t('infection.environment.sampleHand')"
|
||||
value="HAND"
|
||||
/>
|
||||
<el-option
|
||||
label="使用中消毒液"
|
||||
:label="$t('infection.environment.sampleDisinfectant')"
|
||||
value="DISINFECTANT"
|
||||
/>
|
||||
<el-option
|
||||
label="医疗器械"
|
||||
:label="$t('infection.environment.sampleDevice')"
|
||||
value="DEVICE"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.monitorResult"
|
||||
placeholder="监测结果"
|
||||
:placeholder="$t('infection.environment.monitorResult')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="合格"
|
||||
:label="$t('infection.environment.resultQualified')"
|
||||
value="QUALIFIED"
|
||||
/>
|
||||
<el-option
|
||||
label="不合格"
|
||||
:label="$t('infection.environment.resultUnqualified')"
|
||||
value="UNQUALIFIED"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -101,10 +101,10 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ $t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="sampleType"
|
||||
label="采样类型"
|
||||
:label="$t('infection.environment.sampleType')"
|
||||
width="110"
|
||||
align="center"
|
||||
>
|
||||
@@ -132,17 +132,17 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="sampleLocation"
|
||||
label="采样地点"
|
||||
:label="$t('infection.environment.sampleLocation')"
|
||||
min-width="150"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="sampleDate"
|
||||
label="采样日期"
|
||||
:label="$t('infection.environment.sampleDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="monitorResult"
|
||||
label="监测结果"
|
||||
:label="$t('infection.environment.monitorResult')"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
@@ -151,25 +151,25 @@
|
||||
:type="row.monitorResult==='QUALIFIED'?'success':'danger'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.monitorResult==='QUALIFIED'?'合格':'不合格' }}
|
||||
{{ row.monitorResult==='QUALIFIED' ? $t('infection.environment.resultQualified') : $t('infection.environment.resultUnqualified') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="bacterialCount"
|
||||
label="菌落数(CFU)"
|
||||
:label="$t('infection.environment.bacterialCount')"
|
||||
width="110"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="standardLimit"
|
||||
label="标准限值"
|
||||
:label="$t('infection.environment.standardLimit')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="exceedRate"
|
||||
label="超标率"
|
||||
:label="$t('infection.environment.exceedRate')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -181,12 +181,12 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="monitorPerson"
|
||||
label="监测人"
|
||||
:label="$t('infection.environment.monitorPerson')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="记录时间"
|
||||
:label="$t('infection.environment.recordTime')"
|
||||
width="160"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -204,7 +204,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增环境监测"
|
||||
:title="$t('infection.environment.addDialogTitle')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -213,95 +213,95 @@
|
||||
label-width="110px"
|
||||
>
|
||||
<el-form-item
|
||||
label="采样类型"
|
||||
:label="$t('infection.environment.sampleType')"
|
||||
required
|
||||
>
|
||||
<el-select
|
||||
v-model="formData.sampleType"
|
||||
placeholder="请选择"
|
||||
:placeholder="$t('infection.environment.placeholderSelect')"
|
||||
>
|
||||
<el-option
|
||||
label="空气"
|
||||
:label="$t('infection.environment.sampleAir')"
|
||||
value="AIR"
|
||||
/>
|
||||
<el-option
|
||||
label="物体表面"
|
||||
:label="$t('infection.environment.sampleSurface')"
|
||||
value="SURFACE"
|
||||
/>
|
||||
<el-option
|
||||
label="手采样"
|
||||
:label="$t('infection.environment.sampleHand')"
|
||||
value="HAND"
|
||||
/>
|
||||
<el-option
|
||||
label="使用中消毒液"
|
||||
:label="$t('infection.environment.sampleDisinfectant')"
|
||||
value="DISINFECTANT"
|
||||
/>
|
||||
<el-option
|
||||
label="医疗器械"
|
||||
:label="$t('infection.environment.sampleDevice')"
|
||||
value="DEVICE"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="采样地点"
|
||||
:label="$t('infection.environment.sampleLocation')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.sampleLocation"
|
||||
placeholder="请输入采样地点"
|
||||
:placeholder="$t('infection.environment.placeholderLocation')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="采样日期"
|
||||
:label="$t('infection.environment.sampleDate')"
|
||||
required
|
||||
>
|
||||
<el-date-picker
|
||||
v-model="formData.sampleDate"
|
||||
type="date"
|
||||
placeholder="选择日期"
|
||||
:placeholder="$t('infection.environment.placeholderDate')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="监测结果"
|
||||
:label="$t('infection.environment.monitorResult')"
|
||||
required
|
||||
>
|
||||
<el-radio-group v-model="formData.monitorResult">
|
||||
<el-radio value="QUALIFIED">
|
||||
合格
|
||||
{{ $t('infection.environment.resultQualified') }}
|
||||
</el-radio>
|
||||
<el-radio value="UNQUALIFIED">
|
||||
不合格
|
||||
{{ $t('infection.environment.resultUnqualified') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="菌落数(CFU)">
|
||||
<el-form-item :label="$t('infection.environment.bacterialCount')">
|
||||
<el-input-number
|
||||
v-model="formData.bacterialCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="标准限值">
|
||||
<el-form-item :label="$t('infection.environment.standardLimit')">
|
||||
<el-input-number
|
||||
v-model="formData.standardLimit"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="监测人">
|
||||
<el-form-item :label="$t('infection.environment.monitorPerson')">
|
||||
<el-input
|
||||
v-model="formData.monitorPerson"
|
||||
placeholder="请输入监测人"
|
||||
:placeholder="$t('infection.environment.placeholderMonitor')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ $t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ $t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -309,7 +309,7 @@
|
||||
<!-- 合格率统计弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showRate"
|
||||
title="环境监测合格率统计"
|
||||
:title="$t('infection.environment.rateDialogTitle')"
|
||||
width="700px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -317,16 +317,16 @@
|
||||
:column="2"
|
||||
border
|
||||
>
|
||||
<el-descriptions-item label="总监测数">
|
||||
<el-descriptions-item :label="$t('infection.environment.rateTotal')">
|
||||
{{ qualifyRate.total || 0 }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="合格数">
|
||||
<el-descriptions-item :label="$t('infection.environment.rateQualified')">
|
||||
{{ qualifyRate.qualified || 0 }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="不合格数">
|
||||
<el-descriptions-item :label="$t('infection.environment.rateUnqualified')">
|
||||
{{ qualifyRate.unqualified || 0 }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="合格率">
|
||||
<el-descriptions-item :label="$t('infection.environment.ratePercent')">
|
||||
<el-tag
|
||||
:type="parseFloat(qualifyRate.rate || '0') >= 95 ? 'success' : 'danger'"
|
||||
size="large"
|
||||
@@ -337,7 +337,7 @@
|
||||
</el-descriptions>
|
||||
<template #footer>
|
||||
<el-button @click="showRate = false">
|
||||
关闭
|
||||
{{ $t('infection.environment.close') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -345,10 +345,13 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {ref, reactive, computed, onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add, getQualifyRate} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
@@ -356,13 +359,15 @@ const showAdd = ref(false)
|
||||
const showRate = ref(false)
|
||||
const qualifyRate = ref({})
|
||||
|
||||
const statCards = ref([
|
||||
{label:'总监测数', value:0, color:'#409eff'},
|
||||
{label:'合格数', value:0, color:'#67c23a'},
|
||||
{label:'不合格数', value:0, color:'#f56c6c'},
|
||||
{label:'合格率', value:'0%', color:'#e6a23c'},
|
||||
{label:'采样类型', value:0, color:'#909399'},
|
||||
{label:'平均菌落', value:0, color:'#409eff'}
|
||||
const rawStats = ref({total:0, qualified:0, unqualified:0, rate:'0%', typeCount:0, avgBacterial:0})
|
||||
|
||||
const statCards = computed(() => [
|
||||
{label:t('infection.environment.statTotal'), value:rawStats.value.total, color:'#409eff'},
|
||||
{label:t('infection.environment.statQualified'), value:rawStats.value.qualified, color:'#67c23a'},
|
||||
{label:t('infection.environment.statUnqualified'), value:rawStats.value.unqualified, color:'#f56c6c'},
|
||||
{label:t('infection.environment.statRate'), value:rawStats.value.rate, color:'#e6a23c'},
|
||||
{label:t('infection.environment.statSampleTypes'), value:rawStats.value.typeCount, color:'#909399'},
|
||||
{label:t('infection.environment.statAvgBacterial'), value:rawStats.value.avgBacterial, color:'#409eff'}
|
||||
])
|
||||
|
||||
const q = ref({pageNo:1, pageSize: 10, sampleType:'', monitorResult:''})
|
||||
@@ -371,11 +376,12 @@ const formData = reactive({
|
||||
bacterialCount:0, standardLimit:0, monitorPerson:''
|
||||
})
|
||||
|
||||
function sampleTypeText(t) {
|
||||
return {AIR:'空气',SURFACE:'物体表面',HAND:'手采样',DISINFECTANT:'消毒液',DEVICE:'医疗器械'}[t] || t
|
||||
function sampleTypeText(val) {
|
||||
const map = {AIR:'infection.environment.sampleAir',SURFACE:'infection.environment.sampleSurface',HAND:'infection.environment.sampleHand',DISINFECTANT:'infection.environment.sampleDisinfectant',DEVICE:'infection.environment.sampleDevice'}
|
||||
return map[val] ? t(map[val]) : val
|
||||
}
|
||||
function sampleTagType(t) {
|
||||
return {AIR:'info',SURFACE:'',HAND:'success',DISINFECTANT:'warning',DEVICE:'danger'}[t] || 'info'
|
||||
function sampleTagType(val) {
|
||||
return {AIR:'info',SURFACE:'',HAND:'success',DISINFECTANT:'warning',DEVICE:'danger'}[val] || 'info'
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
@@ -391,12 +397,14 @@ async function loadData() {
|
||||
totalBacterial += (row.bacterialCount || 0)
|
||||
typeSet.add(row.sampleType)
|
||||
})
|
||||
statCards.value[0].value = total.value
|
||||
statCards.value[1].value = qualified
|
||||
statCards.value[2].value = unqualified
|
||||
statCards.value[3].value = total.value > 0 ? Math.round(qualified * 100 / total.value) + '%' : '0%'
|
||||
statCards.value[4].value = typeSet.size
|
||||
statCards.value[5].value = total.value > 0 ? Math.round(totalBacterial / total.value) : 0
|
||||
rawStats.value = {
|
||||
total: total.value,
|
||||
qualified,
|
||||
unqualified,
|
||||
rate: total.value > 0 ? Math.round(qualified * 100 / total.value) + '%' : '0%',
|
||||
typeCount: typeSet.size,
|
||||
avgBacterial: total.value > 0 ? Math.round(totalBacterial / total.value) : 0
|
||||
}
|
||||
} finally { loading.value = false }
|
||||
}
|
||||
|
||||
@@ -407,7 +415,7 @@ function resetQuery() {
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.environment.addSuccess'))
|
||||
showAdd.value = false
|
||||
loadData()
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">职业暴露管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ $t('infection.exposure.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ $t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增报告
|
||||
{{ $t('infection.exposure.addReport') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@
|
||||
{{ stats.total || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
总暴露数
|
||||
{{ $t('infection.exposure.statTotal') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -48,7 +48,7 @@
|
||||
{{ stats.blood || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
血液暴露
|
||||
{{ $t('infection.exposure.statBlood') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -63,7 +63,7 @@
|
||||
{{ stats.bodyFluid || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
体液暴露
|
||||
{{ $t('infection.exposure.statBodyFluid') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -78,7 +78,7 @@
|
||||
{{ stats.followupRate || '0%' }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
随访率
|
||||
{{ $t('infection.exposure.statFollowupRate') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -89,24 +89,24 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.exposureType"
|
||||
placeholder="暴露类型"
|
||||
:placeholder="$t('infection.exposure.exposureType')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option
|
||||
label="血液暴露"
|
||||
:label="$t('infection.exposure.typeBlood')"
|
||||
value="BLOOD"
|
||||
/>
|
||||
<el-option
|
||||
label="体液暴露"
|
||||
:label="$t('infection.exposure.typeBodyFluid')"
|
||||
value="BODY_FLUID"
|
||||
/>
|
||||
<el-option
|
||||
label="针刺伤"
|
||||
:label="$t('infection.exposure.typeNeedleStick')"
|
||||
value="NEEDLE_STICK"
|
||||
/>
|
||||
<el-option
|
||||
label="化学暴露"
|
||||
:label="$t('infection.exposure.typeChemical')"
|
||||
value="CHEMICAL"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -114,10 +114,10 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ $t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ $t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -130,17 +130,17 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="staffName"
|
||||
label="暴露人员"
|
||||
:label="$t('infection.exposure.staffName')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.exposure.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="exposureType"
|
||||
label="暴露类型"
|
||||
:label="$t('infection.exposure.exposureType')"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
@@ -155,22 +155,22 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="exposureSource"
|
||||
label="暴露源"
|
||||
:label="$t('infection.exposure.exposureSource')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="exposureDate"
|
||||
label="暴露时间"
|
||||
:label="$t('infection.exposure.exposureDate')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="exposureSite"
|
||||
label="暴露部位"
|
||||
:label="$t('infection.exposure.exposureSite')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="exposureLevel"
|
||||
label="暴露程度"
|
||||
:label="$t('infection.exposure.exposureLevel')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -185,7 +185,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="status"
|
||||
label="处理状态"
|
||||
:label="$t('infection.exposure.status')"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
@@ -194,13 +194,13 @@
|
||||
:type="row.status==='COMPLETED'?'success':row.status==='IN_PROGRESS'?'warning':'info'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.status==='COMPLETED'?'已完成':row.status==='IN_PROGRESS'?'处理中':'待处理' }}
|
||||
{{ statusText(row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="报告时间"
|
||||
:label="$t('infection.exposure.reportTime')"
|
||||
width="160"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -218,7 +218,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增职业暴露报告"
|
||||
:title="$t('infection.exposure.addDialogTitle')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -227,89 +227,89 @@
|
||||
label-width="110px"
|
||||
>
|
||||
<el-form-item
|
||||
label="暴露人员"
|
||||
:label="$t('infection.exposure.staffName')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.staffName"
|
||||
placeholder="请输入姓名"
|
||||
:placeholder="$t('infection.exposure.placeholderName')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="$t('infection.exposure.department')">
|
||||
<el-input
|
||||
v-model="formData.departmentName"
|
||||
placeholder="请输入科室"
|
||||
:placeholder="$t('infection.exposure.placeholderDept')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="暴露类型"
|
||||
:label="$t('infection.exposure.exposureType')"
|
||||
required
|
||||
>
|
||||
<el-select
|
||||
v-model="formData.exposureType"
|
||||
placeholder="请选择"
|
||||
:placeholder="$t('infection.exposure.placeholderSelect')"
|
||||
>
|
||||
<el-option
|
||||
label="血液暴露"
|
||||
:label="$t('infection.exposure.typeBlood')"
|
||||
value="BLOOD"
|
||||
/>
|
||||
<el-option
|
||||
label="体液暴露"
|
||||
:label="$t('infection.exposure.typeBodyFluid')"
|
||||
value="BODY_FLUID"
|
||||
/>
|
||||
<el-option
|
||||
label="针刺伤"
|
||||
:label="$t('infection.exposure.typeNeedleStick')"
|
||||
value="NEEDLE_STICK"
|
||||
/>
|
||||
<el-option
|
||||
label="化学暴露"
|
||||
:label="$t('infection.exposure.typeChemical')"
|
||||
value="CHEMICAL"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="暴露源">
|
||||
<el-form-item :label="$t('infection.exposure.exposureSource')">
|
||||
<el-input
|
||||
v-model="formData.exposureSource"
|
||||
placeholder="如: HIV阳性患者血液"
|
||||
:placeholder="$t('infection.exposure.placeholderSource')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="暴露部位">
|
||||
<el-form-item :label="$t('infection.exposure.exposureSite')">
|
||||
<el-input
|
||||
v-model="formData.exposureSite"
|
||||
placeholder="如: 左手食指"
|
||||
:placeholder="$t('infection.exposure.placeholderSite')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="暴露程度">
|
||||
<el-form-item :label="$t('infection.exposure.exposureLevel')">
|
||||
<el-radio-group v-model="formData.exposureLevel">
|
||||
<el-radio value="轻度">
|
||||
轻度
|
||||
{{ $t('infection.exposure.levelMild') }}
|
||||
</el-radio>
|
||||
<el-radio value="中度">
|
||||
中度
|
||||
{{ $t('infection.exposure.levelModerate') }}
|
||||
</el-radio>
|
||||
<el-radio value="重度">
|
||||
重度
|
||||
{{ $t('infection.exposure.levelSevere') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="处理措施">
|
||||
<el-form-item :label="$t('infection.exposure.treatment')">
|
||||
<el-input
|
||||
v-model="formData.treatment"
|
||||
type="textarea"
|
||||
:rows="2"
|
||||
placeholder="请输入处理措施"
|
||||
:placeholder="$t('infection.exposure.placeholderTreatment')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ $t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ $t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -318,9 +318,12 @@
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
@@ -333,11 +336,16 @@ const formData = reactive({
|
||||
exposureSite:'', exposureLevel:'轻度', treatment:''
|
||||
})
|
||||
|
||||
function exposureTypeText(t) {
|
||||
return {BLOOD:'血液暴露',BODY_FLUID:'体液暴露',NEEDLE_STICK:'针刺伤',CHEMICAL:'化学暴露'}[t] || t
|
||||
function exposureTypeText(val) {
|
||||
const map = {BLOOD:'infection.exposure.typeBlood',BODY_FLUID:'infection.exposure.typeBodyFluid',NEEDLE_STICK:'infection.exposure.typeNeedleStick',CHEMICAL:'infection.exposure.typeChemical'}
|
||||
return map[val] ? t(map[val]) : val
|
||||
}
|
||||
function exposureTagType(t) {
|
||||
return {BLOOD:'danger',BODY_FLUID:'warning',NEEDLE_STICK:'',CHEMICAL:'info'}[t] || 'info'
|
||||
function exposureTagType(val) {
|
||||
return {BLOOD:'danger',BODY_FLUID:'warning',NEEDLE_STICK:'',CHEMICAL:'info'}[val] || 'info'
|
||||
}
|
||||
function statusText(val) {
|
||||
const map = {COMPLETED:'infection.exposure.statusCompleted',IN_PROGRESS:'infection.exposure.statusInProgress'}
|
||||
return map[val] ? t(map[val]) : t('infection.exposure.statusPending')
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
@@ -346,7 +354,6 @@ async function loadData() {
|
||||
const r = await getPage(q.value)
|
||||
tableData.value = r.data?.records || []
|
||||
total.value = r.data?.total || 0
|
||||
// Stats
|
||||
let blood = 0, bodyFluid = 0
|
||||
tableData.value.forEach(row => {
|
||||
if (row.exposureType === 'BLOOD') blood++
|
||||
@@ -363,7 +370,7 @@ function resetQuery() {
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.exposure.addSuccess'))
|
||||
showAdd.value = false
|
||||
Object.assign(formData, {staffName:'', departmentName:'', exposureType:'BLOOD', exposureSource:'', exposureSite:'', exposureLevel:'轻度', treatment:''})
|
||||
loadData()
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">手卫生管理</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ t('infection.hygiene.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增记录
|
||||
{{ t('infection.hygiene.addRecord') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
@click="showStats = true"
|
||||
>
|
||||
查看统计
|
||||
{{ t('infection.hygiene.viewStats') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -57,7 +57,7 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.departmentName"
|
||||
placeholder="科室"
|
||||
:placeholder="t('infection.hygiene.department')"
|
||||
clearable
|
||||
style="width:140px"
|
||||
>
|
||||
@@ -70,16 +70,16 @@
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.complianceType"
|
||||
placeholder="依从性"
|
||||
:placeholder="t('infection.hygiene.compliance')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option
|
||||
label="依从"
|
||||
:label="t('infection.hygiene.compliant')"
|
||||
value="COMPLIANT"
|
||||
/>
|
||||
<el-option
|
||||
label="不依从"
|
||||
:label="t('infection.hygiene.nonCompliant')"
|
||||
value="NON_COMPLIANT"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -87,10 +87,10 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -103,17 +103,17 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="t('infection.hygiene.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="staffName"
|
||||
label="人员"
|
||||
:label="t('infection.hygiene.staff')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="complianceType"
|
||||
label="依从性"
|
||||
:label="t('infection.hygiene.compliance')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -122,35 +122,35 @@
|
||||
:type="row.complianceType==='COMPLIANT'?'success':'danger'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.complianceType==='COMPLIANT'?'依从':'不依从' }}
|
||||
{{ row.complianceType==='COMPLIANT'?t('infection.hygiene.compliant'):t('infection.hygiene.nonCompliant') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="handwashType"
|
||||
label="洗手类型"
|
||||
:label="t('infection.hygiene.handwashType')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="observationTime"
|
||||
label="观察时间"
|
||||
:label="t('infection.hygiene.observationTime')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="opportunities"
|
||||
label="手卫生时机"
|
||||
:label="t('infection.hygiene.opportunity')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="compliantCount"
|
||||
label="依从次数"
|
||||
:label="t('infection.hygiene.compliantCount')"
|
||||
width="90"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="记录时间"
|
||||
:label="t('infection.hygiene.recordTime')"
|
||||
width="160"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -168,7 +168,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增手卫生记录"
|
||||
:title="t('infection.hygiene.addRecordTitle')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -177,71 +177,71 @@
|
||||
label-width="110px"
|
||||
>
|
||||
<el-form-item
|
||||
label="科室"
|
||||
:label="t('infection.hygiene.department')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.departmentName"
|
||||
placeholder="请输入科室"
|
||||
:placeholder="t('infection.hygiene.departmentPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="人员姓名"
|
||||
:label="t('infection.hygiene.staffName')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.staffName"
|
||||
placeholder="请输入姓名"
|
||||
:placeholder="t('infection.hygiene.staffNamePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="依从性"
|
||||
:label="t('infection.hygiene.compliance')"
|
||||
required
|
||||
>
|
||||
<el-radio-group v-model="formData.complianceType">
|
||||
<el-radio value="COMPLIANT">
|
||||
依从
|
||||
{{ t('infection.hygiene.compliant') }}
|
||||
</el-radio>
|
||||
<el-radio value="NON_COMPLIANT">
|
||||
不依从
|
||||
{{ t('infection.hygiene.nonCompliant') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="洗手类型">
|
||||
<el-form-item :label="t('infection.hygiene.handwashType')">
|
||||
<el-select
|
||||
v-model="formData.handwashType"
|
||||
placeholder="请选择"
|
||||
:placeholder="t('infection.hygiene.selectPlaceholder')"
|
||||
>
|
||||
<el-option
|
||||
label="洗手液洗手"
|
||||
:label="t('infection.hygiene.soap')"
|
||||
value="SOAP"
|
||||
/>
|
||||
<el-option
|
||||
label="速干手消毒剂"
|
||||
:label="t('infection.hygiene.sanitizer')"
|
||||
value="SANITIZER"
|
||||
/>
|
||||
<el-option
|
||||
label="外科手消毒"
|
||||
:label="t('infection.hygiene.surgical')"
|
||||
value="SURGICAL"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="手卫生时机">
|
||||
<el-form-item :label="t('infection.hygiene.opportunity')">
|
||||
<el-input
|
||||
v-model="formData.opportunities"
|
||||
placeholder="如: 接触患者前"
|
||||
:placeholder="t('infection.hygiene.opportunityPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -249,7 +249,7 @@
|
||||
<!-- 统计弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showStats"
|
||||
title="手卫生统计"
|
||||
:title="t('infection.hygiene.statsTitle')"
|
||||
width="700px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -257,22 +257,22 @@
|
||||
:column="2"
|
||||
border
|
||||
>
|
||||
<el-descriptions-item label="总观察次数">
|
||||
<el-descriptions-item :label="t('infection.hygiene.totalObservations')">
|
||||
{{ statsData.total || 0 }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="依从次数">
|
||||
<el-descriptions-item :label="t('infection.hygiene.compliantTimes')">
|
||||
{{ statsData.compliant || 0 }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="依从率">
|
||||
<el-descriptions-item :label="t('infection.hygiene.complianceRate')">
|
||||
{{ statsData.complianceRate || '0%' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="不依从次数">
|
||||
<el-descriptions-item :label="t('infection.hygiene.nonCompliantTimes')">
|
||||
{{ statsData.nonCompliant || 0 }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<template #footer>
|
||||
<el-button @click="showStats = false">
|
||||
关闭
|
||||
{{ t('infection.hygiene.close') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -280,10 +280,13 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {ref, reactive, onMounted, computed} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add, getStats} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
@@ -292,13 +295,15 @@ const showStats = ref(false)
|
||||
const statsData = ref({})
|
||||
const departments = ref(['内科','外科','妇产科','儿科','ICU','急诊科','手术室'])
|
||||
|
||||
const statCards = ref([
|
||||
{label:'总观察数', value:0, color:'#409eff'},
|
||||
{label:'依从数', value:0, color:'#67c23a'},
|
||||
{label:'不依从数', value:0, color:'#f56c6c'},
|
||||
{label:'依从率', value:'0%', color:'#e6a23c'},
|
||||
{label:'科室数', value:0, color:'#909399'},
|
||||
{label:'达标率', value:'0%', color:'#409eff'}
|
||||
const statValues = reactive({observations:0, compliant:0, nonCompliant:0, complianceRate:'0%', deptCount:0, targetRate:'0%'})
|
||||
|
||||
const statCards = computed(() => [
|
||||
{label:t('infection.hygiene.totalObservations'), value:statValues.observations, color:'#409eff'},
|
||||
{label:t('infection.hygiene.compliant'), value:statValues.compliant, color:'#67c23a'},
|
||||
{label:t('infection.hygiene.nonCompliant'), value:statValues.nonCompliant, color:'#f56c6c'},
|
||||
{label:t('infection.hygiene.complianceRate'), value:statValues.complianceRate, color:'#e6a23c'},
|
||||
{label:t('infection.hygiene.deptCount'), value:statValues.deptCount, color:'#909399'},
|
||||
{label:t('infection.hygiene.targetRate'), value:statValues.targetRate, color:'#409eff'}
|
||||
])
|
||||
|
||||
const q = ref({pageNo:1, pageSize: 10, departmentName:'', complianceType:''})
|
||||
@@ -317,12 +322,12 @@ async function loadData() {
|
||||
if (row.complianceType === 'COMPLIANT') compliant++
|
||||
deptSet.add(row.departmentName)
|
||||
})
|
||||
statCards.value[0].value = total.value
|
||||
statCards.value[1].value = compliant
|
||||
statCards.value[2].value = total.value - compliant
|
||||
statCards.value[3].value = total.value > 0 ? Math.round(compliant * 100 / total.value) + '%' : '0%'
|
||||
statCards.value[4].value = deptSet.size
|
||||
statCards.value[5].value = total.value > 0 ? (compliant / total.value * 100).toFixed(1) + '%' : '0%'
|
||||
statValues.observations = total.value
|
||||
statValues.compliant = compliant
|
||||
statValues.nonCompliant = total.value - compliant
|
||||
statValues.complianceRate = total.value > 0 ? Math.round(compliant * 100 / total.value) + '%' : '0%'
|
||||
statValues.deptCount = deptSet.size
|
||||
statValues.targetRate = total.value > 0 ? (compliant / total.value * 100).toFixed(1) + '%' : '0%'
|
||||
} finally { loading.value = false }
|
||||
}
|
||||
|
||||
@@ -333,7 +338,7 @@ function resetQuery() {
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.hygiene.addSuccess'))
|
||||
showAdd.value = false
|
||||
Object.assign(formData, {departmentName:'', staffName:'', complianceType:'COMPLIANT', handwashType:'SOAP', opportunities:''})
|
||||
loadData()
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
<template>
|
||||
<div class="outbreak-container">
|
||||
<div class="page-header">
|
||||
<span class="tab-title">暴发预警</span>
|
||||
<span class="tab-title">{{ t('infection.outbreak.title') }}</span>
|
||||
</div>
|
||||
|
||||
<el-card shadow="never" style="margin-bottom: 16px">
|
||||
<template #header>
|
||||
<span>预警规则配置</span>
|
||||
<span>{{ t('infection.outbreak.ruleConfig') }}</span>
|
||||
</template>
|
||||
<el-form :model="checkParams" inline>
|
||||
<el-form-item label="检测天数">
|
||||
<el-form-item :label="t('infection.outbreak.checkDays')">
|
||||
<el-input-number v-model="checkParams.timeRangeDays" :min="1" :max="90" />
|
||||
</el-form-item>
|
||||
<el-form-item label="黄色预警阈值">
|
||||
<el-form-item :label="t('infection.outbreak.yellowThreshold')">
|
||||
<el-input-number v-model="checkParams.yellowThreshold" :min="1" :max="100" />
|
||||
</el-form-item>
|
||||
<el-form-item label="红色预警阈值">
|
||||
<el-form-item :label="t('infection.outbreak.redThreshold')">
|
||||
<el-input-number v-model="checkParams.redThreshold" :min="1" :max="500" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleCheck" :loading="checking">
|
||||
执行检测
|
||||
{{ t('infection.outbreak.executeCheck') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@@ -28,26 +28,26 @@
|
||||
|
||||
<el-card v-if="checkResult" shadow="never" style="margin-bottom: 16px">
|
||||
<template #header>
|
||||
<span>检测结果概览</span>
|
||||
<span>{{ t('infection.outbreak.checkResult') }}</span>
|
||||
</template>
|
||||
<div style="display: flex; gap: 40px; text-align: center">
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #409eff">
|
||||
{{ checkResult.totalRecentCases || 0 }}
|
||||
</div>
|
||||
<div>近期病例数</div>
|
||||
<div>{{ t('infection.outbreak.recentCases') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #e6a23c">
|
||||
{{ checkResult.newWarningCount || 0 }}
|
||||
</div>
|
||||
<div>新增预警数</div>
|
||||
<div>{{ t('infection.outbreak.newWarningCount') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #67c23a">
|
||||
{{ checkResult.checkTime || '-' }}
|
||||
</div>
|
||||
<div>检测时间</div>
|
||||
<div>{{ t('infection.outbreak.checkTime') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -55,75 +55,75 @@
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center">
|
||||
<span>预警记录列表</span>
|
||||
<el-button type="primary" link @click="loadWarnings">刷新</el-button>
|
||||
<span>{{ t('infection.outbreak.warningList') }}</span>
|
||||
<el-button type="primary" link @click="loadWarnings">{{ t('common.refresh') }}</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div style="margin-bottom: 12px; display: flex; gap: 8px">
|
||||
<el-select v-model="filterLevel" placeholder="预警级别" clearable style="width: 120px" @change="loadWarnings">
|
||||
<el-option label="黄色预警" value="YELLOW" />
|
||||
<el-option label="红色预警" value="RED" />
|
||||
<el-select v-model="filterLevel" :placeholder="t('infection.outbreak.warningLevel')" clearable style="width: 120px" @change="loadWarnings">
|
||||
<el-option :label="t('infection.outbreak.yellowWarning')" value="YELLOW" />
|
||||
<el-option :label="t('infection.outbreak.redWarning')" value="RED" />
|
||||
</el-select>
|
||||
<el-select v-model="filterStatus" placeholder="状态" clearable style="width: 120px" @change="loadWarnings">
|
||||
<el-option label="待处理" :value="0" />
|
||||
<el-option label="处理中" :value="1" />
|
||||
<el-option label="已处理" :value="2" />
|
||||
<el-option label="已排除" :value="3" />
|
||||
<el-select v-model="filterStatus" :placeholder="t('infection.outbreak.status')" clearable style="width: 120px" @change="loadWarnings">
|
||||
<el-option :label="t('infection.outbreak.pending')" :value="0" />
|
||||
<el-option :label="t('infection.outbreak.processing')" :value="1" />
|
||||
<el-option :label="t('infection.outbreak.processed')" :value="2" />
|
||||
<el-option :label="t('infection.outbreak.excluded')" :value="3" />
|
||||
</el-select>
|
||||
</div>
|
||||
|
||||
<el-table :data="warnings" v-loading="loading" border stripe style="width: 100%">
|
||||
<el-table-column prop="infectionType" label="感染类型" width="140" />
|
||||
<el-table-column prop="departmentName" label="科室" width="140" />
|
||||
<el-table-column prop="warningLevel" label="预警级别" width="110" align="center">
|
||||
<el-table-column prop="infectionType" :label="t('infection.outbreak.infectionType')" width="140" />
|
||||
<el-table-column prop="departmentName" :label="t('infection.outbreak.department')" width="140" />
|
||||
<el-table-column prop="warningLevel" :label="t('infection.outbreak.warningLevel')" width="110" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.warningLevel === 'RED' ? 'danger' : 'warning'" size="small" effect="dark">
|
||||
{{ row.warningLevel === 'RED' ? '红色预警' : '黄色预警' }}
|
||||
{{ row.warningLevel === 'RED' ? t('infection.outbreak.redWarning') : t('infection.outbreak.yellowWarning') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="caseCount" label="病例数" width="80" align="center">
|
||||
<el-table-column prop="caseCount" :label="t('infection.outbreak.caseCount')" width="80" align="center">
|
||||
<template #default="{ row }">
|
||||
<span :style="{ color: row.warningLevel === 'RED' ? '#F56C6C' : '#E6A23C', fontWeight: 'bold' }">
|
||||
{{ row.caseCount }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="thresholdCount" label="阈值" width="70" align="center" />
|
||||
<el-table-column prop="timeRangeDays" label="检测天数" width="90" align="center" />
|
||||
<el-table-column prop="status" label="状态" width="100" align="center">
|
||||
<el-table-column prop="thresholdCount" :label="t('infection.outbreak.threshold')" width="70" align="center" />
|
||||
<el-table-column prop="timeRangeDays" :label="t('infection.outbreak.checkDays')" width="90" align="center" />
|
||||
<el-table-column prop="status" :label="t('infection.outbreak.status')" width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="statusTagType(row.status)" size="small">
|
||||
{{ statusText(row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="handleUserName" label="处理人" width="100" />
|
||||
<el-table-column prop="handleResult" label="处理结果" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="createTime" label="预警时间" width="170" />
|
||||
<el-table-column label="操作" width="140" fixed="right">
|
||||
<el-table-column prop="handleUserName" :label="t('infection.outbreak.handler')" width="100" />
|
||||
<el-table-column prop="handleResult" :label="t('infection.outbreak.handleResult')" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="createTime" :label="t('infection.outbreak.warningTime')" width="170" />
|
||||
<el-table-column :label="t('common.operation')" width="140" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-if="row.status === 0" link type="primary" @click="handleProcess(row)">
|
||||
处理
|
||||
{{ t('infection.outbreak.process') }}
|
||||
</el-button>
|
||||
<el-button v-if="row.status === 0" link type="warning" @click="handleExclude(row)">
|
||||
排除
|
||||
{{ t('infection.outbreak.exclude') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
|
||||
<el-dialog v-model="showProcessDialog" title="处理预警" width="500px" append-to-body>
|
||||
<el-dialog v-model="showProcessDialog" :title="t('infection.outbreak.processWarning')" width="500px" append-to-body>
|
||||
<el-form :model="processForm" label-width="80px">
|
||||
<el-form-item label="处理结果">
|
||||
<el-input v-model="processForm.handleResult" type="textarea" :rows="4" placeholder="请输入处理结果" />
|
||||
<el-form-item :label="t('infection.outbreak.handleResult')">
|
||||
<el-input v-model="processForm.handleResult" type="textarea" :rows="4" :placeholder="t('infection.outbreak.handleResultPlaceholder')" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showProcessDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitProcess">确定</el-button>
|
||||
<el-button @click="showProcessDialog = false">{{ t('common.cancel') }}</el-button>
|
||||
<el-button type="primary" @click="submitProcess">{{ t('common.confirm') }}</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
@@ -131,9 +131,12 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { checkOutbreak, getOutbreakWarnings } from './api'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const checking = ref(false)
|
||||
const loading = ref(false)
|
||||
const warnings = ref([])
|
||||
@@ -154,8 +157,8 @@ const processForm = reactive({
|
||||
})
|
||||
|
||||
const statusText = (status) => {
|
||||
const map = { 0: '待处理', 1: '处理中', 2: '已处理', 3: '已排除' }
|
||||
return map[status] || '未知'
|
||||
const map = { 0: t('infection.outbreak.pending'), 1: t('infection.outbreak.processing'), 2: t('infection.outbreak.processed'), 3: t('infection.outbreak.excluded') }
|
||||
return map[status] || t('infection.outbreak.unknown')
|
||||
}
|
||||
|
||||
const statusTagType = (status) => {
|
||||
@@ -168,10 +171,10 @@ const handleCheck = async () => {
|
||||
try {
|
||||
const res = await checkOutbreak(checkParams)
|
||||
checkResult.value = res.data
|
||||
ElMessage.success('检测完成,新增 ' + (res.data?.newWarningCount || 0) + ' 条预警')
|
||||
ElMessage.success(t('infection.outbreak.checkDone', { count: res.data?.newWarningCount || 0 }))
|
||||
loadWarnings()
|
||||
} catch (e) {
|
||||
ElMessage.error('检测失败: ' + (e.message || '未知错误'))
|
||||
ElMessage.error(t('infection.outbreak.checkFailed', { error: e.message || t('infection.outbreak.unknownError') }))
|
||||
} finally {
|
||||
checking.value = false
|
||||
}
|
||||
@@ -198,27 +201,27 @@ const handleProcess = (row) => {
|
||||
|
||||
const submitProcess = async () => {
|
||||
if (!processForm.handleResult.trim()) {
|
||||
ElMessage.warning('请输入处理结果')
|
||||
ElMessage.warning(t('infection.outbreak.enterHandleResult'))
|
||||
return
|
||||
}
|
||||
try {
|
||||
await checkOutbreak({ id: processForm.id, handleResult: processForm.handleResult })
|
||||
ElMessage.success('处理成功')
|
||||
ElMessage.success(t('infection.outbreak.processSuccess'))
|
||||
showProcessDialog.value = false
|
||||
loadWarnings()
|
||||
} catch (e) {
|
||||
ElMessage.error('处理失败')
|
||||
ElMessage.error(t('infection.outbreak.processFailed'))
|
||||
}
|
||||
}
|
||||
|
||||
const handleExclude = async (row) => {
|
||||
try {
|
||||
await ElMessageBox.confirm('确认排除该预警?', '提示', { type: 'warning' })
|
||||
await checkOutbreak({ id: row.id, handleResult: '误报排除' })
|
||||
ElMessage.success('已排除')
|
||||
await ElMessageBox.confirm(t('infection.outbreak.confirmExclude'), t('common.message'), { type: 'warning' })
|
||||
await checkOutbreak({ id: row.id, handleResult: t('infection.outbreak.falsePositive') })
|
||||
ElMessage.success(t('infection.outbreak.excludedSuccess'))
|
||||
loadWarnings()
|
||||
} catch (e) {
|
||||
if (e !== 'cancel') ElMessage.error('操作失败')
|
||||
if (e !== 'cancel') ElMessage.error(t('infection.outbreak.operationFailed'))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">多重耐药菌监测</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ t('infection.resistant.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增记录
|
||||
{{ t('infection.resistant.addRecord') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@
|
||||
{{ stats.total || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
耐药菌检出
|
||||
{{ t('infection.resistant.detected') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -48,7 +48,7 @@
|
||||
{{ stats.isolated || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
已隔离
|
||||
{{ t('infection.resistant.isolated') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -63,7 +63,7 @@
|
||||
{{ stats.isolationRate || '0%' }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
隔离率
|
||||
{{ t('infection.resistant.isolationRate') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -78,7 +78,7 @@
|
||||
{{ stats.cureRate || '0%' }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
治愈率
|
||||
{{ t('infection.resistant.cureRate') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -89,7 +89,7 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.bacteriaType"
|
||||
placeholder="耐药菌类型"
|
||||
:placeholder="t('infection.resistant.bacteriaType')"
|
||||
clearable
|
||||
style="width:160px"
|
||||
>
|
||||
@@ -114,26 +114,26 @@
|
||||
value="ESBL"
|
||||
/>
|
||||
<el-option
|
||||
label="MDR铜绿"
|
||||
:label="t('infection.resistant.mdrPsa')"
|
||||
value="MDR_PSA"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.isolationStatus"
|
||||
placeholder="隔离状态"
|
||||
:placeholder="t('infection.resistant.isolationStatus')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option
|
||||
label="已隔离"
|
||||
:label="t('infection.resistant.isolated')"
|
||||
value="ISOLATED"
|
||||
/>
|
||||
<el-option
|
||||
label="解除隔离"
|
||||
:label="t('infection.resistant.released')"
|
||||
value="RELEASED"
|
||||
/>
|
||||
<el-option
|
||||
label="未隔离"
|
||||
:label="t('infection.resistant.notIsolated')"
|
||||
value="NOT_ISOLATED"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -141,10 +141,10 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -157,12 +157,12 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientName"
|
||||
label="患者"
|
||||
:label="t('infection.resistant.patient')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="bacteriaType"
|
||||
label="耐药菌类型"
|
||||
:label="t('infection.resistant.bacteriaType')"
|
||||
width="120"
|
||||
align="center"
|
||||
>
|
||||
@@ -177,17 +177,17 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="t('infection.resistant.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="sampleType"
|
||||
label="标本类型"
|
||||
:label="t('infection.resistant.sampleType')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="isolationStatus"
|
||||
label="隔离状态"
|
||||
:label="t('infection.resistant.isolationStatus')"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
@@ -196,29 +196,29 @@
|
||||
:type="row.isolationStatus==='ISOLATED'?'danger':row.isolationStatus==='RELEASED'?'success':'warning'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.isolationStatus==='ISOLATED'?'已隔离':row.isolationStatus==='RELEASED'?'解除隔离':'未隔离' }}
|
||||
{{ isolationStatusText(row.isolationStatus) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="isolationDate"
|
||||
label="隔离日期"
|
||||
:label="t('infection.resistant.isolationDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="releaseDate"
|
||||
label="解除日期"
|
||||
:label="t('infection.resistant.releaseDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="antibioticUsage"
|
||||
label="抗菌药物使用"
|
||||
:label="t('infection.resistant.antibioticUsage')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="报告时间"
|
||||
:label="t('infection.resistant.reportTime')"
|
||||
width="160"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -236,7 +236,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增多重耐药菌记录"
|
||||
:title="t('infection.resistant.addRecordTitle')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -245,21 +245,21 @@
|
||||
label-width="120px"
|
||||
>
|
||||
<el-form-item
|
||||
label="患者姓名"
|
||||
:label="t('infection.resistant.patientName')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.patientName"
|
||||
placeholder="请输入患者姓名"
|
||||
:placeholder="t('infection.resistant.patientNamePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="耐药菌类型"
|
||||
:label="t('infection.resistant.bacteriaType')"
|
||||
required
|
||||
>
|
||||
<el-select
|
||||
v-model="formData.bacteriaType"
|
||||
placeholder="请选择"
|
||||
:placeholder="t('infection.resistant.selectPlaceholder')"
|
||||
>
|
||||
<el-option
|
||||
label="MRSA"
|
||||
@@ -282,51 +282,51 @@
|
||||
value="ESBL"
|
||||
/>
|
||||
<el-option
|
||||
label="MDR铜绿"
|
||||
:label="t('infection.resistant.mdrPsa')"
|
||||
value="MDR_PSA"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="t('infection.resistant.department')">
|
||||
<el-input
|
||||
v-model="formData.departmentName"
|
||||
placeholder="请输入科室"
|
||||
:placeholder="t('infection.resistant.departmentPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="标本类型">
|
||||
<el-form-item :label="t('infection.resistant.sampleType')">
|
||||
<el-input
|
||||
v-model="formData.sampleType"
|
||||
placeholder="如: 痰液、血液、尿液"
|
||||
:placeholder="t('infection.resistant.sampleTypePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="隔离状态">
|
||||
<el-form-item :label="t('infection.resistant.isolationStatus')">
|
||||
<el-radio-group v-model="formData.isolationStatus">
|
||||
<el-radio value="ISOLATED">
|
||||
已隔离
|
||||
{{ t('infection.resistant.isolated') }}
|
||||
</el-radio>
|
||||
<el-radio value="NOT_ISOLATED">
|
||||
未隔离
|
||||
{{ t('infection.resistant.notIsolated') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="抗菌药物使用">
|
||||
<el-form-item :label="t('infection.resistant.antibioticUsage')">
|
||||
<el-input
|
||||
v-model="formData.antibioticUsage"
|
||||
type="textarea"
|
||||
:rows="2"
|
||||
placeholder="请输入抗菌药物使用情况"
|
||||
:placeholder="t('infection.resistant.antibioticPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -335,9 +335,12 @@
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
@@ -350,8 +353,12 @@ const formData = reactive({
|
||||
isolationStatus:'ISOLATED', antibioticUsage:''
|
||||
})
|
||||
|
||||
function bacteriaTypeText(t) {
|
||||
return {MRSA:'MRSA',VRE:'VRE',CRE:'CRE',CRKP:'CRKP',ESBL:'ESBL',MDR_PSA:'MDR铜绿'}[t] || t
|
||||
function bacteriaTypeText(val) {
|
||||
return {MRSA:'MRSA',VRE:'VRE',CRE:'CRE',CRKP:'CRKP',ESBL:'ESBL',MDR_PSA:t('infection.resistant.mdrPsa')}[val] || val
|
||||
}
|
||||
|
||||
function isolationStatusText(val) {
|
||||
return {ISOLATED:t('infection.resistant.isolated'),RELEASED:t('infection.resistant.released'),NOT_ISOLATED:t('infection.resistant.notIsolated')}[val] || val
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
@@ -377,7 +384,7 @@ function resetQuery() {
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.resistant.addSuccess'))
|
||||
showAdd.value = false
|
||||
Object.assign(formData, {patientName:'', bacteriaType:'MRSA', departmentName:'', sampleType:'', isolationStatus:'ISOLATED', antibioticUsage:''})
|
||||
loadData()
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
<template>
|
||||
<div class="screening-container">
|
||||
<div class="page-header">
|
||||
<span class="tab-title">院感病例自动筛查</span>
|
||||
<span class="tab-title">{{ $t('infection.screening.title') }}</span>
|
||||
</div>
|
||||
|
||||
<el-card shadow="never" style="margin-bottom: 16px">
|
||||
<template #header>
|
||||
<span>筛查规则配置</span>
|
||||
<span>{{ $t('infection.screening.ruleConfig') }}</span>
|
||||
</template>
|
||||
<el-form :model="screeningParams" inline>
|
||||
<el-form-item label="开始日期">
|
||||
<el-form-item :label="$t('infection.screening.startDate')">
|
||||
<el-date-picker
|
||||
v-model="screeningParams.startDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择开始日期"
|
||||
:placeholder="$t('infection.screening.placeholderStartDate')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="结束日期">
|
||||
<el-form-item :label="$t('infection.screening.endDate')">
|
||||
<el-date-picker
|
||||
v-model="screeningParams.endDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="选择结束日期"
|
||||
:placeholder="$t('infection.screening.placeholderEndDate')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="感染类型">
|
||||
<el-select v-model="screeningParams.infectionType" clearable placeholder="全部">
|
||||
<el-option label="医院感染" value="医院感染" />
|
||||
<el-option label="社区感染" value="社区感染" />
|
||||
<el-form-item :label="$t('infection.screening.infectionType')">
|
||||
<el-select v-model="screeningParams.infectionType" clearable :placeholder="$t('infection.screening.all')">
|
||||
<el-option :label="$t('infection.screening.typeHospital')" value="医院感染" />
|
||||
<el-option :label="$t('infection.screening.typeCommunity')" value="社区感染" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="住院天数阈值">
|
||||
<el-form-item :label="$t('infection.screening.minDays')">
|
||||
<el-input-number v-model="screeningParams.minDays" :min="0" :max="365" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleScreening" :loading="screening">
|
||||
执行筛查
|
||||
{{ $t('infection.screening.execute') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@@ -44,26 +44,26 @@
|
||||
|
||||
<el-card v-if="screeningResult" shadow="never" style="margin-bottom: 16px">
|
||||
<template #header>
|
||||
<span>筛查结果概览</span>
|
||||
<span>{{ $t('infection.screening.resultOverview') }}</span>
|
||||
</template>
|
||||
<div style="display: flex; gap: 40px; text-align: center">
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #409eff">
|
||||
{{ screeningResult.screenedCount || 0 }}
|
||||
</div>
|
||||
<div>筛查病例数</div>
|
||||
<div>{{ $t('infection.screening.screenedCount') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #e6a23c">
|
||||
{{ screeningResult.suspectedCount || 0 }}
|
||||
</div>
|
||||
<div>疑似病例数</div>
|
||||
<div>{{ $t('infection.screening.suspectedCount') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #67c23a">
|
||||
{{ screeningResult.screenTime || '-' }}
|
||||
</div>
|
||||
<div>筛查时间</div>
|
||||
<div>{{ $t('infection.screening.screenTime') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-top: 12px">
|
||||
@@ -76,28 +76,28 @@
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center">
|
||||
<span>筛查结果列表</span>
|
||||
<el-button type="primary" link @click="loadResults">刷新</el-button>
|
||||
<span>{{ $t('infection.screening.resultList') }}</span>
|
||||
<el-button type="primary" link @click="loadResults">{{ $t('common.refresh') }}</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<el-table :data="results" v-loading="loading" border stripe style="width: 100%">
|
||||
<el-table-column prop="patientName" label="患者姓名" width="100" />
|
||||
<el-table-column prop="infectionType" label="感染类型" width="100" />
|
||||
<el-table-column prop="infectionSite" label="感染部位" width="120" />
|
||||
<el-table-column prop="pathogen" label="病原体" width="120" />
|
||||
<el-table-column prop="diagnosisDate" label="诊断日期" width="120" />
|
||||
<el-table-column prop="reportTime" label="上报时间" width="170" />
|
||||
<el-table-column prop="status" label="状态" width="100">
|
||||
<el-table-column prop="patientName" :label="$t('infection.screening.patientName')" width="100" />
|
||||
<el-table-column prop="infectionType" :label="$t('infection.screening.infectionType')" width="100" />
|
||||
<el-table-column prop="infectionSite" :label="$t('infection.screening.infectionSite')" width="120" />
|
||||
<el-table-column prop="pathogen" :label="$t('infection.screening.pathogen')" width="120" />
|
||||
<el-table-column prop="diagnosisDate" :label="$t('infection.screening.diagnosisDate')" width="120" />
|
||||
<el-table-column prop="reportTime" :label="$t('infection.screening.reportTime')" width="170" />
|
||||
<el-table-column prop="status" :label="$t('infection.screening.status')" width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="statusTagType(row.status)" size="small">
|
||||
{{ statusText(row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="reviewResult" label="审核结果" width="100">
|
||||
<el-table-column prop="reviewResult" :label="$t('infection.screening.reviewResult')" width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.reviewResult" :type="row.reviewResult === 'CONFIRMED' ? 'success' : 'danger'" size="small">
|
||||
{{ row.reviewResult === 'CONFIRMED' ? '确认' : '驳回' }}
|
||||
{{ row.reviewResult === 'CONFIRMED' ? $t('infection.screening.reviewConfirmed') : $t('infection.screening.reviewRejected') }}
|
||||
</el-tag>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
@@ -109,9 +109,12 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { runScreening, getScreeningResults } from '@/api/infection/screening'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const screeningParams = reactive({
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
@@ -125,8 +128,8 @@ const screeningResult = ref(null)
|
||||
const results = ref([])
|
||||
|
||||
const statusText = (status) => {
|
||||
const map = { 'REPORTED': '已上报', 'REVIEWED': '已审核', 'CONFIRMED': '已确认', 'REJECTED': '已驳回' }
|
||||
return map[status] || status
|
||||
const map = { 'REPORTED': 'infection.screening.statusReported', 'REVIEWED': 'infection.screening.statusReviewed', 'CONFIRMED': 'infection.screening.statusConfirmed', 'REJECTED': 'infection.screening.statusRejected' }
|
||||
return map[status] ? t(map[status]) : status
|
||||
}
|
||||
|
||||
const statusTagType = (status) => {
|
||||
@@ -140,9 +143,9 @@ const handleScreening = async () => {
|
||||
const res = await runScreening(screeningParams)
|
||||
screeningResult.value = res.data
|
||||
results.value = res.data?.suspectedCases || []
|
||||
ElMessage.success('筛查完成')
|
||||
ElMessage.success(t('infection.screening.screeningComplete'))
|
||||
} catch (e) {
|
||||
ElMessage.error('筛查失败: ' + (e.message || '未知错误'))
|
||||
ElMessage.error(t('infection.screening.screeningFailed') + ': ' + (e.message || t('infection.screening.unknownError')))
|
||||
} finally {
|
||||
screening.value = false
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">目标性监测</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ t('infection.surveillance.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增监测
|
||||
{{ t('infection.surveillance.addSurveillance') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
@click="exportReport"
|
||||
>
|
||||
导出报告
|
||||
{{ t('infection.surveillance.exportReport') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -57,69 +57,69 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.surveillanceType"
|
||||
placeholder="监测类型"
|
||||
:placeholder="t('infection.surveillance.surveillanceType')"
|
||||
clearable
|
||||
style="width:140px"
|
||||
>
|
||||
<el-option
|
||||
label="ICU感染"
|
||||
:label="t('infection.surveillance.icu')"
|
||||
value="ICU"
|
||||
/>
|
||||
<el-option
|
||||
label="手术部位感染(SSI)"
|
||||
:label="t('infection.surveillance.ssi')"
|
||||
value="SSI"
|
||||
/>
|
||||
<el-option
|
||||
label="导管相关血流感染(CLABSI)"
|
||||
:label="t('infection.surveillance.clabsi')"
|
||||
value="CLABSI"
|
||||
/>
|
||||
<el-option
|
||||
label="呼吸机相关肺炎(VAP)"
|
||||
:label="t('infection.surveillance.vap')"
|
||||
value="VAP"
|
||||
/>
|
||||
<el-option
|
||||
label="导尿管相关尿路感染(CAUTI)"
|
||||
:label="t('infection.surveillance.cauti')"
|
||||
value="CAUTI"
|
||||
/>
|
||||
<el-option
|
||||
label="多重耐药菌监测"
|
||||
:label="t('infection.surveillance.mdr')"
|
||||
value="MDR"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.status"
|
||||
placeholder="状态"
|
||||
:placeholder="t('infection.surveillance.status')"
|
||||
clearable
|
||||
style="width:100px"
|
||||
>
|
||||
<el-option
|
||||
label="进行中"
|
||||
:label="t('infection.surveillance.ongoing')"
|
||||
value="ONGOING"
|
||||
/>
|
||||
<el-option
|
||||
label="已完成"
|
||||
:label="t('infection.surveillance.completed')"
|
||||
value="COMPLETED"
|
||||
/>
|
||||
<el-option
|
||||
label="已暂停"
|
||||
:label="t('infection.surveillance.paused')"
|
||||
value="PAUSED"
|
||||
/>
|
||||
</el-select>
|
||||
<el-date-picker
|
||||
v-model="q.dateRange"
|
||||
type="daterange"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:start-placeholder="t('infection.surveillance.startDate')"
|
||||
:end-placeholder="t('infection.surveillance.endDate')"
|
||||
style="width:240px"
|
||||
/>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="surveillanceType"
|
||||
label="监测类型"
|
||||
:label="t('infection.surveillance.surveillanceType')"
|
||||
width="160"
|
||||
align="center"
|
||||
>
|
||||
@@ -147,18 +147,18 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="监测科室"
|
||||
:label="t('infection.surveillance.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="totalPatients"
|
||||
label="监测人数"
|
||||
:label="t('infection.surveillance.totalPatients')"
|
||||
width="90"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="infectionCount"
|
||||
label="感染数"
|
||||
:label="t('infection.surveillance.infectionCount')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -170,7 +170,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="infectionRate"
|
||||
label="感染率"
|
||||
:label="t('infection.surveillance.infectionRate')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -182,18 +182,18 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="deviceUsageRate"
|
||||
label="器械使用率"
|
||||
:label="t('infection.surveillance.deviceUsageRate')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="surveillancePeriod"
|
||||
label="监测周期"
|
||||
:label="t('infection.surveillance.period')"
|
||||
width="160"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="status"
|
||||
label="状态"
|
||||
:label="t('infection.surveillance.status')"
|
||||
width="90"
|
||||
align="center"
|
||||
>
|
||||
@@ -202,18 +202,18 @@
|
||||
:type="row.status==='ONGOING'?'success':row.status==='COMPLETED'?'info':'warning'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.status==='ONGOING'?'进行中':row.status==='COMPLETED'?'已完成':'已暂停' }}
|
||||
{{ statusText(row.status) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="remark"
|
||||
label="备注"
|
||||
:label="t('infection.surveillance.remark')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="t('common.operation')"
|
||||
width="120"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -223,7 +223,7 @@
|
||||
type="primary"
|
||||
@click="handleDetail(row)"
|
||||
>
|
||||
详情
|
||||
{{ t('common.detail') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -242,7 +242,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增监测"
|
||||
:title="t('infection.surveillance.addSurveillance')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -251,58 +251,58 @@
|
||||
label-width="120px"
|
||||
>
|
||||
<el-form-item
|
||||
label="监测类型"
|
||||
:label="t('infection.surveillance.surveillanceType')"
|
||||
required
|
||||
>
|
||||
<el-select
|
||||
v-model="formData.surveillanceType"
|
||||
placeholder="请选择"
|
||||
:placeholder="t('infection.surveillance.selectPlaceholder')"
|
||||
>
|
||||
<el-option
|
||||
label="ICU感染"
|
||||
:label="t('infection.surveillance.icu')"
|
||||
value="ICU"
|
||||
/>
|
||||
<el-option
|
||||
label="手术部位感染(SSI)"
|
||||
:label="t('infection.surveillance.ssi')"
|
||||
value="SSI"
|
||||
/>
|
||||
<el-option
|
||||
label="导管相关血流感染(CLABSI)"
|
||||
:label="t('infection.surveillance.clabsi')"
|
||||
value="CLABSI"
|
||||
/>
|
||||
<el-option
|
||||
label="呼吸机相关肺炎(VAP)"
|
||||
:label="t('infection.surveillance.vap')"
|
||||
value="VAP"
|
||||
/>
|
||||
<el-option
|
||||
label="导尿管相关尿路感染(CAUTI)"
|
||||
:label="t('infection.surveillance.cauti')"
|
||||
value="CAUTI"
|
||||
/>
|
||||
<el-option
|
||||
label="多重耐药菌监测"
|
||||
:label="t('infection.surveillance.mdr')"
|
||||
value="MDR"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="监测科室">
|
||||
<el-form-item :label="t('infection.surveillance.department')">
|
||||
<el-input
|
||||
v-model="formData.departmentName"
|
||||
placeholder="请输入科室名称"
|
||||
:placeholder="t('infection.surveillance.departmentPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="监测人数">
|
||||
<el-form-item :label="t('infection.surveillance.totalPatients')">
|
||||
<el-input-number
|
||||
v-model="formData.totalPatients"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="感染人数">
|
||||
<el-form-item :label="t('infection.surveillance.infectionCount')">
|
||||
<el-input-number
|
||||
v-model="formData.infectionCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="器械使用率(%)">
|
||||
<el-form-item :label="t('infection.surveillance.deviceUsageRatePercent')">
|
||||
<el-input-number
|
||||
v-model="formData.deviceUsageRate"
|
||||
:min="0"
|
||||
@@ -310,13 +310,13 @@
|
||||
:precision="1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="监测周期">
|
||||
<el-form-item :label="t('infection.surveillance.period')">
|
||||
<el-input
|
||||
v-model="formData.surveillancePeriod"
|
||||
placeholder="如: 2026-01-01 ~ 2026-06-30"
|
||||
:placeholder="t('infection.surveillance.periodPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<el-form-item :label="t('infection.surveillance.remark')">
|
||||
<el-input
|
||||
v-model="formData.remark"
|
||||
type="textarea"
|
||||
@@ -326,13 +326,13 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -340,22 +340,27 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {ref, reactive, onMounted, computed} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
const showAdd = ref(false)
|
||||
|
||||
const statCards = ref([
|
||||
{label:'总监测数', value:0, color:'#409eff'},
|
||||
{label:'ICU感染', value:0, color:'#f56c6c'},
|
||||
{label:'SSI感染', value:0, color:'#e6a23c'},
|
||||
{label:'CLABSI', value:0, color:'#67c23a'},
|
||||
{label:'VAP', value:0, color:'#909399'},
|
||||
{label:'平均感染率', value:'0%', color:'#409eff'}
|
||||
const statValues = reactive({total:0, icu:0, ssi:0, clabsi:0, vap:0, avgRate:'0%'})
|
||||
|
||||
const statCards = computed(() => [
|
||||
{label:t('infection.surveillance.totalSurveillance'), value:statValues.total, color:'#409eff'},
|
||||
{label:t('infection.surveillance.icu'), value:statValues.icu, color:'#f56c6c'},
|
||||
{label:'SSI', value:statValues.ssi, color:'#e6a23c'},
|
||||
{label:'CLABSI', value:statValues.clabsi, color:'#67c23a'},
|
||||
{label:'VAP', value:statValues.vap, color:'#909399'},
|
||||
{label:t('infection.surveillance.avgInfectionRate'), value:statValues.avgRate, color:'#409eff'}
|
||||
])
|
||||
|
||||
const q = ref({pageNo:1, pageSize: 10, surveillanceType:'', status:'', dateRange:null})
|
||||
@@ -364,11 +369,14 @@ const formData = reactive({
|
||||
deviceUsageRate:0, surveillancePeriod:'', remark:''
|
||||
})
|
||||
|
||||
function surveillanceTypeText(t) {
|
||||
return {ICU:'ICU感染',SSI:'手术部位感染',CLABSI:'导管相关血流感染',VAP:'呼吸机相关肺炎',CAUTI:'导尿管相关尿路感染',MDR:'多重耐药菌监测'}[t] || t
|
||||
function surveillanceTypeText(val) {
|
||||
return {ICU:t('infection.surveillance.icu'),SSI:t('infection.surveillance.ssi'),CLABSI:t('infection.surveillance.clabsi'),VAP:t('infection.surveillance.vap'),CAUTI:t('infection.surveillance.cauti'),MDR:t('infection.surveillance.mdr')}[val] || val
|
||||
}
|
||||
function surveillanceTagType(t) {
|
||||
return {ICU:'danger',SSI:'warning',CLABSI:'',VAP:'success',CAUTI:'info',MDR:'danger'}[t] || 'info'
|
||||
function surveillanceTagType(val) {
|
||||
return {ICU:'danger',SSI:'warning',CLABSI:'',VAP:'success',CAUTI:'info',MDR:'danger'}[val] || 'info'
|
||||
}
|
||||
function statusText(val) {
|
||||
return {ONGOING:t('infection.surveillance.ongoing'),COMPLETED:t('infection.surveillance.completed'),PAUSED:t('infection.surveillance.paused')}[val] || val
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
@@ -377,9 +385,8 @@ async function loadData() {
|
||||
const r = await getPage(q.value)
|
||||
tableData.value = r.data?.records || []
|
||||
total.value = r.data?.total || 0
|
||||
// Update stats
|
||||
if (tableData.value.length > 0) {
|
||||
statCards.value[0].value = total.value
|
||||
statValues.total = total.value
|
||||
let icuCount = 0, ssiCount = 0, clabsiCount = 0, vapCount = 0, totalRate = 0
|
||||
tableData.value.forEach(row => {
|
||||
if (row.surveillanceType === 'ICU') icuCount++
|
||||
@@ -388,11 +395,11 @@ async function loadData() {
|
||||
if (row.surveillanceType === 'VAP') vapCount++
|
||||
totalRate += (row.infectionRate || 0)
|
||||
})
|
||||
statCards.value[1].value = icuCount
|
||||
statCards.value[2].value = ssiCount
|
||||
statCards.value[3].value = clabsiCount
|
||||
statCards.value[4].value = vapCount
|
||||
statCards.value[5].value = (totalRate / tableData.value.length).toFixed(1) + '%'
|
||||
statValues.icu = icuCount
|
||||
statValues.ssi = ssiCount
|
||||
statValues.clabsi = clabsiCount
|
||||
statValues.vap = vapCount
|
||||
statValues.avgRate = (totalRate / tableData.value.length).toFixed(1) + '%'
|
||||
}
|
||||
} finally { loading.value = false }
|
||||
}
|
||||
@@ -403,18 +410,18 @@ function resetQuery() {
|
||||
}
|
||||
|
||||
function handleDetail(row) {
|
||||
ElMessage.info('详情: ' + surveillanceTypeText(row.surveillanceType) + ' - ' + (row.departmentName || ''))
|
||||
ElMessage.info(t('infection.surveillance.detailInfo', { type: surveillanceTypeText(row.surveillanceType), dept: row.departmentName || '' }))
|
||||
}
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.surveillance.addSuccess'))
|
||||
showAdd.value = false
|
||||
Object.assign(formData, {surveillanceType:'ICU', departmentName:'', totalPatients:0, infectionCount:0, deviceUsageRate:0, surveillancePeriod:'', remark:''})
|
||||
loadData()
|
||||
}
|
||||
|
||||
function exportReport() { ElMessage.info('导出功能开发中') }
|
||||
function exportReport() { ElMessage.info(t('infection.surveillance.exportDev')) }
|
||||
|
||||
onMounted(() => loadData())
|
||||
</script>
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<template>
|
||||
<div style="padding:16px">
|
||||
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
|
||||
<span style="font-size:18px;font-weight:bold">疫情预警</span>
|
||||
<span style="font-size:18px;font-weight:bold">{{ t('infection.warning.title') }}</span>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
刷新
|
||||
{{ t('common.refresh') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="showAdd = true"
|
||||
>
|
||||
新增预警
|
||||
{{ t('infection.warning.addWarning') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@
|
||||
{{ stats.level1Count || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
一级预警
|
||||
{{ t('infection.warning.level1') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -48,7 +48,7 @@
|
||||
{{ stats.level2Count || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
二级预警
|
||||
{{ t('infection.warning.level2') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -63,7 +63,7 @@
|
||||
{{ stats.level3Count || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
三级预警
|
||||
{{ t('infection.warning.level3') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -78,7 +78,7 @@
|
||||
{{ stats.totalWarnings || 0 }}
|
||||
</div>
|
||||
<div style="color:#999">
|
||||
总预警数
|
||||
{{ t('infection.warning.totalWarnings') }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -89,47 +89,47 @@
|
||||
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
|
||||
<el-select
|
||||
v-model="q.warningLevel"
|
||||
placeholder="预警级别"
|
||||
:placeholder="t('infection.warning.warningLevel')"
|
||||
clearable
|
||||
style="width:120px"
|
||||
>
|
||||
<el-option
|
||||
label="一级预警"
|
||||
:label="t('infection.warning.level1')"
|
||||
value="LEVEL1"
|
||||
/>
|
||||
<el-option
|
||||
label="二级预警"
|
||||
:label="t('infection.warning.level2')"
|
||||
value="LEVEL2"
|
||||
/>
|
||||
<el-option
|
||||
label="三级预警"
|
||||
:label="t('infection.warning.level3')"
|
||||
value="LEVEL3"
|
||||
/>
|
||||
</el-select>
|
||||
<el-select
|
||||
v-model="q.diseaseType"
|
||||
placeholder="疾病类型"
|
||||
:placeholder="t('infection.warning.diseaseType')"
|
||||
clearable
|
||||
style="width:140px"
|
||||
>
|
||||
<el-option
|
||||
label="呼吸道传染病"
|
||||
:label="t('infection.warning.respiratory')"
|
||||
value="RESPIRATORY"
|
||||
/>
|
||||
<el-option
|
||||
label="肠道传染病"
|
||||
:label="t('infection.warning.intestinal')"
|
||||
value="INTESTINAL"
|
||||
/>
|
||||
<el-option
|
||||
label="血源性传染病"
|
||||
:label="t('infection.warning.blood')"
|
||||
value="BLOOD"
|
||||
/>
|
||||
<el-option
|
||||
label="虫媒传染病"
|
||||
:label="t('infection.warning.vector')"
|
||||
value="VECTOR"
|
||||
/>
|
||||
<el-option
|
||||
label="其他"
|
||||
:label="t('infection.warning.other')"
|
||||
value="OTHER"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -137,10 +137,10 @@
|
||||
type="primary"
|
||||
@click="loadData"
|
||||
>
|
||||
查询
|
||||
{{ t('common.search') }}
|
||||
</el-button>
|
||||
<el-button @click="resetQuery">
|
||||
重置
|
||||
{{ t('common.reset') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
@@ -153,12 +153,12 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="diseaseName"
|
||||
label="疾病名称"
|
||||
:label="t('infection.warning.diseaseName')"
|
||||
width="140"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="warningLevel"
|
||||
label="预警级别"
|
||||
:label="t('infection.warning.warningLevel')"
|
||||
width="110"
|
||||
align="center"
|
||||
>
|
||||
@@ -168,13 +168,13 @@
|
||||
size="small"
|
||||
effect="dark"
|
||||
>
|
||||
{{ {LEVEL1:'一级预警',LEVEL2:'二级预警',LEVEL3:'三级预警'}[row.warningLevel]||row.warningLevel }}
|
||||
{{ warningLevelText(row.warningLevel) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="caseCount"
|
||||
label="病例数"
|
||||
:label="t('infection.warning.caseCount')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -186,33 +186,33 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="thresholdCount"
|
||||
label="阈值"
|
||||
:label="t('infection.warning.threshold')"
|
||||
width="70"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="affectedArea"
|
||||
label="影响区域"
|
||||
:label="t('infection.warning.affectedArea')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="报告科室"
|
||||
:label="t('infection.warning.reportDept')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="reporterName"
|
||||
label="报告人"
|
||||
:label="t('infection.warning.reporter')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="预警时间"
|
||||
:label="t('infection.warning.warningTime')"
|
||||
width="170"
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="t('common.operation')"
|
||||
width="120"
|
||||
fixed="right"
|
||||
>
|
||||
@@ -222,7 +222,7 @@
|
||||
type="primary"
|
||||
@click="handleDetail(row)"
|
||||
>
|
||||
详情
|
||||
{{ t('common.detail') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -241,7 +241,7 @@
|
||||
<!-- 新增弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAdd"
|
||||
title="新增疫情预警"
|
||||
:title="t('infection.warning.addWarning')"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -250,97 +250,97 @@
|
||||
label-width="110px"
|
||||
>
|
||||
<el-form-item
|
||||
label="疾病名称"
|
||||
:label="t('infection.warning.diseaseName')"
|
||||
required
|
||||
>
|
||||
<el-input
|
||||
v-model="formData.diseaseName"
|
||||
placeholder="请输入疾病名称"
|
||||
:placeholder="t('infection.warning.diseaseNamePlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="预警级别"
|
||||
:label="t('infection.warning.warningLevel')"
|
||||
required
|
||||
>
|
||||
<el-select
|
||||
v-model="formData.warningLevel"
|
||||
placeholder="请选择"
|
||||
:placeholder="t('infection.warning.selectPlaceholder')"
|
||||
>
|
||||
<el-option
|
||||
label="一级预警"
|
||||
:label="t('infection.warning.level1')"
|
||||
value="LEVEL1"
|
||||
/>
|
||||
<el-option
|
||||
label="二级预警"
|
||||
:label="t('infection.warning.level2')"
|
||||
value="LEVEL2"
|
||||
/>
|
||||
<el-option
|
||||
label="三级预警"
|
||||
:label="t('infection.warning.level3')"
|
||||
value="LEVEL3"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="疾病类型">
|
||||
<el-form-item :label="t('infection.warning.diseaseType')">
|
||||
<el-select
|
||||
v-model="formData.diseaseType"
|
||||
placeholder="请选择"
|
||||
:placeholder="t('infection.warning.selectPlaceholder')"
|
||||
>
|
||||
<el-option
|
||||
label="呼吸道传染病"
|
||||
:label="t('infection.warning.respiratory')"
|
||||
value="RESPIRATORY"
|
||||
/>
|
||||
<el-option
|
||||
label="肠道传染病"
|
||||
:label="t('infection.warning.intestinal')"
|
||||
value="INTESTINAL"
|
||||
/>
|
||||
<el-option
|
||||
label="血源性传染病"
|
||||
:label="t('infection.warning.blood')"
|
||||
value="BLOOD"
|
||||
/>
|
||||
<el-option
|
||||
label="虫媒传染病"
|
||||
:label="t('infection.warning.vector')"
|
||||
value="VECTOR"
|
||||
/>
|
||||
<el-option
|
||||
label="其他"
|
||||
:label="t('infection.warning.other')"
|
||||
value="OTHER"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="病例数">
|
||||
<el-form-item :label="t('infection.warning.caseCount')">
|
||||
<el-input-number
|
||||
v-model="formData.caseCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="阈值">
|
||||
<el-form-item :label="t('infection.warning.threshold')">
|
||||
<el-input-number
|
||||
v-model="formData.thresholdCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="影响区域">
|
||||
<el-form-item :label="t('infection.warning.affectedArea')">
|
||||
<el-input
|
||||
v-model="formData.affectedArea"
|
||||
placeholder="请输入影响区域"
|
||||
:placeholder="t('infection.warning.affectedAreaPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="报告科室">
|
||||
<el-form-item :label="t('infection.warning.reportDept')">
|
||||
<el-input
|
||||
v-model="formData.departmentName"
|
||||
placeholder="请输入报告科室"
|
||||
:placeholder="t('infection.warning.reportDeptPlaceholder')"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAdd = false">
|
||||
取消
|
||||
{{ t('common.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
>
|
||||
确定
|
||||
{{ t('common.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -348,10 +348,13 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {ref, reactive, onMounted} from 'vue'
|
||||
import {ref, reactive, onMounted, computed} from 'vue'
|
||||
import {useI18n} from 'vue-i18n'
|
||||
import {ElMessage} from 'element-plus'
|
||||
import {getPage, add} from './api'
|
||||
|
||||
const {t} = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const tableData = ref([])
|
||||
const total = ref(0)
|
||||
@@ -364,13 +367,17 @@ const formData = reactive({
|
||||
caseCount:0, thresholdCount:0, affectedArea:'', departmentName:''
|
||||
})
|
||||
|
||||
function warningLevelText(val) {
|
||||
const map = {LEVEL1: t('infection.warning.level1'), LEVEL2: t('infection.warning.level2'), LEVEL3: t('infection.warning.level3')}
|
||||
return map[val] || val
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
loading.value = true
|
||||
try {
|
||||
const r = await getPage(q.value)
|
||||
tableData.value = r.data?.records || []
|
||||
total.value = r.data?.total || 0
|
||||
// Calculate stats from data
|
||||
let l1 = 0, l2 = 0, l3 = 0
|
||||
tableData.value.forEach(row => {
|
||||
if (row.warningLevel === 'LEVEL1') l1++
|
||||
@@ -387,12 +394,12 @@ function resetQuery() {
|
||||
}
|
||||
|
||||
function handleDetail(row) {
|
||||
ElMessage.info('详情: ' + row.diseaseName + ' - ' + ({LEVEL1:'一级',LEVEL2:'二级',LEVEL3:'三级'}[row.warningLevel] || ''))
|
||||
ElMessage.info(t('infection.warning.detailInfo', { name: row.diseaseName, level: warningLevelText(row.warningLevel) }))
|
||||
}
|
||||
|
||||
async function submitForm() {
|
||||
await add(formData)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.warning.addSuccess'))
|
||||
showAdd.value = false
|
||||
Object.assign(formData, {diseaseName:'', warningLevel:'LEVEL2', diseaseType:'RESPIRATORY', caseCount:0, thresholdCount:0, affectedArea:'', departmentName:''})
|
||||
loadData()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="infection-enhanced-container">
|
||||
<div class="page-header">
|
||||
<span class="tab-title">院感管理增强</span>
|
||||
<span class="tab-title">{{ $t('infection.enhanced.title') }}</span>
|
||||
</div>
|
||||
|
||||
<el-tabs
|
||||
@@ -10,7 +10,7 @@
|
||||
>
|
||||
<!-- 暴发预警 -->
|
||||
<el-tab-pane
|
||||
label="暴发预警"
|
||||
:label="$t('infection.enhanced.outbreakTab')"
|
||||
name="outbreak"
|
||||
>
|
||||
<div style="margin-bottom: 12px">
|
||||
@@ -18,7 +18,7 @@
|
||||
type="success"
|
||||
@click="showAddOutbreak = true"
|
||||
>
|
||||
新增预警
|
||||
{{ $t('infection.enhanced.addWarning') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -30,23 +30,23 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.enhanced.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="infectionType"
|
||||
label="感染类型"
|
||||
:label="$t('infection.enhanced.infectionType')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="caseCount"
|
||||
label="病例数"
|
||||
:label="$t('infection.enhanced.caseCount')"
|
||||
width="80"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="warningLevel"
|
||||
label="预警级别"
|
||||
:label="$t('infection.enhanced.warningLevel')"
|
||||
width="100"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -54,13 +54,13 @@
|
||||
:type="row.warningLevel === 'RED' ? 'danger' : 'warning'"
|
||||
size="small"
|
||||
>
|
||||
{{ row.warningLevel === 'RED' ? '🔴 红色' : '🟡 黄色' }}
|
||||
{{ row.warningLevel === 'RED' ? $t('infection.enhanced.redWarning') : $t('infection.enhanced.yellowWarning') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="status"
|
||||
label="状态"
|
||||
:label="$t('infection.enhanced.status')"
|
||||
width="100"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -68,17 +68,17 @@
|
||||
:type="['warning','info','success',''][row.status]"
|
||||
size="small"
|
||||
>
|
||||
{{ ['待处理','处理中','已处理','已排除'][row.status] }}
|
||||
{{ [$t('infection.enhanced.statusPending'),$t('infection.enhanced.statusProcessing'),$t('infection.enhanced.statusProcessed'),$t('infection.enhanced.statusExcluded')][row.status] }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="createTime"
|
||||
label="预警时间"
|
||||
:label="$t('infection.enhanced.warningTime')"
|
||||
width="170"
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('infection.enhanced.operation')"
|
||||
width="180"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -89,7 +89,7 @@
|
||||
size="small"
|
||||
@click="handleOutbreakAction(row)"
|
||||
>
|
||||
处理
|
||||
{{ $t('infection.enhanced.handle') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.status === 0"
|
||||
@@ -98,7 +98,7 @@
|
||||
size="small"
|
||||
@click="excludeOutbreakAction(row)"
|
||||
>
|
||||
排除
|
||||
{{ $t('infection.enhanced.exclude') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
<!-- 目标性监测 -->
|
||||
<el-tab-pane
|
||||
label="目标性监测"
|
||||
:label="$t('infection.enhanced.surveillanceTab')"
|
||||
name="surveillance"
|
||||
>
|
||||
<div style="margin-bottom: 12px">
|
||||
@@ -115,7 +115,7 @@
|
||||
type="success"
|
||||
@click="showAddSurveillance = true"
|
||||
>
|
||||
新增监测
|
||||
{{ $t('infection.enhanced.addMonitor') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -127,38 +127,38 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="surveillanceType"
|
||||
label="监测类型"
|
||||
:label="$t('infection.enhanced.monitorType')"
|
||||
width="120"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
{{ ['','ICU监测','手术部位','导管相关','其他'][row.surveillanceType] || '未知' }}
|
||||
{{ ['',$t('infection.enhanced.icuMonitor'),$t('infection.enhanced.surgicalSite'),$t('infection.enhanced.catheterRelated'),$t('infection.enhanced.other')][row.surveillanceType] || $t('infection.enhanced.unknown') }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.enhanced.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="monitorObject"
|
||||
label="监测对象"
|
||||
:label="$t('infection.enhanced.monitorObject')"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="totalCases"
|
||||
label="总例数"
|
||||
:label="$t('infection.enhanced.totalCases')"
|
||||
width="80"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="infectionCases"
|
||||
label="感染例数"
|
||||
:label="$t('infection.enhanced.infectionCases')"
|
||||
width="80"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="infectionRate"
|
||||
label="感染率"
|
||||
:label="$t('infection.enhanced.infectionRate')"
|
||||
width="80"
|
||||
align="center"
|
||||
>
|
||||
@@ -168,7 +168,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="startDate"
|
||||
label="开始日期"
|
||||
:label="$t('infection.enhanced.startDate')"
|
||||
width="120"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -176,7 +176,7 @@
|
||||
|
||||
<!-- 手卫生监测 -->
|
||||
<el-tab-pane
|
||||
label="手卫生监测"
|
||||
:label="$t('infection.enhanced.handHygieneTab')"
|
||||
name="handHygiene"
|
||||
>
|
||||
<div style="margin-bottom: 12px">
|
||||
@@ -184,7 +184,7 @@
|
||||
type="success"
|
||||
@click="showAddHandHygiene = true"
|
||||
>
|
||||
新增记录
|
||||
{{ $t('infection.enhanced.addRecord') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-card
|
||||
@@ -195,17 +195,17 @@
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #409eff">
|
||||
{{ hhStats.totalObserve || 0 }}
|
||||
</div><div>总观察次数</div>
|
||||
</div><div>{{ $t('infection.enhanced.totalObserve') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #67c23a">
|
||||
{{ hhStats.totalComply || 0 }}
|
||||
</div><div>总依从次数</div>
|
||||
</div><div>{{ $t('infection.enhanced.totalComply') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size: 28px; font-weight: bold; color: #e6a23c">
|
||||
{{ hhStats.overallRate || 0 }}%
|
||||
</div><div>总体依从率</div>
|
||||
</div><div>{{ $t('infection.enhanced.overallRate') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -217,29 +217,29 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.enhanced.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="monitorDate"
|
||||
label="监测日期"
|
||||
:label="$t('infection.enhanced.monitorDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="observeCount"
|
||||
label="观察次数"
|
||||
:label="$t('infection.enhanced.observeCount')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="complyCount"
|
||||
label="依从次数"
|
||||
:label="$t('infection.enhanced.complyCount')"
|
||||
width="100"
|
||||
align="center"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="complyRate"
|
||||
label="依从率"
|
||||
:label="$t('infection.enhanced.complyRate')"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
@@ -254,7 +254,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="observerName"
|
||||
label="观察者"
|
||||
:label="$t('infection.enhanced.observer')"
|
||||
width="100"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -262,7 +262,7 @@
|
||||
|
||||
<!-- 多重耐药菌 -->
|
||||
<el-tab-pane
|
||||
label="多重耐药菌"
|
||||
:label="$t('infection.enhanced.mdrTab')"
|
||||
name="mdr"
|
||||
>
|
||||
<div style="margin-bottom: 12px">
|
||||
@@ -270,7 +270,7 @@
|
||||
type="success"
|
||||
@click="showAddMdr = true"
|
||||
>
|
||||
新增记录
|
||||
{{ $t('infection.enhanced.addRecord') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -282,33 +282,33 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="patientName"
|
||||
label="患者"
|
||||
:label="$t('infection.enhanced.patient')"
|
||||
width="90"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.enhanced.department')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="bacteriaName"
|
||||
label="菌种"
|
||||
:label="$t('infection.enhanced.bacteriaName')"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="resistanceType"
|
||||
label="耐药类型"
|
||||
:label="$t('infection.enhanced.resistanceType')"
|
||||
width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="specimenType"
|
||||
label="标本类型"
|
||||
:label="$t('infection.enhanced.specimenType')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="isolationStatus"
|
||||
label="隔离状态"
|
||||
:label="$t('infection.enhanced.isolationStatus')"
|
||||
width="100"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -316,17 +316,17 @@
|
||||
:type="['info','danger','success'][row.isolationStatus]"
|
||||
size="small"
|
||||
>
|
||||
{{ ['未隔离','已隔离','已解除'][row.isolationStatus] }}
|
||||
{{ [$t('infection.enhanced.notIsolated'),$t('infection.enhanced.isolated'),$t('infection.enhanced.released')][row.isolationStatus] }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="reportDate"
|
||||
label="报告日期"
|
||||
:label="$t('infection.enhanced.reportDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
:label="$t('infection.enhanced.operation')"
|
||||
width="180"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -337,7 +337,7 @@
|
||||
size="small"
|
||||
@click="isolateAction(row)"
|
||||
>
|
||||
隔离
|
||||
{{ $t('infection.enhanced.isolate') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.isolationStatus === 1"
|
||||
@@ -346,7 +346,7 @@
|
||||
size="small"
|
||||
@click="releaseAction(row)"
|
||||
>
|
||||
解除
|
||||
{{ $t('infection.enhanced.release') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -355,7 +355,7 @@
|
||||
|
||||
<!-- 环境卫生学监测 -->
|
||||
<el-tab-pane
|
||||
label="环境卫生学监测"
|
||||
:label="$t('infection.enhanced.envMonitorTab')"
|
||||
name="envMonitor"
|
||||
>
|
||||
<div style="margin-bottom: 12px">
|
||||
@@ -363,7 +363,7 @@
|
||||
type="success"
|
||||
@click="showAddEnv = true"
|
||||
>
|
||||
新增记录
|
||||
{{ $t('infection.enhanced.addRecord') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
@@ -375,12 +375,12 @@
|
||||
>
|
||||
<el-table-column
|
||||
prop="departmentName"
|
||||
label="科室"
|
||||
:label="$t('infection.enhanced.department')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="monitorType"
|
||||
label="监测类型"
|
||||
:label="$t('infection.enhanced.monitorType')"
|
||||
width="100"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -389,27 +389,27 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="monitorItem"
|
||||
label="监测项目"
|
||||
:label="$t('infection.enhanced.monitorItem')"
|
||||
width="150"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="monitorDate"
|
||||
label="监测日期"
|
||||
:label="$t('infection.enhanced.monitorDate')"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="standardValue"
|
||||
label="标准值"
|
||||
:label="$t('infection.enhanced.standardValue')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="actualValue"
|
||||
label="实测值"
|
||||
:label="$t('infection.enhanced.actualValue')"
|
||||
width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
prop="result"
|
||||
label="结果"
|
||||
:label="$t('infection.enhanced.result')"
|
||||
width="80"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -423,7 +423,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="testerName"
|
||||
label="检测人"
|
||||
:label="$t('infection.enhanced.tester')"
|
||||
width="100"
|
||||
/>
|
||||
</el-table>
|
||||
@@ -433,26 +433,26 @@
|
||||
<!-- 新增暴发预警弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAddOutbreak"
|
||||
title="新增暴发预警"
|
||||
:title="$t('infection.enhanced.addOutbreakWarning')"
|
||||
width="500px"
|
||||
>
|
||||
<el-form
|
||||
:model="outbreakForm"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="$t('infection.enhanced.department')">
|
||||
<el-input v-model="outbreakForm.departmentName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="感染类型">
|
||||
<el-form-item :label="$t('infection.enhanced.infectionType')">
|
||||
<el-input v-model="outbreakForm.infectionType" />
|
||||
</el-form-item>
|
||||
<el-form-item label="病例数">
|
||||
<el-form-item :label="$t('infection.enhanced.caseCount')">
|
||||
<el-input-number
|
||||
v-model="outbreakForm.caseCount"
|
||||
:min="1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="预警级别">
|
||||
<el-form-item :label="$t('infection.enhanced.warningLevel')">
|
||||
<el-select v-model="outbreakForm.warningLevel">
|
||||
<el-option
|
||||
v-for="d in infection_alert_level"
|
||||
@@ -465,13 +465,13 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAddOutbreak = false">
|
||||
取消
|
||||
{{ $t('infection.enhanced.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitOutbreak"
|
||||
>
|
||||
确认
|
||||
{{ $t('infection.enhanced.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -479,48 +479,48 @@
|
||||
<!-- 新增手卫生弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAddHandHygiene"
|
||||
title="新增手卫生监测"
|
||||
:title="$t('infection.enhanced.addHandHygiene')"
|
||||
width="500px"
|
||||
>
|
||||
<el-form
|
||||
:model="hhForm"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="$t('infection.enhanced.department')">
|
||||
<el-input v-model="hhForm.departmentName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="监测日期">
|
||||
<el-form-item :label="$t('infection.enhanced.monitorDate')">
|
||||
<el-date-picker
|
||||
v-model="hhForm.monitorDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="观察次数">
|
||||
<el-form-item :label="$t('infection.enhanced.observeCount')">
|
||||
<el-input-number
|
||||
v-model="hhForm.observeCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="依从次数">
|
||||
<el-form-item :label="$t('infection.enhanced.complyCount')">
|
||||
<el-input-number
|
||||
v-model="hhForm.complyCount"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="观察者">
|
||||
<el-form-item :label="$t('infection.enhanced.observer')">
|
||||
<el-input v-model="hhForm.observerName" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAddHandHygiene = false">
|
||||
取消
|
||||
{{ $t('infection.enhanced.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitHandHygiene"
|
||||
>
|
||||
确认
|
||||
{{ $t('infection.enhanced.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -528,29 +528,29 @@
|
||||
<!-- 新增多重耐药菌弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAddMdr"
|
||||
title="新增多重耐药菌记录"
|
||||
:title="$t('infection.enhanced.addMdrRecord')"
|
||||
width="550px"
|
||||
>
|
||||
<el-form
|
||||
:model="mdrForm"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="患者姓名">
|
||||
<el-form-item :label="$t('infection.enhanced.patientName')">
|
||||
<el-input v-model="mdrForm.patientName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="$t('infection.enhanced.department')">
|
||||
<el-input v-model="mdrForm.departmentName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="菌种名称">
|
||||
<el-form-item :label="$t('infection.enhanced.bacteriaNameLabel')">
|
||||
<el-input v-model="mdrForm.bacteriaName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="耐药类型">
|
||||
<el-form-item :label="$t('infection.enhanced.resistanceType')">
|
||||
<el-input v-model="mdrForm.resistanceType" />
|
||||
</el-form-item>
|
||||
<el-form-item label="标本类型">
|
||||
<el-form-item :label="$t('infection.enhanced.specimenType')">
|
||||
<el-input v-model="mdrForm.specimenType" />
|
||||
</el-form-item>
|
||||
<el-form-item label="报告日期">
|
||||
<el-form-item :label="$t('infection.enhanced.reportDate')">
|
||||
<el-date-picker
|
||||
v-model="mdrForm.reportDate"
|
||||
type="date"
|
||||
@@ -560,13 +560,13 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAddMdr = false">
|
||||
取消
|
||||
{{ $t('infection.enhanced.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitMdr"
|
||||
>
|
||||
确认
|
||||
{{ $t('infection.enhanced.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -574,76 +574,76 @@
|
||||
<!-- 新增环境监测弹窗 -->
|
||||
<el-dialog
|
||||
v-model="showAddEnv"
|
||||
title="新增环境卫生学监测"
|
||||
:title="$t('infection.enhanced.addEnvMonitor')"
|
||||
width="550px"
|
||||
>
|
||||
<el-form
|
||||
:model="envForm"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="科室">
|
||||
<el-form-item :label="$t('infection.enhanced.department')">
|
||||
<el-input v-model="envForm.departmentName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="监测类型">
|
||||
<el-form-item :label="$t('infection.enhanced.monitorType')">
|
||||
<el-select v-model="envForm.monitorType">
|
||||
<el-option
|
||||
label="空气"
|
||||
:label="$t('infection.enhanced.envAir')"
|
||||
value="1"
|
||||
/><el-option
|
||||
label="物表"
|
||||
:label="$t('infection.enhanced.envSurface')"
|
||||
value="2"
|
||||
/>
|
||||
<el-option
|
||||
label="手"
|
||||
:label="$t('infection.enhanced.envHand')"
|
||||
value="3"
|
||||
/><el-option
|
||||
label="消毒液"
|
||||
:label="$t('infection.enhanced.envDisinfectant')"
|
||||
value="4"
|
||||
/>
|
||||
<el-option
|
||||
label="无菌物品"
|
||||
:label="$t('infection.enhanced.envSterile')"
|
||||
value="5"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="监测项目">
|
||||
<el-form-item :label="$t('infection.enhanced.monitorItem')">
|
||||
<el-input v-model="envForm.monitorItem" />
|
||||
</el-form-item>
|
||||
<el-form-item label="监测日期">
|
||||
<el-form-item :label="$t('infection.enhanced.monitorDate')">
|
||||
<el-date-picker
|
||||
v-model="envForm.monitorDate"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="标准值">
|
||||
<el-form-item :label="$t('infection.enhanced.standardValue')">
|
||||
<el-input v-model="envForm.standardValue" />
|
||||
</el-form-item>
|
||||
<el-form-item label="实测值">
|
||||
<el-form-item :label="$t('infection.enhanced.actualValue')">
|
||||
<el-input v-model="envForm.actualValue" />
|
||||
</el-form-item>
|
||||
<el-form-item label="结果">
|
||||
<el-form-item :label="$t('infection.enhanced.result')">
|
||||
<el-radio-group v-model="envForm.result">
|
||||
<el-radio value="合格">
|
||||
合格
|
||||
{{ $t('infection.enhanced.qualified') }}
|
||||
</el-radio><el-radio value="不合格">
|
||||
不合格
|
||||
{{ $t('infection.enhanced.unqualified') }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="检测人">
|
||||
<el-form-item :label="$t('infection.enhanced.tester')">
|
||||
<el-input v-model="envForm.testerName" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="showAddEnv = false">
|
||||
取消
|
||||
{{ $t('infection.enhanced.cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitEnv"
|
||||
>
|
||||
确认
|
||||
{{ $t('infection.enhanced.confirm') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@@ -653,9 +653,11 @@
|
||||
<script setup>
|
||||
import { useDict } from '@/utils/dict'
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { getOutbreakPage, addOutbreak, handleOutbreak, excludeOutbreak, getSurveillancePage, addSurveillance, getHandHygienePage, addHandHygiene, getHandHygieneStats, getMdrPage, addMdr, isolateMdr, releaseMdr, getEnvMonitorPage, addEnvMonitor } from './api'
|
||||
|
||||
const { t } = useI18n()
|
||||
const activeTab = ref('outbreak')
|
||||
const { infection_alert_level, environment_monitor_type } = useDict('infection_alert_level', 'environment_monitor_type')
|
||||
const loading = ref(false)
|
||||
@@ -702,57 +704,57 @@ const loadData = async () => {
|
||||
}
|
||||
|
||||
const handleOutbreakAction = async (row) => {
|
||||
const { value } = await ElMessageBox.prompt('请输入处理结果', '处理预警', { inputType: 'textarea' })
|
||||
const { value } = await ElMessageBox.prompt(t('infection.enhanced.promptHandleResult'), t('infection.enhanced.handleWarning'), { inputType: 'textarea' })
|
||||
await handleOutbreak({ id: row.id, handleResult: value })
|
||||
ElMessage.success('处理成功')
|
||||
ElMessage.success(t('infection.enhanced.handleSuccess'))
|
||||
loadData()
|
||||
}
|
||||
|
||||
const excludeOutbreakAction = async (row) => {
|
||||
await ElMessageBox.confirm('确认排除此预警?', '确认')
|
||||
await ElMessageBox.confirm(t('infection.enhanced.confirmExclude'), t('infection.enhanced.confirm'))
|
||||
await excludeOutbreak(row.id, '误报')
|
||||
ElMessage.success('已排除')
|
||||
ElMessage.success(t('infection.enhanced.excluded'))
|
||||
loadData()
|
||||
}
|
||||
|
||||
const isolateAction = async (row) => {
|
||||
await ElMessageBox.confirm('确认标记为隔离状态?', '确认隔离')
|
||||
await ElMessageBox.confirm(t('infection.enhanced.confirmIsolate'), t('infection.enhanced.confirmIsolateTitle'))
|
||||
await isolateMdr({ id: row.id })
|
||||
ElMessage.success('已隔离')
|
||||
ElMessage.success(t('infection.enhanced.isolated'))
|
||||
loadData()
|
||||
}
|
||||
|
||||
const releaseAction = async (row) => {
|
||||
await ElMessageBox.confirm('确认解除隔离?', '确认解除')
|
||||
await ElMessageBox.confirm(t('infection.enhanced.confirmRelease'), t('infection.enhanced.confirmReleaseTitle'))
|
||||
await releaseMdr(row.id)
|
||||
ElMessage.success('已解除')
|
||||
ElMessage.success(t('infection.enhanced.released'))
|
||||
loadData()
|
||||
}
|
||||
|
||||
const submitOutbreak = async () => {
|
||||
await addOutbreak(outbreakForm)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.enhanced.addSuccess'))
|
||||
showAddOutbreak.value = false
|
||||
loadData()
|
||||
}
|
||||
|
||||
const submitHandHygiene = async () => {
|
||||
await addHandHygiene(hhForm)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.enhanced.addSuccess'))
|
||||
showAddHandHygiene.value = false
|
||||
loadData()
|
||||
}
|
||||
|
||||
const submitMdr = async () => {
|
||||
await addMdr(mdrForm)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.enhanced.addSuccess'))
|
||||
showAddMdr.value = false
|
||||
loadData()
|
||||
}
|
||||
|
||||
const submitEnv = async () => {
|
||||
await addEnvMonitor(envForm)
|
||||
ElMessage.success('新增成功')
|
||||
ElMessage.success(t('infection.enhanced.addSuccess'))
|
||||
showAddEnv.value = false
|
||||
loadData()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user