From 24ea1c9e1a0109cb015de342d312657e6ac56ff7 Mon Sep 17 00:00:00 2001 From: chenqi Date: Wed, 24 Jun 2026 22:37:08 +0800 Subject: [PATCH] feat(i18n): migrate nursing, inpatient, mobile nursing pages + billing remaining components to vue-i18n --- healthlink-his-ui/src/i18n/locales/enUS.json | 472 +++++++++++ healthlink-his-ui/src/i18n/locales/viVN.json | 472 +++++++++++ healthlink-his-ui/src/i18n/locales/zhCN.json | 472 +++++++++++ .../components/reprintDialog.vue | 14 +- .../inpatientNurseStation/index.vue | 99 +-- .../nursing/assessment/NutritionScreening.vue | 66 +- .../nursing/assessment/PainAssessment.vue | 66 +- .../nursing/assessment/PipeRiskAssessment.vue | 58 +- .../src/views/nursing/assessment/index.vue | 16 +- .../src/views/nursingenhanced/assessment.vue | 745 +++++------------- .../src/views/nursingenhanced/index.vue | 307 +++----- .../src/views/nursingexecution/index.vue | 279 ++----- .../nursingmobile/InfusionManagement.vue | 260 ++---- .../views/nursingmobile/NursingAssessment.vue | 375 +++------ .../src/views/nursingmobile/OrderList.vue | 188 ++--- .../src/views/nursingmobile/PatientList.vue | 171 +--- .../src/views/nursingmobile/VitalSign.vue | 142 ++-- .../views/nursingmobile/VitalSignTrend.vue | 193 +---- .../src/views/nursingquality/index.vue | 528 ++++--------- 19 files changed, 2387 insertions(+), 2536 deletions(-) diff --git a/healthlink-his-ui/src/i18n/locales/enUS.json b/healthlink-his-ui/src/i18n/locales/enUS.json index 5ad629e62..a0487bfcf 100644 --- a/healthlink-his-ui/src/i18n/locales/enUS.json +++ b/healthlink-his-ui/src/i18n/locales/enUS.json @@ -1097,5 +1097,477 @@ "statusCompleted": "Completed", "statusCancelled": "Cancelled", "statusInProgress": "In Progress" + }, + "nursing": { + "assessment": { + "encounterId": "Encounter ID", + "assessmentType": "Assessment Type", + "assessmentTool": "Assessment Tool", + "score": "Score", + "riskLevel": "Risk Level", + "assessor": "Assessor", + "assessmentTime": "Assessment Time", + "search": "Search", + "painTitle": "Pain Assessment NRS/VAS", + "patientId": "Patient ID", + "patientName": "Patient Name", + "painScore": "Pain Score", + "detail": "Assessment Detail", + "assessorName": "Assessor", + "submitAssessment": "Submit Assessment", + "reset": "Reset", + "assessmentRecords": "Assessment Records", + "detailPlaceholder": "Enter pain location, nature, duration, etc.", + "submitSuccess": "Assessment submitted successfully", + "submitFailed": "Submission failed", + "getRecordsFailed": "Failed to get records", + "nutritionTitle": "Nutrition Risk Screening NRS2002", + "totalScore": "Total Score", + "submitScreening": "Submit Screening", + "screeningRecords": "Screening Records", + "screeningSubmitSuccess": "Screening submitted successfully", + "pipeTitle": "Tube Dislodgement Risk Assessment", + "interventionContent": "Intervention Content", + "nurseName": "Nurse Name", + "interventionPlaceholder": "Enter assessment content, e.g.: high risk, medium risk, low risk, activity, fixation keywords", + "nursePlaceholder": "Enter nurse name", + "createTime": "Created Time", + "valEncounterId": "Please enter encounter ID", + "valPatientId": "Please enter patient ID", + "valPatientName": "Please enter patient name", + "valPainScore": "Please enter pain score", + "valAssessor": "Please enter assessor", + "valTotalScore": "Please enter total score", + "valInterventionContent": "Please enter assessment content", + "valNurseName": "Please enter nurse name", + "valTemperature": "Please enter temperature", + "valPulse": "Please enter pulse", + "valSystolicBp": "Please enter systolic BP", + "valDiastolicBp": "Please enter diastolic BP", + "valDrugName": "Please enter drug name", + "valBarcode": "Please enter barcode" + }, + "mobile": { + "patientList": "Patient List", + "searchPlaceholder": "Search name/bed no.", + "bedNo": "Bed No.", + "nursingLevel": "Nursing Level", + "condition": "Condition", + "diagnosis": "Diagnosis", + "noPatients": "No patients", + "vitalSignEntry": "Vital Sign Entry", + "patient": "Patient", + "recordDate": "Record Date", + "selectDate": "Select Date", + "recordHour": "Hour", + "temperature": "Temperature", + "pulse": "Pulse", + "respiration": "Respiration", + "systolicBp": "Systolic BP", + "diastolicBp": "Diastolic BP", + "painScore": "Pain Score", + "consciousness": "Consciousness", + "consciousClear": "Alert", + "consciousDrowsy": "Drowsy", + "consciousConfused": "Confused", + "consciousStupor": "Stupor", + "consciousComaShallow": "Shallow Coma", + "consciousComaDeep": "Deep Coma", + "inputVolume": "Intake", + "outputVolume": "Output", + "save": "Save", + "saveSuccess": "Saved successfully", + "saveFailed": "Save failed", + "unitTimesPerMin": "times/min", + "nursingAssessment": "Nursing Assessment", + "bradenPressure": "Braden Pressure Ulcer", + "morseFall": "Morse Fall", + "nrs2002Nutrition": "NRS2002 Nutrition", + "totalScoreLabel": "Total Score", + "riskLevelLabel": "Risk Level", + "assessmentRemark": "Assessment Remark", + "optionalRemark": "Optional remark", + "submitAssessmentBtn": "Submit Assessment", + "assessmentRecordsLabel": "Assessment Records", + "noAssessmentRecords": "No assessment records", + "scoreLabel": "Score", + "completeAssessment": "Please complete all assessment items", + "assessmentSubmitSuccess": "Assessment submitted successfully", + "assessmentSubmitFailed": "Submission failed", + "highRisk": "High Risk", + "mediumRisk": "Medium Risk", + "lowRisk": "Low Risk", + "normal": "Normal", + "unknown": "Unknown", + "bradenSensory": "Sensory Perception", + "bradenMoisture": "Moisture", + "bradenActivity": "Activity", + "bradenMobility": "Mobility", + "bradenNutrition": "Nutrition", + "bradenFriction": "Friction and Shear", + "sensoryComplete": "Completely Limited", + "sensorySevere": "Severely Limited", + "sensoryMild": "Slightly Limited", + "sensoryNone": "No Impairment", + "moisturePersistent": "Constantly Moist", + "moistureFrequent": "Often Moist", + "moistureOccasional": "Occasionally Moist", + "moistureRare": "Rarely Moist", + "activityBed": "Bedfast", + "activityChair": "Chairfast", + "activityOccasionalWalk": "Walks Occasionally", + "activityFrequentWalk": "Walks Frequently", + "mobilityNone": "Completely Immobile", + "mobilitySevere": "Very Limited", + "mobilityMild": "Slightly Limited", + "mobilityUnlimited": "No Limitation", + "nutritionVeryPoor": "Very Poor", + "nutritionProbablyInsufficient": "Probably Inadequate", + "nutritionAdequate": "Adequate", + "nutritionRich": "Excellent", + "frictionProblem": "Problem", + "frictionPotential": "Potential Problem", + "frictionNone": "No Apparent Problem", + "morseFallHistory": "Fall History", + "morseDiagnosis": "More Than One Medical Diagnosis", + "morseAmbulation": "Ambulation Aid", + "morseIV": "IV Therapy", + "morseGait": "Gait", + "morseMental": "Mental Status", + "yes": "Yes", + "no": "No", + "ambulationBedWheelchair": "Bed/Wheelchair", + "ambulationCrutch": "Crutch/Cane/Walker", + "ambulationFurniture": "Furniture", + "gaitNormal": "Normal/Bed/Wheelchair", + "gaitWeak": "Weak", + "gaitImpaired": "Impaired", + "mentalCorrect": "Correct Self-assessment", + "mentalOverestimate": "Overestimates/Forgets Limitations", + "nrs2002BMI": "BMI(kg/m²)", + "nrs2002WeightLoss": "Weight Loss", + "nrs2002Intake": "Dietary Intake", + "nrs2002Illness": "Severity of Illness", + "intakeNone": "None", + "intakePoor": "Poor", + "intakeModerate": "Moderate", + "intakeGood": "Good", + "illnessSurgery": "Major Surgery/Trauma", + "illnessFracture": "Hip Fracture", + "illnessAcute": "Chronic Disease Acute", + "illnessMild": "None/Mild", + "orderExecuting": "Executing", + "orderProofread": "Proofread", + "all": "All", + "scanExecute": "Scan to Execute", + "type": "Type", + "frequency": "Frequency", + "dosage": "Dosage", + "orderDoctor": "Ordering Doctor", + "execute": "Execute", + "noOrders": "No orders", + "scanExecuteTitle": "Scan to Execute", + "barcode": "Barcode", + "barcodePlaceholder": "Scan or enter barcode", + "confirmExecute": "Confirm Execute", + "confirmExecuteOrder": "Confirm execute order", + "executeSuccess": "Executed successfully", + "executeFailed": "Execution failed", + "orderMatchFailed": "No matching order found", + "infusionManagement": "Infusion Management", + "startInfusion": "Start Infusion", + "infusionSpeed": "Infusion Rate", + "totalVolume": "Total Volume (ml)", + "patrolNurse": "Patrol Nurse", + "executeNurse": "Execute Nurse", + "confirmStart": "Confirm Start", + "infusionPatrol": "Infusion Patrol", + "dripRateLabel": "Drip Rate (drops/min)", + "patencyStatus": "Patency Status", + "adverseReaction": "Adverse Reaction", + "emptyLeaveBlank": "Leave blank if none", + "patrolNurseLabel": "Patrol Nurse", + "confirmRecord": "Confirm Record", + "infusionStarted": "Infusion started", + "operationFailed": "Operation failed", + "patrolRecordSaved": "Patrol record saved", + "recordFailed": "Record failed", + "patrolRecord": "Patrol Record", + "noInfusionRecords": "No infusion records", + "startInfusionTitle": "Start Infusion", + "drugName": "Drug Name", + "drugNamePlaceholder": "Enter drug name", + "infusionSpeedPlaceholder": "e.g.: 40 drops/min", + "occluded": "Occluded", + "phlebitis": "Phlebitis", + "vitalTrend": "Vital Sign Trend", + "days3": "3 Days", + "days7": "7 Days", + "days14": "14 Days", + "temperatureChart": "Temperature (°C)", + "pulseChart": "Pulse (beats/min)", + "bpChart": "Blood Pressure (mmHg)", + "respirationChart": "Respiration (breaths/min)", + "noData": "No data" + }, + "quality": { + "title": "Nursing Quality Indicator Management", + "refresh": "Refresh", + "addIndicator": "Add Indicator", + "collectIndicator": "Collect Indicators", + "exportReport": "Export Report", + "totalIndicators": "Total Indicators", + "metCount": "Met", + "unmetCount": "Unmet", + "meetRate": "Meet Rate", + "deptCount": "Departments", + "avgMeetRate": "Avg Meet Rate", + "meetRateTrend": "Meet Rate Trend", + "deptMeetCompare": "Department Meet Comparison", + "categoryDistribution": "Category Distribution", + "unmetWarning": "Unmet Indicator Warning", + "indicatorName": "Indicator Name", + "department": "Department", + "targetValue": "Target", + "actualValue": "Actual", + "gap": "Gap", + "indicatorCategory": "Indicator Category", + "basicNursing": "Basic Nursing", + "specializedNursing": "Specialized Nursing", + "nursingSafety": "Nursing Safety", + "nursingDocumentation": "Nursing Documentation", + "sterilization": "Sterilization", + "internalMedicine": "Internal Medicine", + "surgery": "Surgery", + "obstetrics": "Obstetrics", + "pediatrics": "Pediatrics", + "icu": "ICU", + "emergency": "Emergency", + "query": "Query", + "resetQuery": "Reset", + "indicatorCode": "Code", + "category": "Category", + "metStatus": "Status", + "met": "Met", + "unmet": "Unmet", + "statDate": "Stat Date", + "remark": "Remark", + "addDialog": "Add Nursing Quality Indicator", + "indicatorCodePlaceholder": "e.g.: NQ001", + "indicatorNamePlaceholder": "Enter indicator name", + "selectCategory": "Select", + "departmentPlaceholder": "Enter department", + "selectDate": "Select Date", + "cancel": "Cancel", + "confirm": "Confirm", + "addSuccess": "Added successfully", + "exportDev": "Export feature in development", + "collectSuccess": "Collected {count} indicators", + "collectFailed": "Collection failed", + "monthLabels": ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] + }, + "execution": { + "title": "Inpatient Nurse Execution", + "scanTab": "Scan Execution", + "addScan": "Add Scan", + "patient": "Patient", + "type": "Type", + "order": "Order", + "barcode": "Barcode", + "result": "Result", + "success": "Success", + "failed": "Failed", + "nurse": "Nurse", + "time": "Time", + "handoffTab": "Shift Handoff", + "addHandoff": "Add Handoff", + "keyPatientAlert": "Key Patient Alert", + "pending": "Pending", + "ward": "Ward", + "shift": "Shift", + "handoffNurse": "Handoff Nurse", + "receiveNurse": "Receive Nurse", + "patientCount": "Patients", + "criticalCount": "Critical", + "keyPatients": "Key Patients", + "status": "Status", + "draft": "Draft", + "handedOff": "Handed Off", + "confirmed": "Confirmed", + "operation": "Operation", + "confirm": "Confirm", + "confirmedMsg": "Confirmed", + "infusionTab": "Infusion Patrol", + "addPatrol": "Add Patrol", + "drug": "Drug", + "dripRate": "Drip Rate", + "patency": "Patency", + "patrolNurseLabel": "Patrol Nurse", + "normal": "Normal", + "abnormal": "Abnormal" + }, + "enhanced": { + "title": "Enhanced Nursing Assessment", + "reminderTab": "Assessment Reminders", + "carePlanTab": "Care Plans", + "qualityTab": "Quality Indicators", + "overdue": "Overdue", + "completedAssessment": "Completed", + "patient": "Patient", + "assessmentType": "Assessment Type", + "frequencyHours": "Frequency (hrs)", + "nextDeadline": "Next Deadline", + "status": "Status", + "pendingAssessment": "Pending", + "assessed": "Assessed", + "overdueStatus": "Overdue", + "completeAssessment": "Complete", + "addCarePlan": "Add Care Plan", + "nursingDiagnosis": "Nursing Diagnosis", + "nursingGoal": "Nursing Goal", + "nursingIntervention": "Nursing Intervention", + "newStatus": "New", + "executing": "Executing", + "completed": "Completed", + "stopped": "Stopped", + "evaluate": "Evaluate", + "totalReminders": "Total Reminders", + "totalCompleted": "Completed", + "totalOverdue": "Overdue", + "totalPlans": "Total Plans", + "completedPlans": "Completed Plans", + "addCarePlanTitle": "Add Care Plan", + "encounterId": "Encounter ID", + "cancel": "Cancel", + "save": "Save", + "evaluateTitle": "Evaluate Care Plan", + "evaluatePrompt": "Enter evaluation result", + "addSuccess": "Added successfully", + "assessmentComplete": "Assessment completed", + "evaluateComplete": "Evaluation completed", + "fallRisk": "Fall Risk", + "pressureUlcer": "Pressure Ulcer Risk", + "nutrition": "Nutrition Screening", + "pain": "Pain Assessment", + "pipeline": "Tube Assessment" + }, + "enhancedAssessment": { + "title": "Specialized Nursing Assessment", + "refreshStats": "Refresh Stats", + "exportReport": "Export Report", + "totalAssessments": "Total", + "highRiskPatients": "High Risk", + "mediumRiskPatients": "Medium Risk", + "intervened": "Intervened", + "pendingAssessment": "Pending", + "assessmentRate": "Assessment Rate", + "bradenTab": "Pressure Ulcer (Braden)", + "newBraden": "New Braden Assessment", + "morseTab": "Fall Assessment (Morse)", + "newMorse": "New Morse Assessment", + "nrs2002Tab": "Nutrition Screening (NRS2002)", + "newNrs2002": "New NRS2002 Assessment", + "painTab": "Pain Assessment", + "newPain": "New Pain Assessment", + "tubeTab": "Tube Risk Assessment", + "newTube": "New Tube Assessment", + "interventionTab": "Nursing Interventions", + "patient": "Patient", + "totalScore": "Total Score", + "risk": "Risk", + "assessor": "Assessor", + "assessmentTime": "Assessment Time", + "remark": "Remark", + "score": "Score", + "painLevel": "Pain Level", + "interventionType": "Intervention Type", + "interventionContent": "Intervention Content", + "status": "Status", + "executor": "Executor", + "executeTime": "Execute Time", + "high": "High", + "medium": "Medium", + "low": "Low", + "highRisk": "High Risk", + "mediumRisk": "Medium Risk", + "lowRisk": "Low Risk", + "severe": "Severe", + "moderatePain": "Moderate", + "mildPain": "Mild", + "pendingExec": "Pending", + "patientName": "Patient Name", + "patientNamePlaceholder": "Enter patient name", + "encounterId": "Encounter ID", + "encounterIdPlaceholder": "Enter encounter ID", + "bradenScale": "Braden Pressure Ulcer Risk Scale", + "sensation": "Sensation", + "moisture": "Moisture", + "activity": "Activity", + "mobility": "Mobility", + "nutrition": "Nutrition", + "friction": "Friction", + "sensationComplete": "Completely Limited", + "sensationSevere": "Severely Limited", + "sensationMild": "Slightly Limited", + "sensationIntact": "No Impairment", + "moisturePersistent": "Constantly Moist", + "moistureWet": "Moist", + "moistureOccasional": "Occasionally Moist", + "moistureRare": "Rarely Moist", + "activityBed": "Bedfast", + "activityWheelchair": "Chairfast", + "activityOccasionalWalk": "Walks Occasionally", + "activityFrequentWalk": "Walks Frequently", + "mobilityNone": "Completely Immobile", + "mobilitySevere": "Very Limited", + "mobilityMild": "Slightly Limited", + "mobilityUnlimited": "No Limitation", + "nutritionVeryPoor": "Very Poor", + "nutritionProbablyInsufficient": "Probably Inadequate", + "nutritionAdequate": "Adequate", + "nutritionRich": "Excellent", + "frictionProblem": "Problem", + "frictionPotential": "Potential Problem", + "frictionNone": "No Apparent Problem", + "totalScoreLabel": "Total Score", + "morseScale": "Morse Fall Risk Scale", + "fallHistory": "Fall History", + "diagnosis": "Diagnosis", + "ambulation": "Ambulation", + "ivTherapy": "IV Therapy", + "gait": "Gait", + "mentalState": "Mental State", + "no": "No", + "yes": "Yes", + "multiDiagnosis": "Yes (≥2)", + "noneOrWheelchair": "None/Bed/Wheelchair", + "crutchOrWalker": "Crutch/Walker", + "furniture": "Furniture", + "normalOrWheelchair": "Normal/Bed/Wheelchair", + "weak": "Weak", + "impaired": "Impaired", + "correctSelfAssessment": "Correct Self-assessment", + "overestimate": "Overestimates/Forgets", + "assessmentRemark": "Assessment Remark", + "remarkPlaceholder": "Enter assessment remark", + "cancel": "Cancel", + "submitAssessment": "Submit Assessment", + "submitSuccess": "Assessment submitted successfully", + "submitFailed": "Submission failed: {error}", + "exportDev": "Export feature in development" + }, + "station": { + "inOut": "Admission/Transfer/Discharge", + "inpatientRecord": "Inpatient Record", + "orderProofread": "Order Proofread", + "orderExecution": "Order Execution", + "nursingRecord": "Nursing Record", + "tprSheet": "TPR Chart", + "inpatientBilling": "Inpatient Billing", + "drugDistribution": "Drug Distribution", + "consumableInventory": "Consumable Inventory", + "rollFee": "Roll Fee Config", + "medicineReturn": "Medicine Return" + } } } diff --git a/healthlink-his-ui/src/i18n/locales/viVN.json b/healthlink-his-ui/src/i18n/locales/viVN.json index aa5709491..ab97bc7c2 100644 --- a/healthlink-his-ui/src/i18n/locales/viVN.json +++ b/healthlink-his-ui/src/i18n/locales/viVN.json @@ -1097,5 +1097,477 @@ "statusCompleted": "Hoàn thành", "statusCancelled": "Đã hủy", "statusInProgress": "Đang xử lý" + }, + "nursing": { + "assessment": { + "encounterId": "Mã khám bệnh", + "assessmentType": "Loại đánh giá", + "assessmentTool": "Công cụ đánh giá", + "score": "Điểm số", + "riskLevel": "Mức độ rủi ro", + "assessor": "Người đánh giá", + "assessmentTime": "Thời gian đánh giá", + "search": "Tìm kiếm", + "painTitle": "Đánh giá đau NRS/VAS", + "patientId": "Mã bệnh nhân", + "patientName": "Tên bệnh nhân", + "painScore": "Điểm đau", + "detail": "Chi tiết đánh giá", + "assessorName": "Người đánh giá", + "submitAssessment": "Gửi đánh giá", + "reset": "Đặt lại", + "assessmentRecords": "Hồ sơ đánh giá", + "detailPlaceholder": "Nhập vị trí đau, tính chất, thời gian...", + "submitSuccess": "Gửi đánh giá thành công", + "submitFailed": "Gửi thất bại", + "getRecordsFailed": "Lấy hồ sơ thất bại", + "nutritionTitle": "Sàng lọc nguy cơ dinh dưỡng NRS2002", + "totalScore": "Tổng điểm", + "submitScreening": "Gửi sàng lọc", + "screeningRecords": "Hồ sơ sàng lọc", + "screeningSubmitSuccess": "Gửi sàng lọc thành công", + "pipeTitle": "Đánh giá rủi ro tuột ống", + "interventionContent": "Nội dung can thiệp", + "nurseName": "Tên y tá", + "interventionPlaceholder": "Nhập nội dung đánh giá, ví dụ: rủi ro cao, trung bình, thấp...", + "nursePlaceholder": "Nhập tên y tá", + "createTime": "Thời gian tạo", + "valEncounterId": "Vui lòng nhập mã khám bệnh", + "valPatientId": "Vui lòng nhập mã bệnh nhân", + "valPatientName": "Vui lòng nhập tên bệnh nhân", + "valPainScore": "Vui lòng nhập điểm đau", + "valAssessor": "Vui lòng nhập người đánh giá", + "valTotalScore": "Vui lòng nhập tổng điểm", + "valInterventionContent": "Vui lòng nhập nội dung đánh giá", + "valNurseName": "Vui lòng nhập tên y tá", + "valTemperature": "Vui lòng nhập nhiệt độ", + "valPulse": "Vui lòng nhập mạch", + "valSystolicBp": "Vui lòng nhập huyết áp tâm thu", + "valDiastolicBp": "Vui lòng nhập huyết áp tâm trương", + "valDrugName": "Vui lòng nhập tên thuốc", + "valBarcode": "Vui lòng nhập mã vạch" + }, + "mobile": { + "patientList": "Danh sách bệnh nhân", + "searchPlaceholder": "Tìm tên/số giường", + "bedNo": "Số giường", + "nursingLevel": "Cấp điều dưỡng", + "condition": "Tình trạng", + "diagnosis": "Chẩn đoán", + "noPatients": "Không có bệnh nhân", + "vitalSignEntry": "Nhập dấu hiệu sinh tồn", + "patient": "Bệnh nhân", + "recordDate": "Ngày ghi nhận", + "selectDate": "Chọn ngày", + "recordHour": "Giờ", + "temperature": "Nhiệt độ", + "pulse": "Mạch", + "respiration": "Hô hấp", + "systolicBp": "Huyết áp tâm thu", + "diastolicBp": "Huyết áp tâm trương", + "painScore": "Điểm đau", + "consciousness": "Ý thức", + "consciousClear": "Tỉnh táo", + "consciousDrowsy": "Buồn ngủ", + "consciousConfused": "Lú lẫn", + "consciousStupor": "Sopor", + "consciousComaShallow": "Hôn mê nhẹ", + "consciousComaDeep": "Hôn mê sâu", + "inputVolume": "Lượng vào", + "outputVolume": "Lượng ra", + "save": "Lưu", + "saveSuccess": "Lưu thành công", + "saveFailed": "Lưu thất bại", + "unitTimesPerMin": "lần/phút", + "nursingAssessment": "Đánh giá điều dưỡng", + "bradenPressure": "Braden loét", + "morseFall": "Morse ngã", + "nrs2002Nutrition": "NRS2002 dinh dưỡng", + "totalScoreLabel": "Tổng điểm", + "riskLevelLabel": "Mức rủi ro", + "assessmentRemark": "Ghi chú đánh giá", + "optionalRemark": "Ghi chú tùy chọn", + "submitAssessmentBtn": "Gửi đánh giá", + "assessmentRecordsLabel": "Hồ sơ đánh giá", + "noAssessmentRecords": "Chưa có hồ sơ đánh giá", + "scoreLabel": "Điểm", + "completeAssessment": "Vui lòng hoàn thành tất cả mục đánh giá", + "assessmentSubmitSuccess": "Gửi đánh giá thành công", + "assessmentSubmitFailed": "Gửi thất bại", + "highRisk": "Rủi ro cao", + "mediumRisk": "Rủi ro trung bình", + "lowRisk": "Rủi ro thấp", + "normal": "Bình thường", + "unknown": "Không rõ", + "bradenSensory": "Cảm giác", + "bradenMoisture": "Độ ẩm", + "bradenActivity": "Hoạt động", + "bradenMobility": "Di chuyển", + "bradenNutrition": "Dinh dưỡng", + "bradenFriction": "Ma sát và cắt", + "sensoryComplete": "Hoàn toàn hạn chế", + "sensorySevere": "Hạn chế nghiêm trọng", + "sensoryMild": "Hạn chế nhẹ", + "sensoryNone": "Không suy giảm", + "moisturePersistent": "Luôn ẩm", + "moistureFrequent": "Thường ẩm", + "moistureOccasional": "Thỉnh thoảng ẩm", + "moistureRare": "Hiếm khi ẩm", + "activityBed": "Nằm liệt giường", + "activityChair": "Chỉ ngồi ghế", + "activityOccasionalWalk": "Thỉnh thoảng đi bộ", + "activityFrequentWalk": "Thường xuyên đi bộ", + "mobilityNone": "Hoàn toàn bất động", + "mobilitySevere": "Rất hạn chế", + "mobilityMild": "Hạn chế nhẹ", + "mobilityUnlimited": "Không hạn chế", + "nutritionVeryPoor": "Rất kém", + "nutritionProbablyInsufficient": "Có thể không đủ", + "nutritionAdequate": "Đủ", + "nutritionRich": "Giàu", + "frictionProblem": "Có vấn đề", + "frictionPotential": "Tiềm ẩn vấn đề", + "frictionNone": "Không có vấn đề", + "morseFallHistory": "Tiền sử ngã", + "morseDiagnosis": "Nhiều chẩn đoán y khoa", + "morseAmbulation": "Phương tiện đi lại", + "morseIV": "Truyền tĩnh mạch", + "morseGait": "Bước đi", + "morseMental": "Tinh thần", + "yes": "Có", + "no": "Không", + "ambulationBedWheelchair": "Giường/Xe lăn", + "ambulationCrutch": "Nạng/Gậy/Khung đi", + "ambulationFurniture": "Bám đồ nội thất", + "gaitNormal": "Bình thường/Giường/Xe lăn", + "gaitWeak": "Yếu", + "gaitImpaired": "Suy giảm", + "mentalCorrect": "Đánh giá đúng khả năng", + "mentalOverestimate": "Đánh giá quá/Quên hạn chế", + "nrs2002BMI": "BMI(kg/m²)", + "nrs2002WeightLoss": "Sụt cân", + "nrs2002Intake": "Chế độ ăn", + "nrs2002Illness": "Mức độ nặng", + "intakeNone": "Không", + "intakePoor": "Kém", + "intakeModerate": "Trung bình", + "intakeGood": "Tốt", + "illnessSurgery": "Phẫu thuật lớn/Chấn thương", + "illnessFracture": "Gãy xương chậu", + "illnessAcute": "Bệnh mạn cấp tính", + "illnessMild": "Không/Nhẹ", + "orderExecuting": "Đang thực hiện", + "orderProofread": "Đã đối chiếu", + "all": "Tất cả", + "scanExecute": "Quét mã thực hiện", + "type": "Loại", + "frequency": "Tần suất", + "dosage": "Liều lượng", + "orderDoctor": "Bác sĩ chỉ định", + "execute": "Thực hiện", + "noOrders": "Không có y lệnh", + "scanExecuteTitle": "Quét mã thực hiện", + "barcode": "Mã vạch", + "barcodePlaceholder": "Quét hoặc nhập mã vạch", + "confirmExecute": "Xác nhận thực hiện", + "confirmExecuteOrder": "Xác nhận thực hiện y lệnh", + "executeSuccess": "Thực hiện thành công", + "executeFailed": "Thực hiện thất bại", + "orderMatchFailed": "Không tìm thấy y lệnh phù hợp", + "infusionManagement": "Quản lý truyền dịch", + "startInfusion": "Bắt đầu truyền", + "infusionSpeed": "Tốc độ truyền", + "totalVolume": "Tổng dung tích (ml)", + "patrolNurse": "Y tá tuần", + "executeNurse": "Y tá thực hiện", + "confirmStart": "Xác nhận bắt đầu", + "infusionPatrol": "Tuần truyền dịch", + "dripRateLabel": "Tốc độ giọt (giọt/phút)", + "patencyStatus": "Trạng thái thông", + "adverseReaction": "Phản ứng bất lợi", + "emptyLeaveBlank": "Để trống nếu không có", + "patrolNurseLabel": "Y tá tuần", + "confirmRecord": "Xác nhận ghi nhận", + "infusionStarted": "Đã bắt đầu truyền", + "operationFailed": "Thao tác thất bại", + "patrolRecordSaved": "Đã lưu hồ sơ tuần", + "recordFailed": "Ghi nhận thất bại", + "patrolRecord": "Hồ sơ tuần", + "noInfusionRecords": "Không có hồ sơ truyền dịch", + "startInfusionTitle": "Bắt đầu truyền", + "drugName": "Tên thuốc", + "drugNamePlaceholder": "Nhập tên thuốc", + "infusionSpeedPlaceholder": "vd: 40 giọt/phút", + "occluded": "Tắc", + "phlebitis": "Viêm tĩnh mạch", + "vitalTrend": "Xu hướng dấu hiệu sinh tồn", + "days3": "3 ngày", + "days7": "7 ngày", + "days14": "14 ngày", + "temperatureChart": "Nhiệt độ (°C)", + "pulseChart": "Mạch (lần/phút)", + "bpChart": "Huyết áp (mmHg)", + "respirationChart": "Hô hấp (lần/phút)", + "noData": "Không có dữ liệu" + }, + "quality": { + "title": "Quản lý chỉ số chất lượng điều dưỡng", + "refresh": "Làm mới", + "addIndicator": "Thêm chỉ số", + "collectIndicator": "Thu thập chỉ số", + "exportReport": "Xuất báo cáo", + "totalIndicators": "Tổng chỉ số", + "metCount": "Đạt", + "unmetCount": "Chưa đạt", + "meetRate": "Tỷ lệ đạt", + "deptCount": "Số khoa", + "avgMeetRate": "TB tỷ lệ đạt", + "meetRateTrend": "Xu hướng tỷ lệ đạt", + "deptMeetCompare": "So sánh đạt theo khoa", + "categoryDistribution": "Phân bố loại chỉ số", + "unmetWarning": "Cảnh báo chỉ số chưa đạt", + "indicatorName": "Tên chỉ số", + "department": "Khoa", + "targetValue": "Mục tiêu", + "actualValue": "Thực tế", + "gap": "Chênh lệch", + "indicatorCategory": "Loại chỉ số", + "basicNursing": "ĐD cơ bản", + "specializedNursing": "ĐD chuyên khoa", + "nursingSafety": "An toàn ĐD", + "nursingDocumentation": "Hồ sơ ĐD", + "sterilization": "Khử trùng", + "internalMedicine": "Nội khoa", + "surgery": "Ngoại khoa", + "obstetrics": "Sản phụ khoa", + "pediatrics": "Nhi khoa", + "icu": "ICU", + "emergency": "Cấp cứu", + "query": "Tìm kiếm", + "resetQuery": "Đặt lại", + "indicatorCode": "Mã chỉ số", + "category": "Loại", + "metStatus": "Trạng thái", + "met": "Đạt", + "unmet": "Chưa đạt", + "statDate": "Ngày thống kê", + "remark": "Ghi chú", + "addDialog": "Thêm chỉ số chất lượng điều dưỡng", + "indicatorCodePlaceholder": "vd: NQ001", + "indicatorNamePlaceholder": "Nhập tên chỉ số", + "selectCategory": "Chọn", + "departmentPlaceholder": "Nhập khoa", + "selectDate": "Chọn ngày", + "cancel": "Hủy", + "confirm": "Xác nhận", + "addSuccess": "Thêm thành công", + "exportDev": "Chức năng xuất đang phát triển", + "collectSuccess": "Đã thu thập {count} chỉ số", + "collectFailed": "Thu thập thất bại", + "monthLabels": ["T1", "T2", "T3", "T4", "T5", "T6"] + }, + "execution": { + "title": "Thực hiện y tá nội trú", + "scanTab": "Quét mã thực hiện", + "addScan": "Thêm quét", + "patient": "Bệnh nhân", + "type": "Loại", + "order": "Y lệnh", + "barcode": "Mã vạch", + "result": "Kết quả", + "success": "Thành công", + "failed": "Thất bại", + "nurse": "Y tá", + "time": "Thời gian", + "handoffTab": "Giao ca", + "addHandoff": "Thêm giao ca", + "keyPatientAlert": "Cảnh báo BN trọng điểm", + "pending": "Chờ xử lý", + "ward": "Khu", + "shift": "Ca", + "handoffNurse": "Y tá giao", + "receiveNurse": "Y tá nhận", + "patientCount": "BN", + "criticalCount": "Nguy kịch", + "keyPatients": "BN trọng điểm", + "status": "Trạng thái", + "draft": "Nháp", + "handedOff": "Đã giao", + "confirmed": "Đã xác nhận", + "operation": "Thao tác", + "confirm": "Xác nhận", + "confirmedMsg": "Đã xác nhận", + "infusionTab": "Tuần truyền dịch", + "addPatrol": "Thêm tuần", + "drug": "Thuốc", + "dripRate": "Tốc độ giọt", + "patency": "Thông", + "patrolNurseLabel": "Y tá tuần", + "normal": "Bình thường", + "abnormal": "Bất thường" + }, + "enhanced": { + "title": "Đánh giá điều dưỡng nâng cao", + "reminderTab": "Nhắc nhở đánh giá", + "carePlanTab": "Kế hoạch chăm sóc", + "qualityTab": "Chỉ số chất lượng", + "overdue": "Quá hạn", + "completedAssessment": "Đã hoàn thành", + "patient": "Bệnh nhân", + "assessmentType": "Loại đánh giá", + "frequencyHours": "Tần suất (giờ)", + "nextDeadline": "Hạn tiếp theo", + "status": "Trạng thái", + "pendingAssessment": "Chờ đánh giá", + "assessed": "Đã đánh giá", + "overdueStatus": "Quá hạn", + "completeAssessment": "Hoàn thành", + "addCarePlan": "Thêm kế hoạch", + "nursingDiagnosis": "Chẩn đoán ĐD", + "nursingGoal": "Mục tiêu ĐD", + "nursingIntervention": "Biện pháp ĐD", + "newStatus": "Mới", + "executing": "Đang thực hiện", + "completed": "Hoàn thành", + "stopped": "Dừng", + "evaluate": "Đánh giá", + "totalReminders": "Tổng nhắc nhở", + "totalCompleted": "Hoàn thành", + "totalOverdue": "Quá hạn", + "totalPlans": "Tổng kế hoạch", + "completedPlans": "KH hoàn thành", + "addCarePlanTitle": "Thêm kế hoạch chăm sóc", + "encounterId": "Mã khám bệnh", + "cancel": "Hủy", + "save": "Lưu", + "evaluateTitle": "Đánh giá kế hoạch chăm sóc", + "evaluatePrompt": "Nhập kết quả đánh giá", + "addSuccess": "Thêm thành công", + "assessmentComplete": "Đánh giá hoàn thành", + "evaluateComplete": "Đánh giá hoàn thành", + "fallRisk": "Rủi ro ngã", + "pressureUlcer": "Rủi ro loét", + "nutrition": "Sàng lọc dinh dưỡng", + "pain": "Đánh giá đau", + "pipeline": "Đánh giá ống" + }, + "enhancedAssessment": { + "title": "Đánh giá chuyên khoa điều dưỡng", + "refreshStats": "Làm mới TK", + "exportReport": "Xuất báo cáo", + "totalAssessments": "Tổng", + "highRiskPatients": "Rủi ro cao", + "mediumRiskPatients": "Rủi ro TB", + "intervened": "Đã can thiệp", + "pendingAssessment": "Chờ đánh giá", + "assessmentRate": "Tỷ lệ đánh giá", + "bradenTab": "Loét tì đè (Braden)", + "newBraden": "Tạo đánh giá Braden", + "morseTab": "Đánh giá ngã (Morse)", + "newMorse": "Tạo đánh giá Morse", + "nrs2002Tab": "Sàng lọc dinh dưỡng (NRS2002)", + "newNrs2002": "Tạo đánh giá NRS2002", + "painTab": "Đánh giá đau", + "newPain": "Tạo đánh giá đau", + "tubeTab": "Đánh giá rủi ro ống", + "newTube": "Tạo đánh giá ống", + "interventionTab": "Biện pháp điều dưỡng", + "patient": "Bệnh nhân", + "totalScore": "Tổng điểm", + "risk": "Rủi ro", + "assessor": "Người đánh giá", + "assessmentTime": "Thời gian đánh giá", + "remark": "Ghi chú", + "score": "Điểm", + "painLevel": "Mức độ đau", + "interventionType": "Loại biện pháp", + "interventionContent": "Nội dung biện pháp", + "status": "Trạng thái", + "executor": "Người thực hiện", + "executeTime": "Thời gian thực hiện", + "high": "Cao", + "medium": "TB", + "low": "Thấp", + "highRisk": "Rủi ro cao", + "mediumRisk": "Rủi ro TB", + "lowRisk": "Rủi ro thấp", + "severe": "Nặng", + "moderatePain": "Vừa", + "mildPain": "Nhẹ", + "pendingExec": "Chờ thực hiện", + "patientName": "Tên BN", + "patientNamePlaceholder": "Nhập tên BN", + "encounterId": "Mã khám bệnh", + "encounterIdPlaceholder": "Nhập mã khám bệnh", + "bradenScale": "Thang đánh giá rủi ro loét Braden", + "sensation": "Cảm giác", + "moisture": "Độ ẩm", + "activity": "Hoạt động", + "mobility": "Di chuyển", + "nutrition": "Dinh dưỡng", + "friction": "Ma sát", + "sensationComplete": "Hoàn toàn hạn chế", + "sensationSevere": "Hạn chế nặng", + "sensationMild": "Hạn chế nhẹ", + "sensationIntact": "Không suy giảm", + "moisturePersistent": "Luôn ẩm", + "moistureWet": "Ẩm", + "moistureOccasional": "Thỉnh thoảng ẩm", + "moistureRare": "Hiếm khi ẩm", + "activityBed": "Nằm liệt", + "activityWheelchair": "Ngồi ghế", + "activityOccasionalWalk": "Thỉnh thoảng đi", + "activityFrequentWalk": "Thường đi", + "mobilityNone": "Bất động hoàn toàn", + "mobilitySevere": "Rất hạn chế", + "mobilityMild": "Hạn chế nhẹ", + "mobilityUnlimited": "Không hạn chế", + "nutritionVeryPoor": "Rất kém", + "nutritionProbablyInsufficient": "Có thể không đủ", + "nutritionAdequate": "Đủ", + "nutritionRich": "Giàu", + "frictionProblem": "Có vấn đề", + "frictionPotential": "Tiềm ẩn", + "frictionNone": "Không vấn đề", + "totalScoreLabel": "Tổng điểm", + "morseScale": "Thang đánh giá ngã Morse", + "fallHistory": "Tiền sử ngã", + "diagnosis": "Chẩn đoán", + "ambulation": "Phương tiện", + "ivTherapy": "Truyền tĩnh mạch", + "gait": "Bước đi", + "mentalState": "Tinh thần", + "no": "Không", + "yes": "Có", + "multiDiagnosis": "Có (≥2)", + "noneOrWheelchair": "Không/Giường/Xe lăn", + "crutchOrWalker": "Nạng/Khung", + "furniture": "Đồ nội thất", + "normalOrWheelchair": "Bình thường/Giường/Xe lăn", + "weak": "Yếu", + "impaired": "Suy giảm", + "correctSelfAssessment": "Đánh giá đúng", + "overestimate": "Đánh giá quá/Quên", + "assessmentRemark": "Ghi chú đánh giá", + "remarkPlaceholder": "Nhập ghi chú đánh giá", + "cancel": "Hủy", + "submitAssessment": "Gửi đánh giá", + "submitSuccess": "Gửi đánh giá thành công", + "submitFailed": "Gửi thất bại: {error}", + "exportDev": "Chức năng xuất đang phát triển" + }, + "station": { + "inOut": "Quản lý NV/CT/Chuyển", + "inpatientRecord": "Bệnh án nội trú", + "orderProofread": "Đối chiếu y lệnh", + "orderExecution": "Thực hiện y lệnh", + "nursingRecord": "Hồ sơ điều dưỡng", + "tprSheet": "Phiếu nhiệt độ", + "inpatientBilling": "Viện phí nội trú", + "drugDistribution": "Lĩnh thuốc", + "consumableInventory": "Kiểm kê vật tư", + "rollFee": "Cấu hình phí tự động", + "medicineReturn": "Trả thuốc" + } } } diff --git a/healthlink-his-ui/src/i18n/locales/zhCN.json b/healthlink-his-ui/src/i18n/locales/zhCN.json index d6f60d153..9dd8e460c 100644 --- a/healthlink-his-ui/src/i18n/locales/zhCN.json +++ b/healthlink-his-ui/src/i18n/locales/zhCN.json @@ -1096,5 +1096,477 @@ "statusCompleted": "已完成", "statusCancelled": "已取消", "statusInProgress": "进行中" + }, + "nursing": { + "assessment": { + "encounterId": "就诊号", + "assessmentType": "评估类型", + "assessmentTool": "评估工具", + "score": "评分", + "riskLevel": "风险等级", + "assessor": "评估人", + "assessmentTime": "评估时间", + "search": "搜索", + "painTitle": "疼痛评估NRS/VAS", + "patientId": "患者ID", + "patientName": "患者姓名", + "painScore": "疼痛评分", + "detail": "评估详情", + "assessorName": "评估人", + "submitAssessment": "提交评估", + "reset": "重置", + "assessmentRecords": "评估记录", + "detailPlaceholder": "请输入疼痛部位、性质、持续时间等", + "submitSuccess": "评估提交成功", + "submitFailed": "提交失败", + "getRecordsFailed": "获取记录失败", + "nutritionTitle": "营养风险筛查NRS2002", + "totalScore": "总评分", + "submitScreening": "提交筛查", + "screeningRecords": "筛查记录", + "screeningSubmitSuccess": "筛查提交成功", + "pipeTitle": "管道滑脱风险评估", + "interventionContent": "干预内容", + "nurseName": "护士姓名", + "interventionPlaceholder": "请输入评估内容,如:高风险、中风险、低风险、活动、固定等关键词", + "nursePlaceholder": "请输入护士姓名", + "createTime": "创建时间", + "valEncounterId": "请输入就诊号", + "valPatientId": "请输入患者ID", + "valPatientName": "请输入患者姓名", + "valPainScore": "请输入疼痛评分", + "valAssessor": "请输入评估人", + "valTotalScore": "请输入总评分", + "valInterventionContent": "请输入评估内容", + "valNurseName": "请输入护士姓名", + "valTemperature": "请输入体温", + "valPulse": "请输入脉搏", + "valSystolicBp": "请输入收缩压", + "valDiastolicBp": "请输入舒张压", + "valDrugName": "请输入药品名称", + "valBarcode": "请输入条码" + }, + "mobile": { + "patientList": "患者列表", + "searchPlaceholder": "搜索姓名/床号", + "bedNo": "床号", + "nursingLevel": "护理等级", + "condition": "病情", + "diagnosis": "诊断", + "noPatients": "暂无患者", + "vitalSignEntry": "生命体征录入", + "patient": "患者", + "recordDate": "记录时间", + "selectDate": "选择日期", + "recordHour": "时点", + "temperature": "体温", + "pulse": "脉搏", + "respiration": "呼吸", + "systolicBp": "收缩压", + "diastolicBp": "舒张压", + "painScore": "疼痛评分", + "consciousness": "意识", + "consciousClear": "清醒", + "consciousDrowsy": "嗜睡", + "consciousConfused": "模糊", + "consciousStupor": "昏睡", + "consciousComaShallow": "浅昏迷", + "consciousComaDeep": "深昏迷", + "inputVolume": "入量", + "outputVolume": "出量", + "save": "保存", + "saveSuccess": "保存成功", + "saveFailed": "保存失败", + "unitTimesPerMin": "次/分", + "nursingAssessment": "护理评估", + "bradenPressure": "Braden压疮", + "morseFall": "Morse跌倒", + "nrs2002Nutrition": "NRS2002营养", + "totalScoreLabel": "总分", + "riskLevelLabel": "风险等级", + "assessmentRemark": "评估备注", + "optionalRemark": "可选备注", + "submitAssessmentBtn": "提交评估", + "assessmentRecordsLabel": "评估记录", + "noAssessmentRecords": "暂无评估记录", + "scoreLabel": "评分", + "completeAssessment": "请完成所有评估项目", + "assessmentSubmitSuccess": "评估提交成功", + "assessmentSubmitFailed": "提交失败", + "highRisk": "高风险", + "mediumRisk": "中风险", + "lowRisk": "低风险", + "normal": "正常", + "unknown": "未知", + "bradenSensory": "感觉感知", + "bradenMoisture": "潮湿程度", + "bradenActivity": "活动能力", + "bradenMobility": "移动能力", + "bradenNutrition": "营养摄取", + "bradenFriction": "摩擦力和剪切力", + "sensoryComplete": "完全受限", + "sensorySevere": "严重受限", + "sensoryMild": "轻度受限", + "sensoryNone": "未受损", + "moisturePersistent": "持续潮湿", + "moistureFrequent": "经常潮湿", + "moistureOccasional": "有时潮湿", + "moistureRare": "很少潮湿", + "activityBed": "卧床不起", + "activityChair": "仅限于椅", + "activityOccasionalWalk": "偶尔步行", + "activityFrequentWalk": "经常步行", + "mobilityNone": "完全不动", + "mobilitySevere": "严重受限", + "mobilityMild": "轻度受限", + "mobilityUnlimited": "不受限", + "nutritionVeryPoor": "非常差", + "nutritionProbablyInsufficient": "可能不足", + "nutritionAdequate": "充足", + "nutritionRich": "丰富", + "frictionProblem": "存在问题", + "frictionPotential": "有潜在问题", + "frictionNone": "无明显问题", + "morseFallHistory": "跌倒史", + "morseDiagnosis": "超过一个医学诊断", + "morseAmbulation": "行走辅助", + "morseIV": "静脉输液", + "morseGait": "步态", + "morseMental": "精神状态", + "yes": "有", + "no": "无", + "ambulationBedWheelchair": "卧床/轮椅", + "ambulationCrutch": "拐杖/助行器", + "ambulationFurniture": "扶家具", + "gaitNormal": "正常/卧床/轮椅", + "gaitWeak": "虚弱", + "gaitImpaired": "受损", + "mentalCorrect": "正确评估自身能力", + "mentalOverestimate": "高估或忘记限制", + "nrs2002BMI": "BMI(kg/m²)", + "nrs2002WeightLoss": "体重下降", + "nrs2002Intake": "饮食摄入", + "nrs2002Illness": "疾病严重程度", + "intakeNone": "无", + "intakePoor": "差", + "intakeModerate": "中等", + "intakeGood": "好", + "illnessSurgery": "大手术/创伤", + "illnessFracture": "骨盆骨折", + "illnessAcute": "慢性病急性发作", + "illnessMild": "无/轻度", + "orderExecuting": "执行中", + "orderProofread": "已校对", + "all": "全部", + "scanExecute": "扫码执行", + "type": "类型", + "frequency": "频次", + "dosage": "剂量", + "orderDoctor": "开嘱医生", + "execute": "执行", + "noOrders": "暂无医嘱", + "scanExecuteTitle": "扫码执行", + "barcode": "条码", + "barcodePlaceholder": "请扫描或输入条码", + "confirmExecute": "确认执行", + "confirmExecuteOrder": "确认执行医嘱", + "executeSuccess": "执行成功", + "executeFailed": "执行失败", + "orderMatchFailed": "未找到匹配的医嘱", + "infusionManagement": "输液管理", + "startInfusion": "开始输液", + "infusionSpeed": "输液速度", + "totalVolume": "总量(ml)", + "patrolNurse": "巡视护士", + "executeNurse": "执行护士", + "confirmStart": "确认开始", + "infusionPatrol": "输液巡视", + "dripRateLabel": "滴速(滴/分)", + "patencyStatus": "通畅状态", + "adverseReaction": "不良反应", + "emptyLeaveBlank": "无则留空", + "patrolNurseLabel": "巡视护士", + "confirmRecord": "确认记录", + "infusionStarted": "输液已开始", + "operationFailed": "操作失败", + "patrolRecordSaved": "巡视记录已保存", + "recordFailed": "记录失败", + "patrolRecord": "巡视记录", + "noInfusionRecords": "暂无输液记录", + "startInfusionTitle": "开始输液", + "drugName": "药品名称", + "drugNamePlaceholder": "请输入药品名称", + "infusionSpeedPlaceholder": "如: 40滴/分", + "occluded": "堵塞", + "phlebitis": "静脉炎", + "vitalTrend": "体征趋势", + "days3": "3天", + "days7": "7天", + "days14": "14天", + "temperatureChart": "体温 (°C)", + "pulseChart": "脉搏 (次/分)", + "bpChart": "血压 (mmHg)", + "respirationChart": "呼吸 (次/分)", + "noData": "暂无数据" + }, + "quality": { + "title": "护理质量指标管理", + "refresh": "刷新", + "addIndicator": "新增指标", + "collectIndicator": "采集指标", + "exportReport": "导出报告", + "totalIndicators": "总指标", + "metCount": "达标数", + "unmetCount": "未达标数", + "meetRate": "达标率", + "deptCount": "科室数", + "avgMeetRate": "平均达标率", + "meetRateTrend": "达标率趋势", + "deptMeetCompare": "科室达标对比", + "categoryDistribution": "指标类别分布", + "unmetWarning": "未达标指标预警", + "indicatorName": "指标名称", + "department": "科室", + "targetValue": "目标值", + "actualValue": "实际值", + "gap": "差距", + "indicatorCategory": "指标类别", + "basicNursing": "基础护理", + "specializedNursing": "专科护理", + "nursingSafety": "护理安全", + "nursingDocumentation": "护理文书", + "sterilization": "消毒隔离", + "internalMedicine": "内科", + "surgery": "外科", + "obstetrics": "妇产科", + "pediatrics": "儿科", + "icu": "ICU", + "emergency": "急诊科", + "query": "查询", + "resetQuery": "重置", + "indicatorCode": "指标编码", + "category": "类别", + "metStatus": "达标状态", + "met": "达标", + "unmet": "未达标", + "statDate": "统计日期", + "remark": "备注", + "addDialog": "新增护理质量指标", + "indicatorCodePlaceholder": "如: NQ001", + "indicatorNamePlaceholder": "请输入指标名称", + "selectCategory": "请选择", + "departmentPlaceholder": "请输入科室", + "selectDate": "选择日期", + "cancel": "取消", + "confirm": "确定", + "addSuccess": "新增成功", + "exportDev": "导出功能开发中", + "collectSuccess": "已采集 {count} 项指标", + "collectFailed": "采集失败", + "monthLabels": ["1月", "2月", "3月", "4月", "5月", "6月"] + }, + "execution": { + "title": "住院护士执行", + "scanTab": "执行扫码", + "addScan": "新增扫码", + "patient": "患者", + "type": "类型", + "order": "医嘱", + "barcode": "条码", + "result": "结果", + "success": "成功", + "failed": "失败", + "nurse": "护士", + "time": "时间", + "handoffTab": "交接班", + "addHandoff": "新增交接", + "keyPatientAlert": "重点患者提示", + "pending": "待办", + "ward": "病区", + "shift": "班次", + "handoffNurse": "交班人", + "receiveNurse": "接班人", + "patientCount": "患者", + "criticalCount": "危重", + "keyPatients": "重点患者", + "status": "状态", + "draft": "草稿", + "handedOff": "已交接", + "confirmed": "已确认", + "operation": "操作", + "confirm": "确认", + "confirmedMsg": "已确认", + "infusionTab": "输液巡视", + "addPatrol": "新增巡视", + "drug": "药品", + "dripRate": "滴速", + "patency": "通畅", + "patrolNurseLabel": "巡视护士", + "normal": "正常", + "abnormal": "异常" + }, + "enhanced": { + "title": "护理评估增强", + "reminderTab": "评估提醒", + "carePlanTab": "护理计划", + "qualityTab": "质量指标", + "overdue": "逾期未评估", + "completedAssessment": "已完成评估", + "patient": "患者", + "assessmentType": "评估类型", + "frequencyHours": "频率(小时)", + "nextDeadline": "下次截止", + "status": "状态", + "pendingAssessment": "待评估", + "assessed": "已评估", + "overdueStatus": "已超时", + "completeAssessment": "完成评估", + "addCarePlan": "新增护理计划", + "nursingDiagnosis": "护理诊断", + "nursingGoal": "护理目标", + "nursingIntervention": "护理措施", + "newStatus": "新建", + "executing": "执行中", + "completed": "已完成", + "stopped": "已停止", + "evaluate": "评价", + "totalReminders": "总评估提醒", + "totalCompleted": "已完成", + "totalOverdue": "已超时", + "totalPlans": "总护理计划", + "completedPlans": "已完成计划", + "addCarePlanTitle": "新增护理计划", + "encounterId": "就诊ID", + "cancel": "取消", + "save": "保存", + "evaluateTitle": "评价护理计划", + "evaluatePrompt": "请输入评价结果", + "addSuccess": "新增成功", + "assessmentComplete": "评估完成", + "evaluateComplete": "评价完成", + "fallRisk": "跌倒风险", + "pressureUlcer": "压疮风险", + "nutrition": "营养筛查", + "pain": "疼痛评估", + "pipeline": "管道评估" + }, + "enhancedAssessment": { + "title": "护理专项评估", + "refreshStats": "刷新统计", + "exportReport": "导出评估报告", + "totalAssessments": "总评估", + "highRiskPatients": "高危患者", + "mediumRiskPatients": "中危患者", + "intervened": "已干预", + "pendingAssessment": "待评估", + "assessmentRate": "评估率", + "bradenTab": "压疮评估(Braden)", + "newBraden": "新建Braden评估", + "morseTab": "跌倒评估(Morse)", + "newMorse": "新建Morse评估", + "nrs2002Tab": "营养筛查(NRS2002)", + "newNrs2002": "新建NRS2002评估", + "painTab": "疼痛评估", + "newPain": "新建疼痛评估", + "tubeTab": "管道风险评估", + "newTube": "新建管道评估", + "interventionTab": "护理措施", + "patient": "患者", + "totalScore": "总分", + "risk": "风险", + "assessor": "评估人", + "assessmentTime": "评估时间", + "remark": "备注", + "score": "评分", + "painLevel": "疼痛程度", + "interventionType": "措施类型", + "interventionContent": "措施内容", + "status": "状态", + "executor": "执行人", + "executeTime": "执行时间", + "high": "高危", + "medium": "中危", + "low": "低危", + "highRisk": "高风险", + "mediumRisk": "中风险", + "lowRisk": "低风险", + "severe": "重度", + "moderatePain": "中度", + "mildPain": "轻度", + "pendingExec": "待执行", + "patientName": "患者姓名", + "patientNamePlaceholder": "请输入患者姓名", + "encounterId": "就诊号", + "encounterIdPlaceholder": "请输入就诊号", + "bradenScale": "Braden压疮风险评估量表", + "sensation": "感觉", + "moisture": "潮湿", + "activity": "活动", + "mobility": "移动", + "nutrition": "营养", + "friction": "摩擦力", + "sensationComplete": "完全受限", + "sensationSevere": "严重受限", + "sensationMild": "轻度受限", + "sensationIntact": "未受损", + "moisturePersistent": "持续潮湿", + "moistureWet": "潮湿", + "moistureOccasional": "偶尔潮湿", + "moistureRare": "很少潮湿", + "activityBed": "卧床不起", + "activityWheelchair": "限于轮椅", + "activityOccasionalWalk": "偶尔步行", + "activityFrequentWalk": "经常步行", + "mobilityNone": "完全不能", + "mobilitySevere": "严重受限", + "mobilityMild": "轻度受限", + "mobilityUnlimited": "不受限", + "nutritionVeryPoor": "非常差", + "nutritionProbablyInsufficient": "可能不足", + "nutritionAdequate": "充足", + "nutritionRich": "丰富", + "frictionProblem": "存在问题", + "frictionPotential": "有潜在问题", + "frictionNone": "无明显问题", + "totalScoreLabel": "总分", + "morseScale": "Morse跌倒风险评估量表", + "fallHistory": "跌倒史", + "diagnosis": "诊断", + "ambulation": "行走辅助", + "ivTherapy": "静脉输液", + "gait": "步态", + "mentalState": "精神状态", + "no": "无", + "yes": "有", + "multiDiagnosis": "有(≥2个)", + "noneOrWheelchair": "无/卧床/轮椅", + "crutchOrWalker": "拐杖/助行器", + "furniture": "扶家具", + "normalOrWheelchair": "正常/卧床/轮椅", + "weak": "虚弱", + "impaired": "障碍", + "correctSelfAssessment": "正确评估自身能力", + "overestimate": "高估/忘记限制", + "assessmentRemark": "评估备注", + "remarkPlaceholder": "请输入评估备注", + "cancel": "取消", + "submitAssessment": "提交评估", + "submitSuccess": "评估提交成功", + "submitFailed": "提交失败: {error}", + "exportDev": "导出功能开发中" + }, + "station": { + "inOut": "入出转管理", + "inpatientRecord": "住院病历", + "orderProofread": "医嘱校对", + "orderExecution": "医嘱执行", + "nursingRecord": "护理记录", + "tprSheet": "体温单", + "inpatientBilling": "住院记账", + "drugDistribution": "汇总领药", + "consumableInventory": "科室耗材盘点", + "rollFee": "滚费配置", + "medicineReturn": "退药管理" + } } } diff --git a/healthlink-his-ui/src/views/charge/outpatientregistration/components/reprintDialog.vue b/healthlink-his-ui/src/views/charge/outpatientregistration/components/reprintDialog.vue index ccd4db2f9..3a0dae61d 100755 --- a/healthlink-his-ui/src/views/charge/outpatientregistration/components/reprintDialog.vue +++ b/healthlink-his-ui/src/views/charge/outpatientregistration/components/reprintDialog.vue @@ -599,7 +599,7 @@ async function handleSubmit() { } } catch (error) { console.error('补打挂号失败:', error); - proxy.$modal.msgError('补打挂号失败: ' + (error.message || '未知错误')); + proxy.$modal.msgError(t('billing.reprintFailMsg', { error: error.message || t('billing.reprintFail') })); loading.value = false; } } @@ -715,14 +715,14 @@ function printByHiprint() { // 打印成功回调 hiprintTemplate.on('printSuccess', function (e) { console.log('补打挂号单打印成功', e); - proxy.$modal.msgSuccess('打印成功'); + proxy.$modal.msgSuccess(t('billing.printSuccess')); dialogVisible.value = false; }); // 打印失败回调 hiprintTemplate.on('printError', function (e) { console.error('补打挂号单打印失败', e); - proxy.$modal.msgError('打印失败:' + (e.message || '未知错误')); + proxy.$modal.msgError(t('billing.printFailMsg', { error: e.message || t('billing.printFail') })); }); // 执行打印 @@ -731,7 +731,7 @@ function printByHiprint() { }); } catch (error) { console.error('hiprint 打印挂号单失败:', error); - proxy.$modal.msgError('打印失败:' + (error.message || '未知错误')); + proxy.$modal.msgError(t('billing.printFailMsg', { error: error.message || t('billing.printFail') })); } } @@ -743,7 +743,7 @@ function handleRecordSelect(row) { // 确认选择记录 async function handleConfirmSelect() { if (!selectedRecord.value) { - proxy.$modal.msgWarning('请选择一条挂号记录'); + proxy.$modal.msgWarning(t('billing.selectRegRecord')); return; } @@ -762,7 +762,7 @@ async function handleConfirmSelect() { // 验证表单数据是否已正确填充 if (!form.encounterId) { - proxy.$modal.msgError('获取挂号记录ID失败,请重试'); + proxy.$modal.msgError(t('billing.getRegIdFail')); loading.value = false; return; } @@ -771,7 +771,7 @@ async function handleConfirmSelect() { await handleSubmit(); } catch (error) { console.error('确认选择记录失败:', error); - proxy.$modal.msgError('处理失败:' + (error.message || '未知错误')); + proxy.$modal.msgError(t('billing.processFail', { error: error.message || t('billing.reprintFail') })); loading.value = false; } } diff --git a/healthlink-his-ui/src/views/inpatientNurse/inpatientNurseStation/index.vue b/healthlink-his-ui/src/views/inpatientNurse/inpatientNurseStation/index.vue index 4dedfe7af..ebb384c5a 100755 --- a/healthlink-his-ui/src/views/inpatientNurse/inpatientNurseStation/index.vue +++ b/healthlink-his-ui/src/views/inpatientNurse/inpatientNurseStation/index.vue @@ -1,109 +1,48 @@ diff --git a/healthlink-his-ui/src/views/nursingenhanced/index.vue b/healthlink-his-ui/src/views/nursingenhanced/index.vue index be629fa7f..98ce9c801 100644 --- a/healthlink-his-ui/src/views/nursingenhanced/index.vue +++ b/healthlink-his-ui/src/views/nursingenhanced/index.vue @@ -1,278 +1,181 @@ diff --git a/healthlink-his-ui/src/views/nursingexecution/index.vue b/healthlink-his-ui/src/views/nursingexecution/index.vue index 991bd75ed..0de6d13b4 100644 --- a/healthlink-his-ui/src/views/nursingexecution/index.vue +++ b/healthlink-his-ui/src/views/nursingexecution/index.vue @@ -1,267 +1,106 @@ diff --git a/healthlink-his-ui/src/views/nursingmobile/InfusionManagement.vue b/healthlink-his-ui/src/views/nursingmobile/InfusionManagement.vue index 7b9bbfe78..aa890fdc6 100644 --- a/healthlink-his-ui/src/views/nursingmobile/InfusionManagement.vue +++ b/healthlink-his-ui/src/views/nursingmobile/InfusionManagement.vue @@ -3,101 +3,95 @@
-
+
- {{ item.drugName || '输液' }} - - {{ getStatusText(item.patencyStatus) }} - + {{ item.drugName || $t('nursing.mobile.infusionManagement') }} + {{ getStatusText(item.patencyStatus) }}
- 输液速度: + {{ $t('nursing.mobile.infusionSpeed') }}: {{ item.infusionRate || '-' }}
- 总量: + {{ $t('nursing.mobile.totalVolume') }}: {{ item.totalVolume ? item.totalVolume + 'ml' : '-' }}
- 开始时间: + {{ $t('nursing.mobile.startInfusion') }}: {{ formatTime(item.startTime) }}
- 最近巡视: + {{ $t('nursing.mobile.patrolRecord') }}: {{ formatTime(item.patrolTime) }}
- 滴速: - {{ item.dripRate }} 滴/分 + {{ $t('nursing.mobile.dripRateLabel') }}: + {{ item.dripRate }} {{ $t('nursing.mobile.unitTimesPerMin') }}
- 不良反应: + {{ $t('nursing.mobile.adverseReaction') }}: {{ item.adverseReaction }}
- +
- + - - + + - - + + - + - - + + - + - + - + - - - + + + - - + + - - + +
@@ -107,8 +101,10 @@ import { ref, reactive, onMounted } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ElMessage } from 'element-plus' +import { useI18n } from 'vue-i18n' import { getInfusionStatus, startInfusion, addInfusionPatrol } from './api' +const { t } = useI18n() const route = useRoute() const router = useRouter() const loading = ref(false) @@ -123,56 +119,26 @@ const startDialogVisible = ref(false) const patrolDialogVisible = ref(false) const currentInfusion = ref(null) -const startForm = reactive({ - drugName: '', - infusionRate: '', - totalVolume: 250, - patrolNurseName: '' -}) +const startForm = reactive({ drugName: '', infusionRate: '', totalVolume: 250, patrolNurseName: '' }) +const patrolForm = reactive({ dripRate: null, patencyStatus: 'NORMAL', adverseReaction: '', patrolNurseName: '' }) -const patrolForm = reactive({ - dripRate: null, - patencyStatus: 'NORMAL', - adverseReaction: '', - patrolNurseName: '' -}) - -const goBack = () => { - router.push('/nursingmobile/patient-list') -} - -const formatTime = (time) => { - if (!time) return '-' - const d = new Date(time) - return d.toLocaleString('zh-CN') -} - -const getStatusType = (status) => { - const map = { NORMAL: 'success', OCCLUDED: 'danger', PHLEBITIS: 'warning' } - return map[status] || 'info' -} - -const getStatusText = (status) => { - const map = { NORMAL: '正常', OCCLUDED: '堵塞', PHLEBITIS: '静脉炎' } - return map[status] || '未知' -} +const goBack = () => { router.push('/nursingmobile/patient-list') } +const formatTime = (time) => { if (!time) return '-'; const d = new Date(time); return d.toLocaleString() } +const getStatusType = (status) => ({ NORMAL: 'success', OCCLUDED: 'danger', PHLEBITIS: 'warning' })[status] || 'info' +const getStatusText = (status) => ({ + NORMAL: t('nursing.execution.normal'), + OCCLUDED: t('nursing.mobile.occluded'), + PHLEBITIS: t('nursing.mobile.phlebitis') +})[status] || t('nursing.mobile.unknown') const fetchInfusionList = async () => { if (!patientId.value) return loading.value = true - try { - const res = await getInfusionStatus(patientId.value) - infusionList.value = res.data || [] - } finally { - loading.value = false - } + try { const res = await getInfusionStatus(patientId.value); infusionList.value = res.data || [] } finally { loading.value = false } } const showStartDialog = () => { - startForm.drugName = '' - startForm.infusionRate = '' - startForm.totalVolume = 250 - startForm.patrolNurseName = '' + startForm.drugName = ''; startForm.infusionRate = ''; startForm.totalVolume = 250; startForm.patrolNurseName = '' startDialogVisible.value = true } @@ -186,30 +152,20 @@ const showPatrolDialog = (item) => { } const handleStartInfusion = async () => { - if (!startForm.drugName) { - ElMessage.warning('请输入药品名称') - return - } + if (!startForm.drugName) { ElMessage.warning(t('nursing.assessment.valDrugName')); return } submitting.value = true try { await startInfusion({ patientId: patientId.value ? Number(patientId.value) : null, encounterId: encounterId.value ? Number(encounterId.value) : null, patientName: patientName.value, - drugName: startForm.drugName, - infusionRate: startForm.infusionRate, - totalVolume: startForm.totalVolume, - patrolNurseName: startForm.patrolNurseName, - startTime: new Date() + drugName: startForm.drugName, infusionRate: startForm.infusionRate, + totalVolume: startForm.totalVolume, patrolNurseName: startForm.patrolNurseName, startTime: new Date() }) - ElMessage.success('输液已开始') + ElMessage.success(t('nursing.mobile.infusionStarted')) startDialogVisible.value = false fetchInfusionList() - } catch (e) { - ElMessage.error('操作失败') - } finally { - submitting.value = false - } + } catch (e) { ElMessage.error(t('nursing.mobile.operationFailed')) } finally { submitting.value = false } } const handlePatrol = async () => { @@ -221,100 +177,30 @@ const handlePatrol = async () => { patientName: patientName.value, orderId: currentInfusion.value.orderId || currentInfusion.value.id, drugName: currentInfusion.value.drugName, - dripRate: patrolForm.dripRate, - patencyStatus: patrolForm.patencyStatus, - adverseReaction: patrolForm.adverseReaction, - patrolNurseName: patrolForm.patrolNurseName, - patrolTime: new Date() + dripRate: patrolForm.dripRate, patencyStatus: patrolForm.patencyStatus, + adverseReaction: patrolForm.adverseReaction, patrolNurseName: patrolForm.patrolNurseName, patrolTime: new Date() }) - ElMessage.success('巡视记录已保存') + ElMessage.success(t('nursing.mobile.patrolRecordSaved')) patrolDialogVisible.value = false fetchInfusionList() - } catch (e) { - ElMessage.error('记录失败') - } finally { - submitting.value = false - } + } catch (e) { ElMessage.error(t('nursing.mobile.recordFailed')) } finally { submitting.value = false } } -onMounted(() => { - fetchInfusionList() -}) +onMounted(() => { fetchInfusionList() }) diff --git a/healthlink-his-ui/src/views/nursingmobile/NursingAssessment.vue b/healthlink-his-ui/src/views/nursingmobile/NursingAssessment.vue index 9b94a1e51..b02ccf21c 100644 --- a/healthlink-his-ui/src/views/nursingmobile/NursingAssessment.vue +++ b/healthlink-his-ui/src/views/nursingmobile/NursingAssessment.vue @@ -3,16 +3,16 @@
- Braden压疮 - Morse跌倒 - NRS2002营养 + {{ $t('nursing.mobile.bradenPressure') }} + {{ $t('nursing.mobile.morseFall') }} + {{ $t('nursing.mobile.nrs2002Nutrition') }}
@@ -26,12 +26,8 @@
{{ item.label }}
- - {{ opt.label }} ({{ opt.value }}分) + + {{ opt.label }} ({{ opt.value }}{{ $t('nursing.mobile.scoreLabel') }})
@@ -40,42 +36,40 @@
- 总分: {{ totalScore }} + {{ $t('nursing.mobile.totalScoreLabel') }}: {{ totalScore }}
- 风险等级: + {{ $t('nursing.mobile.riskLevelLabel') }}: {{ getRiskText(currentRiskLevel) }}
- - + + - 提交评估 + {{ $t('nursing.mobile.submitAssessmentBtn') }}
{{ getToolName(record.assessmentTool) }} - - {{ getRiskText(record.riskLevel) }} - + {{ getRiskText(record.riskLevel) }}
- 评分: {{ record.totalScore }} + {{ $t('nursing.mobile.scoreLabel') }}: {{ record.totalScore }} {{ formatTime(record.assessmentTime) }}
- +
@@ -84,8 +78,10 @@ import { ref, reactive, computed, onMounted } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ElMessage } from 'element-plus' +import { useI18n } from 'vue-i18n' import { submitAssessment, getAssessmentList } from './api' +const { t } = useI18n() const route = useRoute() const router = useRouter() const submitting = ref(false) @@ -99,297 +95,158 @@ const selectedTool = ref('BRADEN') const detail = ref('') const historyList = ref([]) -const bradenItems = [ - { key: 'sensory', label: '感觉感知', options: [ - { label: '完全受限', value: 1 }, { label: '严重受限', value: 2 }, - { label: '轻度受限', value: 3 }, { label: '未受损', value: 4 } +const bradenItems = computed(() => [ + { key: 'sensory', label: t('nursing.mobile.bradenSensory'), options: [ + { label: t('nursing.mobile.sensoryComplete'), value: 1 }, { label: t('nursing.mobile.sensorySevere'), value: 2 }, + { label: t('nursing.mobile.sensoryMild'), value: 3 }, { label: t('nursing.mobile.sensoryNone'), value: 4 } ]}, - { key: 'moisture', label: '潮湿程度', options: [ - { label: '持续潮湿', value: 1 }, { label: '经常潮湿', value: 2 }, - { label: '有时潮湿', value: 3 }, { label: '很少潮湿', value: 4 } + { key: 'moisture', label: t('nursing.mobile.bradenMoisture'), options: [ + { label: t('nursing.mobile.moisturePersistent'), value: 1 }, { label: t('nursing.mobile.moistureFrequent'), value: 2 }, + { label: t('nursing.mobile.moistureOccasional'), value: 3 }, { label: t('nursing.mobile.moistureRare'), value: 4 } ]}, - { key: 'activity', label: '活动能力', options: [ - { label: '卧床不起', value: 1 }, { label: '仅限于椅', value: 2 }, - { label: '偶尔步行', value: 3 }, { label: '经常步行', value: 4 } + { key: 'activity', label: t('nursing.mobile.bradenActivity'), options: [ + { label: t('nursing.mobile.activityBed'), value: 1 }, { label: t('nursing.mobile.activityChair'), value: 2 }, + { label: t('nursing.mobile.activityOccasionalWalk'), value: 3 }, { label: t('nursing.mobile.activityFrequentWalk'), value: 4 } ]}, - { key: 'mobility', label: '移动能力', options: [ - { label: '完全不动', value: 1 }, { label: '严重受限', value: 2 }, - { label: '轻度受限', value: 3 }, { label: '不受限', value: 4 } + { key: 'mobility', label: t('nursing.mobile.bradenMobility'), options: [ + { label: t('nursing.mobile.mobilityNone'), value: 1 }, { label: t('nursing.mobile.mobilitySevere'), value: 2 }, + { label: t('nursing.mobile.mobilityMild'), value: 3 }, { label: t('nursing.mobile.mobilityUnlimited'), value: 4 } ]}, - { key: 'nutrition', label: '营养摄取', options: [ - { label: '非常差', value: 1 }, { label: '可能不足', value: 2 }, - { label: '充足', value: 3 }, { label: '丰富', value: 4 } + { key: 'nutrition', label: t('nursing.mobile.bradenNutrition'), options: [ + { label: t('nursing.mobile.nutritionVeryPoor'), value: 1 }, { label: t('nursing.mobile.nutritionProbablyInsufficient'), value: 2 }, + { label: t('nursing.mobile.nutritionAdequate'), value: 3 }, { label: t('nursing.mobile.nutritionRich'), value: 4 } ]}, - { key: 'friction', label: '摩擦力和剪切力', options: [ - { label: '存在问题', value: 1 }, { label: '有潜在问题', value: 2 }, - { label: '无明显问题', value: 3 } + { key: 'friction', label: t('nursing.mobile.bradenFriction'), options: [ + { label: t('nursing.mobile.frictionProblem'), value: 1 }, { label: t('nursing.mobile.frictionPotential'), value: 2 }, + { label: t('nursing.mobile.frictionNone'), value: 3 } ]} -] +]) -const morseItems = [ - { key: 'fallHistory', label: '跌倒史', options: [ - { label: '无', value: 0 }, { label: '有', value: 25 } +const morseItems = computed(() => [ + { key: 'fallHistory', label: t('nursing.mobile.morseFallHistory'), options: [ + { label: t('nursing.mobile.no'), value: 0 }, { label: t('nursing.mobile.yes'), value: 25 } ]}, - { key: 'diagnosis', label: '超过一个医学诊断', options: [ - { label: '无', value: 0 }, { label: '有', value: 15 } + { key: 'diagnosis', label: t('nursing.mobile.morseDiagnosis'), options: [ + { label: t('nursing.mobile.no'), value: 0 }, { label: t('nursing.mobile.yes'), value: 15 } ]}, - { key: 'ambulation', label: '行走辅助', options: [ - { label: '卧床/轮椅', value: 0 }, { label: '拐杖/助行器', value: 15 }, - { label: '扶家具', value: 30 } + { key: 'ambulation', label: t('nursing.mobile.morseAmbulation'), options: [ + { label: t('nursing.mobile.ambulationBedWheelchair'), value: 0 }, { label: t('nursing.mobile.ambulationCrutch'), value: 15 }, + { label: t('nursing.mobile.ambulationFurniture'), value: 30 } ]}, - { key: 'ivTherapy', label: '静脉输液', options: [ - { label: '无', value: 0 }, { label: '有', value: 20 } + { key: 'ivTherapy', label: t('nursing.mobile.morseIV'), options: [ + { label: t('nursing.mobile.no'), value: 0 }, { label: t('nursing.mobile.yes'), value: 20 } ]}, - { key: 'gait', label: '步态', options: [ - { label: '正常/卧床/轮椅', value: 0 }, { label: '虚弱', value: 10 }, - { label: '受损', value: 20 } + { key: 'gait', label: t('nursing.mobile.morseGait'), options: [ + { label: t('nursing.mobile.gaitNormal'), value: 0 }, { label: t('nursing.mobile.gaitWeak'), value: 10 }, + { label: t('nursing.mobile.gaitImpaired'), value: 20 } ]}, - { key: 'mental', label: '精神状态', options: [ - { label: '正确评估自身能力', value: 0 }, { label: '高估或忘记限制', value: 15 } + { key: 'mental', label: t('nursing.mobile.morseMental'), options: [ + { label: t('nursing.mobile.mentalCorrect'), value: 0 }, { label: t('nursing.mobile.mentalOverestimate'), value: 15 } ]} -] +]) -const nrs2002Items = [ - { key: 'bmi', label: 'BMI(kg/m²)', options: [ - { label: '<18.5', value: 3 }, { label: '18.5-20.5', value: 1 }, - { label: '>20.5', value: 0 } +const nrs2002Items = computed(() => [ + { key: 'bmi', label: t('nursing.mobile.nrs2002BMI'), options: [ + { label: '<18.5', value: 3 }, { label: '18.5-20.5', value: 1 }, { label: '>20.5', value: 0 } ]}, - { key: 'weightLoss', label: '体重下降', options: [ - { label: '>10%/月', value: 3 }, { label: '5-10%/月', value: 2 }, - { label: '2-5%/月', value: 1 }, { label: '无/1月', value: 0 } + { key: 'weightLoss', label: t('nursing.mobile.nrs2002WeightLoss'), options: [ + { label: '>10%/月', value: 3 }, { label: '5-10%/月', value: 2 }, { label: '2-5%/月', value: 1 }, { label: t('nursing.mobile.no') + '/1月', value: 0 } ]}, - { key: 'intake', label: '饮食摄入', options: [ - { label: '无', value: 3 }, { label: '差', value: 2 }, - { label: '中等', value: 1 }, { label: '好', value: 0 } + { key: 'intake', label: t('nursing.mobile.nrs2002Intake'), options: [ + { label: t('nursing.mobile.intakeNone'), value: 3 }, { label: t('nursing.mobile.intakePoor'), value: 2 }, + { label: t('nursing.mobile.intakeModerate'), value: 1 }, { label: t('nursing.mobile.intakeGood'), value: 0 } ]}, - { key: 'illness', label: '疾病严重程度', options: [ - { label: '大手术/创伤', value: 3 }, { label: '骨盆骨折', value: 2 }, - { label: '慢性病急性发作', value: 1 }, { label: '无/轻度', value: 0 } + { key: 'illness', label: t('nursing.mobile.nrs2002Illness'), options: [ + { label: t('nursing.mobile.illnessSurgery'), value: 3 }, { label: t('nursing.mobile.illnessFracture'), value: 2 }, + { label: t('nursing.mobile.illnessAcute'), value: 1 }, { label: t('nursing.mobile.illnessMild'), value: 0 } ]} -] +]) -const toolConfigs = { - BRADEN: { title: 'Braden压疮风险评估', items: bradenItems }, - MORSE: { title: 'Morse跌倒风险评估', items: morseItems }, - NRS2002: { title: 'NRS2002营养风险筛查', items: nrs2002Items } -} +const toolConfigs = computed(() => ({ + BRADEN: { title: 'Braden ' + t('nursing.mobile.bradenPressure'), items: bradenItems.value }, + MORSE: { title: 'Morse ' + t('nursing.mobile.morseFall'), items: morseItems.value }, + NRS2002: { title: 'NRS2002 ' + t('nursing.mobile.nrs2002Nutrition'), items: nrs2002Items.value } +})) const itemScores = reactive({}) - -const toolConfig = computed(() => toolConfigs[selectedTool.value]) +const toolConfig = computed(() => toolConfigs.value[selectedTool.value]) const totalScore = computed(() => { let sum = 0 - for (const item of toolConfig.value.items) { - sum += itemScores[item.key] || 0 - } + for (const item of toolConfig.value.items) { sum += itemScores[item.key] || 0 } return sum }) const currentRiskLevel = computed(() => { - const tool = selectedTool.value - const score = totalScore.value - if (tool === 'BRADEN') { - if (score <= 12) return 'HIGH' - if (score <= 14) return 'MEDIUM' - return 'LOW' - } else if (tool === 'MORSE') { - if (score >= 45) return 'HIGH' - if (score >= 25) return 'MEDIUM' - return 'LOW' - } else if (tool === 'NRS2002') { - if (score >= 3) return 'HIGH' - return 'LOW' - } + const tool = selectedTool.value; const score = totalScore.value + if (tool === 'BRADEN') { if (score <= 12) return 'HIGH'; if (score <= 14) return 'MEDIUM'; return 'LOW' } + else if (tool === 'MORSE') { if (score >= 45) return 'HIGH'; if (score >= 25) return 'MEDIUM'; return 'LOW' } + else if (tool === 'NRS2002') { if (score >= 3) return 'HIGH'; return 'LOW' } return 'NORMAL' }) -const onToolChange = () => { - for (const key of Object.keys(itemScores)) { - delete itemScores[key] - } -} +const onToolChange = () => { for (const key of Object.keys(itemScores)) { delete itemScores[key] } } -const getRiskType = (level) => { - const map = { HIGH: 'danger', MEDIUM: 'warning', LOW: 'success', NORMAL: 'info' } - return map[level] || 'info' -} +const getRiskType = (level) => ({ HIGH: 'danger', MEDIUM: 'warning', LOW: 'success', NORMAL: 'info' })[level] || 'info' +const getRiskText = (level) => ({ + HIGH: t('nursing.mobile.highRisk'), MEDIUM: t('nursing.mobile.mediumRisk'), + LOW: t('nursing.mobile.lowRisk'), NORMAL: t('nursing.mobile.normal') +})[level] || t('nursing.mobile.unknown') -const getRiskText = (level) => { - const map = { HIGH: '高风险', MEDIUM: '中风险', LOW: '低风险', NORMAL: '正常' } - return map[level] || '未知' -} +const getToolName = (tool) => ({ + BRADEN: t('nursing.mobile.bradenPressure'), MORSE: t('nursing.mobile.morseFall'), NRS2002: t('nursing.mobile.nrs2002Nutrition') +})[tool] || tool -const getToolName = (tool) => { - const map = { BRADEN: 'Braden压疮', MORSE: 'Morse跌倒', NRS2002: 'NRS2002营养' } - return map[tool] || tool -} - -const formatTime = (time) => { - if (!time) return '-' - const d = new Date(time) - return d.toLocaleString('zh-CN') -} - -const goBack = () => { - router.push('/nursingmobile/patient-list') -} +const formatTime = (time) => { if (!time) return '-'; const d = new Date(time); return d.toLocaleString() } +const goBack = () => { router.push('/nursingmobile/patient-list') } const fetchHistory = async () => { if (!patientId.value) return historyLoading.value = true - try { - const res = await getAssessmentList(patientId.value) - historyList.value = (res.data || []).slice(0, 20) - } finally { - historyLoading.value = false - } + try { const res = await getAssessmentList(patientId.value); historyList.value = (res.data || []).slice(0, 20) } finally { historyLoading.value = false } } const handleSubmit = async () => { const filled = toolConfig.value.items.filter(i => itemScores[i.key] != null) - if (filled.length < toolConfig.value.items.length) { - ElMessage.warning('请完成所有评估项目') - return - } + if (filled.length < toolConfig.value.items.length) { ElMessage.warning(t('nursing.mobile.completeAssessment')); return } submitting.value = true try { await submitAssessment({ patientId: patientId.value ? Number(patientId.value) : null, encounterId: encounterId.value ? Number(encounterId.value) : null, - patientName: patientName.value, - assessmentType: 'MOBILE', - assessmentTool: selectedTool.value, - totalScore: totalScore.value, - itemScores: { ...itemScores }, - detail: detail.value, - assessmentTime: new Date() + patientName: patientName.value, assessmentType: 'MOBILE', + assessmentTool: selectedTool.value, totalScore: totalScore.value, + itemScores: { ...itemScores }, detail: detail.value, assessmentTime: new Date() }) - ElMessage.success('评估提交成功') + ElMessage.success(t('nursing.mobile.assessmentSubmitSuccess')) detail.value = '' fetchHistory() - } catch (e) { - ElMessage.error('提交失败') - } finally { - submitting.value = false - } + } catch (e) { ElMessage.error(t('nursing.mobile.assessmentSubmitFailed')) } finally { submitting.value = false } } -onMounted(() => { - fetchHistory() -}) +onMounted(() => { fetchHistory() }) diff --git a/healthlink-his-ui/src/views/nursingmobile/OrderList.vue b/healthlink-his-ui/src/views/nursingmobile/OrderList.vue index 39fe50cca..a8ef599b6 100644 --- a/healthlink-his-ui/src/views/nursingmobile/OrderList.vue +++ b/healthlink-his-ui/src/views/nursingmobile/OrderList.vue @@ -10,69 +10,56 @@
- 执行中 - 已校对 - 全部 + {{ $t('nursing.mobile.orderExecuting') }} + {{ $t('nursing.mobile.orderProofread') }} + {{ $t('nursing.mobile.all') }} - - 扫码执行 - + {{ $t('nursing.mobile.scanExecute') }}
-
+
{{ order.adviceName }} - - {{ order.requestStatusText }} - + {{ order.requestStatusText }}
- 类型: + {{ $t('nursing.mobile.type') }}: {{ order.therapyEnumText }}
- 频次: + {{ $t('nursing.mobile.frequency') }}: {{ order.frequencyUsage }}
- 剂量: + {{ $t('nursing.mobile.dosage') }}: {{ order.singleDose }}
- 开嘱医生: + {{ $t('nursing.mobile.orderDoctor') }}: {{ order.requesterName }}
- +
- + - - + +
@@ -82,8 +69,10 @@ import { ref, onMounted } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' +import { useI18n } from 'vue-i18n' import { getMobileOrderList, executeOrder } from './api' +const { t } = useI18n() const route = useRoute() const router = useRouter() const loading = ref(false) @@ -107,139 +96,52 @@ const fetchOrders = async () => { } } -const goBack = () => { - router.push('/nursingmobile/patient-list') -} +const goBack = () => { router.push('/nursingmobile/patient-list') } -const handleScan = () => { - scanForm.value.barcode = '' - scanDialogVisible.value = true -} +const handleScan = () => { scanForm.value.barcode = ''; scanDialogVisible.value = true } const confirmScan = () => { - if (!scanForm.value.barcode) { - ElMessage.warning('请输入条码') - return - } + if (!scanForm.value.barcode) { ElMessage.warning(t('nursing.assessment.valBarcode')); return } const matchedOrder = orderList.value.find(o => o.barcode === scanForm.value.barcode) - if (matchedOrder) { - handleExecute(matchedOrder) - } else { - ElMessage.error('未找到匹配的医嘱') - } + if (matchedOrder) { handleExecute(matchedOrder) } else { ElMessage.error(t('nursing.mobile.orderMatchFailed')) } scanDialogVisible.value = false } const handleExecute = async (order) => { try { await ElMessageBox.confirm( - `确认执行医嘱: ${order.adviceName}?`, - '确认执行', - { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' } + `${t('nursing.mobile.confirmExecuteOrder')}: ${order.adviceName}?`, + t('nursing.mobile.confirmExecute'), + { confirmButtonText: t('common.confirm'), cancelButtonText: t('common.cancel'), type: 'warning' } ) loading.value = true - await executeOrder({ - requestId: order.requestId, - adviceTable: order.adviceTable, - encounterId: order.encounterId, - patientId: order.patientId - }) - ElMessage.success('执行成功') + await executeOrder({ requestId: order.requestId, adviceTable: order.adviceTable, encounterId: order.encounterId, patientId: order.patientId }) + ElMessage.success(t('nursing.mobile.executeSuccess')) fetchOrders() } catch (e) { - if (e !== 'cancel') { - ElMessage.error('执行失败') - } + if (e !== 'cancel') { ElMessage.error(t('nursing.mobile.executeFailed')) } } finally { loading.value = false } } -const getStatusType = (status) => { - const map = { 2: 'primary', 3: 'success', 6: 'info', 10: 'warning', 11: '' } - return map[status] || 'info' -} +const getStatusType = (status) => ({ 2: 'primary', 3: 'success', 6: 'info', 10: 'warning', 11: '' })[status] || 'info' -onMounted(() => { - fetchOrders() -}) +onMounted(() => { fetchOrders() }) diff --git a/healthlink-his-ui/src/views/nursingmobile/PatientList.vue b/healthlink-his-ui/src/views/nursingmobile/PatientList.vue index 46e9f4b1e..364eaa700 100644 --- a/healthlink-his-ui/src/views/nursingmobile/PatientList.vue +++ b/healthlink-his-ui/src/views/nursingmobile/PatientList.vue @@ -1,48 +1,31 @@ @@ -76,126 +59,36 @@ const fetchData = async () => { } } -const handleSearch = () => { - fetchData() -} +const handleSearch = () => { fetchData() } const handlePatientClick = (patient) => { router.push({ path: '/nursingmobile/order-list', - query: { - encounterId: patient.encounterId, - patientId: patient.patientId, - patientName: patient.patientName, - bedName: patient.bedName - } + query: { encounterId: patient.encounterId, patientId: patient.patientId, patientName: patient.patientName, bedName: patient.bedName } }) } -const getGenderType = (gender) => { - return gender === 1 ? 'primary' : gender === 2 ? 'danger' : 'info' -} +const getGenderType = (gender) => gender === 1 ? 'primary' : gender === 2 ? 'danger' : 'info' +const getNursingLevelType = (level) => ({ 1: 'danger', 2: 'warning', 3: '', 4: 'danger' })[level] || 'info' +const getPriorityType = (priority) => ({ 1: 'danger', 2: 'warning', 3: '', 4: 'info' })[priority] || 'info' -const getNursingLevelType = (level) => { - const map = { 1: 'danger', 2: 'warning', 3: '', 4: 'danger' } - return map[level] || 'info' -} - -const getPriorityType = (priority) => { - const map = { 1: 'danger', 2: 'warning', 3: '', 4: 'info' } - return map[priority] || 'info' -} - -onMounted(() => { - fetchData() -}) +onMounted(() => { fetchData() }) diff --git a/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue b/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue index 1688bbb1c..30bae788e 100644 --- a/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue +++ b/healthlink-his-ui/src/views/nursingmobile/VitalSign.vue @@ -3,92 +3,79 @@ - - + + {{ patientName }} ({{ bedName }}) - - + + - - + + - + °C - + - 次/分 + {{ $t('nursing.mobile.unitTimesPerMin') }} - + - 次/分 + {{ $t('nursing.mobile.unitTimesPerMin') }} - + mmHg - + mmHg - + - - - - - - - - + + + + + + + + - + ml - + ml - 保存 + {{ $t('nursing.mobile.save') }} @@ -96,11 +83,13 @@ diff --git a/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue b/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue index a66b4b25a..285050c8b 100644 --- a/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue +++ b/healthlink-his-ui/src/views/nursingmobile/VitalSignTrend.vue @@ -3,28 +3,26 @@ -
- {{ patientName }} -
+
{{ patientName }}
- 3天 - 7天 - 14天 + {{ $t('nursing.mobile.days3') }} + {{ $t('nursing.mobile.days7') }} + {{ $t('nursing.mobile.days14') }}
-

体温 (°C)

+

{{ $t('nursing.mobile.temperatureChart') }}

-
暂无数据
+
{{ $t('nursing.mobile.noData') }}
{{ point.value }}
@@ -36,9 +34,9 @@
-

脉搏 (次/分)

+

{{ $t('nursing.mobile.pulseChart') }}

-
暂无数据
+
{{ $t('nursing.mobile.noData') }}
{{ point.value }}
@@ -50,9 +48,9 @@
-

血压 (mmHg)

+

{{ $t('nursing.mobile.bpChart') }}

-
暂无数据
+
{{ $t('nursing.mobile.noData') }}
{{ point.value }}/{{ getDiastolicValue(idx) }}
@@ -64,9 +62,9 @@
-

呼吸 (次/分)

+

{{ $t('nursing.mobile.respirationChart') }}

-
暂无数据
+
{{ $t('nursing.mobile.noData') }}
{{ point.value }}
@@ -93,11 +91,7 @@ const patientName = ref(route.query.patientName || '') const patientId = ref(route.query.patientId) const trendData = ref({ - temperatureData: [], - pulseData: [], - systolicBpData: [], - diastolicBpData: [], - respirationData: [] + temperatureData: [], pulseData: [], systolicBpData: [], diastolicBpData: [], respirationData: [] }) const fetchTrend = async () => { @@ -105,147 +99,38 @@ const fetchTrend = async () => { loading.value = true try { const res = await getVitalSignTrend(patientId.value, { days: days.value }) - trendData.value = res.data || { - temperatureData: [], - pulseData: [], - systolicBpData: [], - diastolicBpData: [], - respirationData: [] - } - if (res.data?.patientName) { - patientName.value = res.data.patientName - } + trendData.value = res.data || { temperatureData: [], pulseData: [], systolicBpData: [], diastolicBpData: [], respirationData: [] } + if (res.data?.patientName) { patientName.value = res.data.patientName } } finally { loading.value = false } } -const goBack = () => { - router.push('/nursingmobile/patient-list') -} +const goBack = () => { router.push('/nursingmobile/patient-list') } +const getBarHeight = (value, min, max) => { if (!value) return 0; const normalized = (value - min) / (max - min); return Math.max(10, Math.min(80, normalized * 80)) } +const getDiastolicValue = (idx) => { const point = trendData.value.diastolicBpData[idx]; return point ? point.value : '-' } +const formatLabel = (label) => { if (!label) return ''; const parts = label.split(' '); return parts.length > 1 ? parts[1] : label } -const getBarHeight = (value, min, max) => { - if (!value) return 0 - const normalized = (value - min) / (max - min) - return Math.max(10, Math.min(80, normalized * 80)) -} - -const getDiastolicValue = (idx) => { - const point = trendData.value.diastolicBpData[idx] - return point ? point.value : '-' -} - -const formatLabel = (label) => { - if (!label) return '' - const parts = label.split(' ') - return parts.length > 1 ? parts[1] : label -} - -onMounted(() => { - fetchTrend() -}) +onMounted(() => { fetchTrend() }) diff --git a/healthlink-his-ui/src/views/nursingquality/index.vue b/healthlink-his-ui/src/views/nursingquality/index.vue index 8d85b9bbd..9fe9a22a4 100644 --- a/healthlink-his-ui/src/views/nursingquality/index.vue +++ b/healthlink-his-ui/src/views/nursingquality/index.vue @@ -1,143 +1,61 @@