feat(i18n): migrate lab, inspection, report, medication, data dictionary pages to vue-i18n (676 keys)

This commit is contained in:
2026-06-25 10:13:04 +08:00
parent 84529b9f01
commit 25502820db
29 changed files with 3161 additions and 949 deletions

View File

@@ -2021,7 +2021,12 @@
}, },
"emr": { "emr": {
"timeliness": { "timeliness": {
"stats": { "pending": "Pending", "completed": "Completed", "overdue": "Overdue", "rate": "Completion Rate" }, "stats": {
"pending": "Pending",
"completed": "Completed",
"overdue": "Overdue",
"rate": "Completion Rate"
},
"department": "Department", "department": "Department",
"emrTypeLabel": "EMR Type", "emrTypeLabel": "EMR Type",
"statusLabel": "Status", "statusLabel": "Status",
@@ -2032,8 +2037,17 @@
"requiredHours": "Required Hours(h)", "requiredHours": "Required Hours(h)",
"deadline": "Deadline", "deadline": "Deadline",
"actualCompleteTime": "Actual Complete Time", "actualCompleteTime": "Actual Complete Time",
"emrType": { "admission": "Admission Record", "firstCourse": "First Course", "dailyCourse": "Daily Course", "discharge": "Discharge Record" }, "emrType": {
"status": { "pending": "Pending", "completed": "Completed", "overdue": "Overdue" } "admission": "Admission Record",
"firstCourse": "First Course",
"dailyCourse": "Daily Course",
"discharge": "Discharge Record"
},
"status": {
"pending": "Pending",
"completed": "Completed",
"overdue": "Overdue"
}
}, },
"sync": { "sync": {
"title": "EMR Data Sync", "title": "EMR Data Sync",
@@ -3273,5 +3287,739 @@
"inputPatientId": "Enter patient ID", "inputPatientId": "Enter patient ID",
"inputRecordId": "Enter record ID" "inputRecordId": "Enter record ID"
} }
},
"lab": {
"eqa": {
"title": "External Quality Assessment",
"totalRecords": "Total {n}",
"qualified": "Qualified {n}",
"unqualified": "Unqualified {n}",
"inputTitle": "Record EQA",
"assessmentName": "Assessment Name",
"assessmentNamePlaceholder": "e.g. 2026 Q1 Biochemistry",
"assessmentOrg": "Organization",
"year": "Year",
"quarter": "Quarter",
"sampleCode": "Sample Code",
"testItem": "Test Item",
"targetValue": "Target Value",
"actualValue": "Actual Value",
"operator": "Operator",
"submit": "Submit",
"resultTitle": "EQA Results",
"queryPlaceholder": "Assessment Name",
"query": "Query",
"printReport": "Print Report",
"deviationRate": "Deviation %",
"judgment": "Judgment",
"qualifiedResult": "Qualified",
"unqualifiedResult": "Unqualified",
"reportTitle": "EQA Report",
"yearQuarter": "Year/Quarter",
"reportDate": "Report Date",
"pleaseFillRequired": "Please fill in assessment name and test item",
"submitSuccessQualified": "Submitted, Judgment: Qualified",
"submitSuccessUnqualified": "Submitted, Judgment: Unqualified",
"submitSuccess": "Submitted successfully",
"noDataToPrint": "No data to print"
},
"qc": {
"title": "Internal Quality Control",
"totalRecords": "Total {n}",
"passed": "Passed {n}",
"failed": "Failed {n}",
"inputTitle": "Record QC Data",
"qcItem": "QC Item",
"qcItemPlaceholder": "e.g. ALT, GLU",
"instrument": "Instrument",
"instrumentPlaceholder": "Instrument Name",
"targetValue": "Target Value",
"actualValue": "Actual Value",
"qcDate": "QC Date",
"operator": "Operator",
"remarks": "Remarks",
"runWestgard": "Run Westgard",
"chartTitle": "QC Chart",
"queryItemPlaceholder": "QC Item",
"resultFilter": "Result",
"pass": "Pass",
"outOfControl": "Out of Control",
"resultListTitle": "QC Results",
"sdValue": "SD",
"cvRate": "CV%",
"westgardRule": "Westgard Rule",
"date": "Date",
"pleaseFillRequired": "Please fill in QC item and actual value",
"westgardPass": "Westgard: ",
"westgardFail": "Westgard: ",
"actualValueLegend": "Actual",
"targetValueLegend": "Target",
"yAxisName": "Value"
},
"history": {
"title": "Lab History Comparison",
"query": "Query",
"exportReport": "Export Report",
"patientId": "Patient ID",
"patientIdPlaceholder": "Enter Patient ID",
"testItem": "Test Item",
"testItemPlaceholder": "e.g. Glucose, CBC",
"dateRange": "Date Range",
"startPlaceholder": "Start",
"endPlaceholder": "End",
"trendTitle": "Test Trends",
"queryFirst": "Please query patient data first",
"abnormalTitle": "Abnormal Statistics",
"detailTitle": "Test Results Detail",
"seqNo": "No.",
"result": "Result",
"unit": "Unit",
"refRange": "Reference Range",
"abnormal": "Abnormal",
"normal": "Normal",
"testDate": "Test Date",
"department": "Department",
"reportTime": "Report Time",
"totalItems": "Total Items",
"normalItems": "Normal",
"abnormalItems": "Abnormal",
"abnormalRate": "Abnormal Rate",
"testCount": "Test Count",
"highestAbnormal": "Most Abnormal",
"highItems": "{n} high",
"none": "None",
"highCategory": "High(H)",
"lowCategory": "Low(L)",
"otherAbnormal": "Other",
"exportInDev": "Export feature in development",
"items": "items"
},
"enhanced": {
"title": "Lab System Enhanced",
"iqcTab": "Internal QC",
"eqaTab": "External EQA",
"totalTests": "Total Tests",
"qualified": "Qualified",
"outOfControl": "Out of Control",
"addRecord": "Add Record",
"instrument": "Instrument",
"qcItem": "QC Item",
"qcDate": "QC Date",
"targetValue": "Target",
"actualValue": "Actual",
"rule": "Rule",
"result": "Result",
"qualifiedResult": "Qualified",
"outOfControlResult": "Out of Control",
"assessmentProject": "Assessment",
"assessmentOrg": "Organization",
"testItem": "Test Item",
"deviationRate": "Deviation %",
"addSuccess": "Added successfully"
},
"appointment": {
"title": "Exam Appointment Queue",
"patientPlaceholder": "Patient",
"statusPlaceholder": "Status",
"query": "Query",
"newAppointment": "New Appointment",
"queueNumber": "Queue#",
"patient": "Patient",
"examName": "Exam",
"appointDate": "Date",
"timeSlot": "Time Slot",
"room": "Room",
"status": "Status",
"appointed": "Appointed",
"checkedIn": "Checked In",
"examining": "Examining",
"completed": "Completed",
"operation": "Action",
"checkin": "Check In",
"start": "Start",
"complete": "Complete",
"cancel": "Cancel",
"dialogTitle": "New Appointment",
"patientId": "Patient ID",
"encounterId": "Encounter ID",
"patientName": "Patient Name",
"timeSlotPlaceholder": "e.g. AM/PM",
"appointBtn": "Appoint",
"appointSuccess": "Appointment created",
"checkinSuccess": "Checked in",
"startSuccess": "Exam started",
"completeSuccess": "Exam completed",
"cancelSuccess": "Cancelled"
},
"icd10": {
"title": "ICD-10 Diagnosis Codes",
"keywordPlaceholder": "Code/Name/Pinyin",
"query": "Query",
"add": "Add",
"code": "Code",
"diagnosisName": "Diagnosis",
"category": "Category",
"pinyin": "Pinyin",
"operation": "Action",
"edit": "Edit",
"deleteConfirm": "Confirm delete?",
"delete": "Delete",
"saveSuccess": "Saved successfully",
"deleted": "Deleted",
"name": "Name"
},
"pathway": {
"title": "Clinical Pathway Management",
"refreshStats": "Refresh Stats",
"pathwayCount": "Pathways",
"entryCount": "Entries",
"completedCount": "Completed",
"variationCount": "Variations",
"completionRate": "Completion",
"pathwayName": "Pathway",
"diseaseCode": "Disease Code",
"diseaseName": "Disease",
"department": "Department",
"avgDays": "Avg Days",
"avgCost": "Avg Cost",
"version": "Version",
"operation": "Action",
"enterPathway": "Enter",
"enterDialogTitle": "Enter Pathway",
"pathway": "Pathway",
"patientId": "Patient ID",
"encounterId": "Encounter ID",
"patientName": "Patient Name",
"expectedDays": "Expected Days",
"expectedCost": "Expected Cost",
"confirmEnter": "Confirm",
"enterSuccess": "Entered pathway"
},
"radiology": {
"title": "Radiology Report",
"statusPlaceholder": "Status",
"query": "Query",
"newReport": "New Report",
"patient": "Patient",
"exam": "Exam",
"type": "Type",
"findings": "Findings",
"impression": "Impression",
"reporter": "Reporter",
"status": "Status",
"draft": "Draft",
"reported": "Reported",
"audited": "Audited",
"operation": "Action",
"submit": "Submit",
"audit": "Audit",
"dialogTitle": "New Radiology Report",
"applyId": "Apply ID",
"encounterId": "Encounter ID",
"patientName": "Patient Name",
"examName": "Exam Name",
"reportType": "Report Type",
"reportTypePlaceholder": "e.g. X-ray/CT/MRI",
"conclusion": "Conclusion",
"reportDoctor": "Report Doctor",
"saveSuccess": "Saved successfully",
"submitted": "Submitted",
"auditedSuccess": "Audited",
"auditDoctor": "Audit Doctor",
"auditReport": "Audit Report"
},
"refRange": {
"title": "Reference Range",
"itemCodePlaceholder": "Item Code",
"genderPlaceholder": "Gender",
"male": "Male",
"female": "Female",
"query": "Query",
"add": "Add",
"code": "Code",
"name": "Name",
"gender": "Gender",
"ageMin": "Min Age",
"ageMax": "Max Age",
"lowValue": "Lower",
"highValue": "Upper",
"unit": "Unit",
"criticalLow": "Critical Low",
"criticalHigh": "Critical High",
"operation": "Action",
"edit": "Edit",
"deleteConfirm": "Confirm delete?",
"delete": "Delete",
"universal": "All",
"ageRange": "Age Range",
"refLow": "Ref Lower",
"refHigh": "Ref Upper",
"saveSuccess": "Saved successfully",
"deleted": "Deleted"
}
},
"inspection": {
"groupRec": {
"dataQuery": "Data Query",
"patientOrItemPlaceholder": "Patient/Item Name",
"createTime": "Create Time",
"startDate": "Start Date",
"endDate": "End Date",
"search": "Search",
"reset": "Reset",
"sampleReceive": "Sample Receive",
"cancel": "Cancel",
"printBarcode": "Print Barcode",
"sampleName": "Sample Name",
"sampleVolume": "Sample Volume",
"sampleStatus": "Sample Status",
"collected": "Collected",
"pendingCollection": "Pending",
"received": "Received",
"receiveTime": "Receive Time",
"itemName": "Item Name",
"patientName": "Patient Name",
"gender": "Gender",
"pendingReceive": "Pending",
"receivedStatus": "Received",
"orderingDoctor": "Ordering Doctor",
"orderingTime": "Ordering Time",
"operationSuccess": "Operation successful"
},
"instrument": {
"typeCatalog": "Instrument Types",
"all": "All",
"instrumentName": "Instrument",
"nameCodePlaceholder": "Name/Code/",
"status": "Status",
"add": "Add",
"disable": "Disable",
"enable": "Enable",
"query": "Query",
"instrumentCode": "Code",
"instrumentNameCol": "Name",
"mainCode": "Main Code",
"type": "Type",
"model": "Model",
"manufacturer": "Manufacturer",
"serialNumber": "Serial No.",
"purchasingCompany": "Purchaser",
"contactPerson": "Contact",
"purchaseDate": "Purchase Date",
"originalPrice": "Original Price",
"transactionPrice": "Transaction Price",
"installationDate": "Install Date",
"installationPerson": "Installer",
"maintenancePerson": "Maintainer",
"useDepartment": "Department",
"identificationPerson": "Identifier",
"recordedTemperature": "Temperature",
"accessories": "Accessories",
"instrumentStatus": "Status",
"damageReportDate": "Damage Date",
"recheckable": "Recheckable",
"usageStatus": "Usage",
"decommissionReason": "Decommission Reason",
"remarks": "Remarks",
"operation": "Action",
"edit": "Edit",
"confirmEnable": "Confirm enable?",
"enableSuccess": "Enabled successfully",
"confirmDisable": "Confirm disable?",
"disableSuccess": "Disabled successfully",
"addTitle": "Add",
"editTitle": "Edit"
},
"lisConfig": {
"testItem": "Test Items",
"nameCodePlaceholder": "Name/Code",
"query": "Query",
"saveConfig": "Save Config",
"itemName": "Item Name",
"consumableName": "Consumable",
"consumablePlaceholder": "Enter consumable name",
"add": "Add",
"delete": "Delete",
"sampleName": "Sample Name",
"samplePlaceholder": "Enter sample name",
"quantity": "Quantity",
"quantityPlaceholder": "Enter quantity",
"unit": "Unit",
"unitPlaceholder": "Enter unit",
"observationName": "Observation",
"observationCode": "Obs Code",
"observationPlaceholder": "Enter observation name",
"saveSuccess": "Saved successfully",
"duplicateMaterial": "Duplicate material!",
"duplicateSample": "Duplicate sample!",
"duplicateObservation": "Duplicate observation!"
},
"observation": {
"typeCatalog": "Observation Types",
"all": "All",
"definitionName": "Definition",
"nameCodePlaceholder": "Name/Code",
"status": "Status",
"add": "Add",
"disable": "Disable",
"enable": "Enable",
"query": "Query",
"observationName": "Name",
"observationCode": "Code",
"observationType": "Type",
"refRange": "Ref Range",
"instrument": "Instrument",
"statusCol": "Status",
"operation": "Action",
"edit": "Edit",
"confirmEnable": "Confirm enable?",
"enableSuccess": "Enabled successfully",
"confirmDisable": "Confirm disable?",
"disableSuccess": "Disabled successfully",
"addTitle": "Add",
"editTitle": "Edit"
},
"report": {
"dataQuery": "Data Query",
"patientOrItemPlaceholder": "Patient/Item Name",
"createTime": "Create Time",
"startDate": "Start Date",
"endDate": "End Date",
"search": "Search",
"reset": "Reset",
"name": "Name",
"result": "Result",
"sample": "Sample",
"refRange": "Ref Range",
"observer": "Observer",
"observationTime": "Obs Time",
"itemName": "Item Name",
"patientName": "Patient Name",
"gender": "Gender",
"orderingDoctor": "Doctor",
"orderingTime": "Order Time",
"operation": "Action",
"printReport": "Print Report"
},
"sampleCollection": {
"dataQuery": "Data Query",
"patientOrItemPlaceholder": "Patient/Item Name",
"createTime": "Create Time",
"startDate": "Start Date",
"endDate": "End Date",
"search": "Search",
"reset": "Reset",
"collect": "Collect",
"mergeTube": "Merge",
"cancel": "Cancel",
"printBarcode": "Print Barcode",
"sampleName": "Sample Name",
"sampleVolume": "Sample Volume",
"collectionStatus": "Status",
"collected": "Collected",
"pendingCollection": "Pending",
"collectionTime": "Collection Time",
"itemName": "Item Name",
"patientName": "Patient Name",
"gender": "Gender",
"sampleStatus": "Sample Status",
"pendingCollect": "Pending",
"collectedStatus": "Collected",
"orderingDoctor": "Doctor",
"orderingTime": "Order Time",
"operationSuccess": "Operation successful"
},
"sampleType": {
"typeCatalog": "Sample Types",
"all": "All",
"sampleName": "Sample",
"nameCodePlaceholder": "Name/Brand/English/Code/Pinyin",
"status": "Status",
"addNewSample": "Add Sample",
"disable": "Disable",
"enable": "Enable",
"query": "Query",
"sampleType": "Type",
"sampleNameCol": "Name",
"customCode": "Custom Code",
"typeOrder": "Type Order",
"externalCode": "External Code",
"serialNumber": "Seq No.",
"globalType": "Global Type",
"pinyin": "Pinyin",
"wubi": "Wubi",
"specimenClass": "Class",
"extendedType": "Extended Type",
"whonetCode": "WHONET Code",
"statusCol": "Status",
"operation": "Action",
"edit": "Edit",
"confirmEnable": "Confirm enable?",
"enableSuccess": "Enabled successfully",
"confirmDisable": "Confirm disable?",
"disableSuccess": "Disabled successfully",
"addTitle": "Add",
"editTitle": "Edit"
}
},
"report": {
"biDashboard": {
"title": "BI Decision Report",
"reportType": "Report Type",
"generateReport": "Generate Report",
"reportData": "Report Data",
"date": "Date",
"department": "Department",
"revenue": "Revenue(10K)",
"cost": "Cost(10K)",
"patientCount": "Patients",
"monthlyTrend": "Monthly Revenue & Cost Trend",
"month": "Month",
"departmentRevenue": "Department Revenue Distribution",
"totalRevenue": "Total Revenue(10K)",
"totalCost": "Total Cost(10K)",
"totalProfit": "Total Profit(10K)",
"totalPatients": "Total Patients",
"totalRecords": "Total Records",
"cmiValue": "CMI Value",
"generateSuccess": "Report generated successfully",
"generateFailed": "Generation failed"
},
"dimension": {
"title": "Multi-Dimension Report",
"queryConditions": "Query Conditions",
"dimension": "Dimension",
"byStatus": "By QC Status",
"byDrg": "By DRG Group",
"byDiagnosis": "By Primary Diagnosis",
"startDate": "Start Date",
"endDate": "End Date",
"search": "Search",
"totalCases": "Total Cases",
"totalCost": "Total Cost",
"avgCost": "Average Cost",
"detail": " Detail",
"caseCount": "Cases",
"avgLosDays": "Avg Length of Stay",
"dayUnit": " days",
"loadFailed": "Load failed",
"unknownError": "Unknown error"
},
"dashboard": {
"title": "Visual Dashboard",
"dashboardType": "Dashboard Type",
"overview": "Operations Overview",
"finance": "Financial Analysis",
"patient": "Patient Statistics",
"refresh": "Refresh",
"totalRevenue": "Total Revenue(10K)",
"totalProfit": "Total Profit(10K)",
"totalPatients": "Total Patients",
"drgCases": "DRG Cases",
"totalCost": "Total Cost(10K)",
"latestCmi": "Latest CMI",
"costControlRate": "Cost Control Rate",
"totalRecords": "Total Records",
"chartData": "Chart Data",
"monthlyTrend": "Monthly Revenue & Cost Trend",
"month": "Month",
"revenue": "Revenue(10K)",
"cost": "Cost(10K)",
"departmentRevenue": "Department Revenue Distribution",
"department": "Department",
"drgTrend": "DRG Performance Trend",
"cmiValue": "CMI Value",
"costControlRateCol": "Cost Control Rate(%)",
"caseCount": "Cases"
},
"analytics": {
"title": "Business Analytics Report",
"exportExcel": "Export Excel",
"department": "Department",
"departmentName": "Department Name",
"startDate": "Start Date",
"endDate": "End Date",
"search": "Search",
"reset": "Reset",
"summaryData": "Summary Data",
"totalRecords": "Total Records",
"totalRevenue": "Total Revenue(10K)",
"totalCost": "Total Cost(10K)",
"totalProfit": "Total Profit(10K)",
"totalPatients": "Total Patients",
"profitRate": "Profit Rate",
"detailData": "Detail Data",
"date": "Date",
"revenue": "Revenue(10K)",
"cost": "Cost(10K)",
"profit": "Profit(10K)",
"patientCount": "Patients",
"bedCount": "Beds",
"bedOccupancyRate": "Bed Occupancy(%)",
"avgStayDays": "Avg Stay Days",
"avgCost": "Avg Cost(10K)",
"queryFailed": "Query failed",
"exportSuccess": "Exported {count} records, please check the data",
"exportFailed": "Export failed"
}
},
"medication": {
"dayEnd": {
"queryDate": "Query Date:",
"startDate": "Start Date",
"endDate": "End Date",
"settlementType": "Settlement Type:",
"daily": "Daily",
"weekly": "Weekly",
"monthly": "Monthly",
"search": "Search",
"print": "Print",
"add": "Add",
"edit": "Edit",
"delete": "Delete",
"export": "Export",
"settlementNo": "Settlement No",
"settlementDate": "Settlement Date",
"settlementTypeCol": "Settlement Type",
"settlementStatus": "Status",
"totalAmount": "Total Amount",
"operator": "Operator",
"operationTime": "Operation Time",
"operation": "Action",
"view": "View",
"addTitle": "Add Day-End Settlement",
"editTitle": "Edit Day-End Settlement",
"settlementNoRequired": "Settlement number is required",
"settlementDateRequired": "Settlement date is required",
"settlementTypeRequired": "Settlement type is required",
"totalAmountRequired": "Total amount is required",
"inputSettlementNo": "Enter settlement number",
"selectSettlementDate": "Select settlement date",
"selectSettlementType": "Select settlement type",
"inputTotalAmount": "Enter total amount",
"remark": "Remark",
"inputContent": "Enter content",
"confirm": "OK",
"cancel": "Cancel",
"confirmDelete": "Confirm to delete settlement \"{id}\"?",
"editSuccess": "Updated successfully",
"addSuccess": "Added successfully",
"deleteSuccess": "Deleted successfully",
"printNotImplemented": "Print feature not yet implemented",
"viewNotImplemented": "View feature not yet implemented",
"getListFailed": "Failed to get settlement list:"
},
"purchase": {
"documentNo": "Document No",
"approvalStatus": "Approval Status",
"documentType": "Document Type",
"supplier": "Supplier",
"handler": "Handler",
"queryTime": "Query Time:",
"startDate": "Start Date",
"endDate": "End Date",
"purchaseInbound": "Purchase Inbound",
"delete": "Delete",
"search": "Search",
"reset": "Reset",
"returnStatus": "Return Status",
"creator": "Creator",
"approver": "Approver",
"createTime": "Create Time",
"approvalTime": "Approval Time",
"operation": "Action",
"detail": "Detail",
"edit": "Edit",
"returnGoods": "Return",
"submitApproval": "Submit Approval",
"withdrawApproval": "Withdraw Approval",
"returned": "Returned",
"submitApprovalSuccess": "Approval submitted successfully",
"withdrawApprovalSuccess": "Approval withdrawn successfully",
"approvedCannotDelete": "Approved records cannot be deleted",
"confirmDeleteData": "Confirm to delete the above data?",
"deleteSuccess": "Deleted successfully"
},
"bill": {
"documentNo": "Document No",
"approvalStatus": "Approval Status",
"documentType": "Document Type",
"handler": "Handler",
"supplier": "Supplier",
"targetWarehouse": "Target Warehouse",
"totalAmount": "Total Amount",
"currencyUnit": "CNY",
"applicant": "Applicant",
"applyTime": "Apply Time",
"approver": "Approver",
"approvalTime": "Approval Time",
"operation": "Action",
"approve": "Approve",
"view": "View",
"export": "Export",
"reset": "Reset",
"search": "Search",
"selectApplyDate": "Select apply date",
"operationSuccess": "Operation successful"
},
"pharmacy": {
"selectWarehouse": "Select warehouse",
"selectStartTime": "Select start time",
"selectEndTime": "Select end time",
"search": "Search",
"reset": "Reset",
"warehouse": "Warehouse",
"initialAmount": "Initial Amount",
"finalAmount": "Final Amount",
"expectedFinalAmount": "Expected Final Amount",
"offsetAmount": "Offset",
"purchaseInAmount": "Purchase Inbound Amount",
"purchaseInDocs": "Purchase Inbound Docs",
"purchaseOutAmount": "Purchase Outbound Amount",
"purchaseOutDocs": "Purchase Outbound Docs",
"requisitionOutAmount": "Requisition Out Amount",
"requisitionOutDocs": "Requisition Out Docs",
"requisitionReturnAmount": "Requisition Return Amount",
"requisitionReturnDocs": "Requisition Return Docs",
"transferInAmount": "Transfer In Amount",
"transferInDocs": "Transfer In Docs",
"transferOutAmount": "Transfer Out Amount",
"transferOutDocs": "Transfer Out Docs",
"stocktakeAmount": "Stocktake P&L Amount",
"stocktakeDocs": "Stocktake P&L Docs",
"lossAmount": "Loss Amount",
"lossDocs": "Loss Docs",
"drugIssueAmount": "Drug Issue Amount",
"getReconciliationFailed": "Failed to get reconciliation data",
"getWarehouseFailed": "Failed to get warehouse data",
"unknownError": "Unknown error",
"invalidPageIndex": "Invalid page index"
}
},
"datadict": {
"drugPricing": "Drug Pricing",
"instrumentPricing": "Instrument Pricing",
"activityPricing": "Activity Pricing",
"financialCategory": "Financial Category",
"selectFinancialCategory": "Select financial category",
"status": "Status",
"selectStatus": "Select status",
"name": "Name",
"nameCodePinyin": "Name/Code/Pinyin",
"itemName": "Item Name",
"department": "Department",
"insuranceCategory": "Insurance Category",
"basePrice": "Base Price",
"detailCount": "Detail Count",
"operation": "Action",
"edit": "Edit",
"condition": "Condition",
"price": "Price",
"editPricing": "Edit Item Pricing",
"detailTitle": "Detail",
"operationSuccess": "Operation successful",
"confirm": "OK",
"cancel": "Cancel",
"confirmBeforeSubmit": "Please confirm before submitting"
} }
} }

View File

@@ -2021,7 +2021,12 @@
}, },
"emr": { "emr": {
"timeliness": { "timeliness": {
"stats": { "pending": "Chờ hoàn thành", "completed": "Đã hoàn thành", "overdue": "Quá hạn", "rate": "Tỷ lệ hoàn thành" }, "stats": {
"pending": "Chờ hoàn thành",
"completed": "Đã hoàn thành",
"overdue": "Quá hạn",
"rate": "Tỷ lệ hoàn thành"
},
"department": "Khoa", "department": "Khoa",
"emrTypeLabel": "Loại bệnh án", "emrTypeLabel": "Loại bệnh án",
"statusLabel": "Trạng thái", "statusLabel": "Trạng thái",
@@ -2032,8 +2037,17 @@
"requiredHours": "Thời gian yêu cầu(h)", "requiredHours": "Thời gian yêu cầu(h)",
"deadline": "Hạn chót", "deadline": "Hạn chót",
"actualCompleteTime": "Thời gian hoàn thành thực tế", "actualCompleteTime": "Thời gian hoàn thành thực tế",
"emrType": { "admission": "Bệnh án nhập viện", "firstCourse": "Diễn biến đầu", "dailyCourse": "Diễn biến hàng ngày", "discharge": "Bệnh án ra viện" }, "emrType": {
"status": { "pending": "Chờ hoàn thành", "completed": "Đã hoàn thành", "overdue": "Quá hạn" } "admission": "Bệnh án nhập viện",
"firstCourse": "Diễn biến đầu",
"dailyCourse": "Diễn biến hàng ngày",
"discharge": "Bệnh án ra viện"
},
"status": {
"pending": "Chờ hoàn thành",
"completed": "Đã hoàn thành",
"overdue": "Quá hạn"
}
}, },
"sync": { "sync": {
"title": "Đồng bộ dữ liệu EMR", "title": "Đồng bộ dữ liệu EMR",
@@ -3273,5 +3287,739 @@
"inputPatientId": "Nhập mã BN", "inputPatientId": "Nhập mã BN",
"inputRecordId": "Nhập mã biên bản" "inputRecordId": "Nhập mã biên bản"
} }
},
"lab": {
"eqa": {
"title": "Quản lý đánh giá chất lượng ngoại viện",
"totalRecords": "Tổng {n}",
"qualified": "Đạt {n}",
"unqualified": "Không đạt {n}",
"inputTitle": "Ghi nhận EQA",
"assessmentName": "Tên đánh giá",
"assessmentNamePlaceholder": "VD: Sinh hóa Q1/2026",
"assessmentOrg": "Tổ chức",
"year": "Năm",
"quarter": "Quý",
"sampleCode": "Mã mẫu",
"testItem": "Chỉ số xét nghiệm",
"targetValue": "Giá trị mục tiêu",
"actualValue": "Giá trị thực tế",
"operator": "Người thực hiện",
"submit": "Gửi",
"resultTitle": "Kết quả EQA",
"queryPlaceholder": "Tên đánh giá",
"query": "Tìm kiếm",
"printReport": "In báo cáo",
"deviationRate": "Sai lệch %",
"judgment": "Kết luận",
"qualifiedResult": "Đạt",
"unqualifiedResult": "Không đạt",
"reportTitle": "Báo cáo EQA",
"yearQuarter": "Năm/Quý",
"reportDate": "Ngày báo cáo",
"pleaseFillRequired": "Vui lòng điền tên đánh giá và chỉ số xét nghiệm",
"submitSuccessQualified": "Gửi thành công, Kết luận: Đạt",
"submitSuccessUnqualified": "Gửi thành công, Kết luận: Không đạt",
"submitSuccess": "Gửi thành công",
"noDataToPrint": "Không có dữ liệu để in"
},
"qc": {
"title": "Quản lý kiểm soát chất lượng nội viện",
"totalRecords": "Tổng {n}",
"passed": "Đạt {n}",
"failed": "Mất kiểm soát {n}",
"inputTitle": "Ghi nhận dữ liệu QC",
"qcItem": "Chỉ số QC",
"qcItemPlaceholder": "VD: ALT, GLU",
"instrument": "Thiết bị",
"instrumentPlaceholder": "Tên thiết bị",
"targetValue": "Giá trị mục tiêu",
"actualValue": "Giá trị thực tế",
"qcDate": "Ngày QC",
"operator": "Người thực hiện",
"remarks": "Ghi chú",
"runWestgard": "Chạy Westgard",
"chartTitle": "Biểu đồ QC",
"queryItemPlaceholder": "Chỉ số QC",
"resultFilter": "Kết quả",
"pass": "Đạt",
"outOfControl": "Mất kiểm soát",
"resultListTitle": "Danh sách kết quả QC",
"sdValue": "SD",
"cvRate": "CV%",
"westgardRule": "Quy tắc Westgard",
"date": "Ngày",
"pleaseFillRequired": "Vui lòng điền chỉ số QC và giá trị thực tế",
"westgardPass": "Westgard: ",
"westgardFail": "Westgard: ",
"actualValueLegend": "Thực tế",
"targetValueLegend": "Mục tiêu",
"yAxisName": "Giá trị"
},
"history": {
"title": "So sánh lịch sử xét nghiệm",
"query": "Tìm kiếm",
"exportReport": "Xuất báo cáo",
"patientId": "Mã bệnh nhân",
"patientIdPlaceholder": "Nhập mã bệnh nhân",
"testItem": "Chỉ số xét nghiệm",
"testItemPlaceholder": "VD: Glucose, CBC",
"dateRange": "Khoảng ngày",
"startPlaceholder": "Bắt đầu",
"endPlaceholder": "Kết thúc",
"trendTitle": "Xu hướng chỉ số",
"queryFirst": "Vui lòng tìm kiếm dữ liệu bệnh nhân trước",
"abnormalTitle": "Thống kê bất thường",
"detailTitle": "Chi tiết kết quả",
"seqNo": "STT",
"result": "Kết quả",
"unit": "Đơn vị",
"refRange": "Khoảng tham chiếu",
"abnormal": "Bất thường",
"normal": "Bình thường",
"testDate": "Ngày xét nghiệm",
"department": "Khoa",
"reportTime": "Thời gian báo cáo",
"totalItems": "Tổng chỉ số",
"normalItems": "Bình thường",
"abnormalItems": "Bất thường",
"abnormalRate": "Tỷ lệ bất thường",
"testCount": "Số lần xét nghiệm",
"highestAbnormal": "Bất thường cao nhất",
"highItems": "{n} cao",
"none": "Không",
"highCategory": "Cao(H)",
"lowCategory": "Thấp(L)",
"otherAbnormal": "Khác",
"exportInDev": "Chức năng xuất đang phát triển",
"items": "mục"
},
"enhanced": {
"title": "Hệ thống xét nghiệm nâng cao",
"iqcTab": "QC nội viện",
"eqaTab": "EQA ngoại viện",
"totalTests": "Tổng xét nghiệm",
"qualified": "Đạt",
"outOfControl": "Mất kiểm soát",
"addRecord": "Thêm bản ghi",
"instrument": "Thiết bị",
"qcItem": "Chỉ số QC",
"qcDate": "Ngày QC",
"targetValue": "Mục tiêu",
"actualValue": "Thực tế",
"rule": "Quy tắc",
"result": "Kết quả",
"qualifiedResult": "Đạt",
"outOfControlResult": "Mất kiểm soát",
"assessmentProject": "Đánh giá",
"assessmentOrg": "Tổ chức",
"testItem": "Chỉ số",
"deviationRate": "Sai lệch %",
"addSuccess": "Thêm thành công"
},
"appointment": {
"title": "Hàng đợi hẹn khám",
"patientPlaceholder": "Bệnh nhân",
"statusPlaceholder": "Trạng thái",
"query": "Tìm kiếm",
"newAppointment": "Tạo hẹn mới",
"queueNumber": "Số thứ tự",
"patient": "Bệnh nhân",
"examName": "Khám",
"appointDate": "Ngày hẹn",
"timeSlot": "Khung giờ",
"room": "Phòng",
"status": "Trạng thái",
"appointed": "Đã hẹn",
"checkedIn": "Đã check-in",
"examining": "Đang khám",
"completed": "Hoàn thành",
"operation": "Thao tác",
"checkin": "Check-in",
"start": "Bắt đầu",
"complete": "Hoàn thành",
"cancel": "Hủy",
"dialogTitle": "Tạo hẹn mới",
"patientId": "Mã BN",
"encounterId": "Mã lần khám",
"patientName": "Tên BN",
"timeSlotPlaceholder": "VD: Sáng/Chiều",
"appointBtn": "Hẹn",
"appointSuccess": "Tạo hẹn thành công",
"checkinSuccess": "Check-in thành công",
"startSuccess": "Bắt đầu khám",
"completeSuccess": "Khám hoàn thành",
"cancelSuccess": "Đã hủy"
},
"icd10": {
"title": "Mã chẩn đoán ICD-10",
"keywordPlaceholder": "Mã/Tên/Pinyin",
"query": "Tìm kiếm",
"add": "Thêm",
"code": "Mã",
"diagnosisName": "Chẩn đoán",
"category": "Phân loại",
"pinyin": "Pinyin",
"operation": "Thao tác",
"edit": "Sửa",
"deleteConfirm": "Xác nhận xóa?",
"delete": "Xóa",
"saveSuccess": "Lưu thành công",
"deleted": "Đã xóa",
"name": "Tên"
},
"pathway": {
"title": "Quản lý đường lâm sàng",
"refreshStats": "Làm mới thống kê",
"pathwayCount": "Số đường",
"entryCount": "Số vào đường",
"completedCount": "Hoàn thành",
"variationCount": "Biến thể",
"completionRate": "Tỷ lệ hoàn thành",
"pathwayName": "Tên đường",
"diseaseCode": "Mã bệnh",
"diseaseName": "Tên bệnh",
"department": "Khoa",
"avgDays": "Số ngày TB",
"avgCost": "Chi phí TB",
"version": "Phiên bản",
"operation": "Thao tác",
"enterPathway": "Vào đường",
"enterDialogTitle": "Vào đường lâm sàng",
"pathway": "Đường",
"patientId": "Mã BN",
"encounterId": "Mã lần khám",
"patientName": "Tên BN",
"expectedDays": "Số ngày dự kiến",
"expectedCost": "Chi phí dự kiến",
"confirmEnter": "Xác nhận",
"enterSuccess": "Vào đường thành công"
},
"radiology": {
"title": "Báo cáo hình ảnh",
"statusPlaceholder": "Trạng thái",
"query": "Tìm kiếm",
"newReport": "Tạo báo cáo",
"patient": "Bệnh nhân",
"exam": "Khám",
"type": "Loại",
"findings": "Phát hiện",
"impression": "Nhận định",
"reporter": "Báo cáo viên",
"status": "Trạng thái",
"draft": "Nháp",
"reported": "Đã báo cáo",
"audited": "Đã duyệt",
"operation": "Thao tác",
"submit": "Gửi",
"audit": "Duyệt",
"dialogTitle": "Tạo báo cáo hình ảnh",
"applyId": "Mã yêu cầu",
"encounterId": "Mã lần khám",
"patientName": "Tên BN",
"examName": "Tên khám",
"reportType": "Loại báo cáo",
"reportTypePlaceholder": "VD: X-ray/CT/MRI",
"conclusion": "Kết luận",
"reportDoctor": "Bác sĩ báo cáo",
"saveSuccess": "Lưu thành công",
"submitted": "Đã gửi",
"auditedSuccess": "Đã duyệt",
"auditDoctor": "Bác sĩ duyệt",
"auditReport": "Duyệt báo cáo"
},
"refRange": {
"title": "Khoảng tham chiếu",
"itemCodePlaceholder": "Mã chỉ số",
"genderPlaceholder": "Giới tính",
"male": "Nam",
"female": "Nữ",
"query": "Tìm kiếm",
"add": "Thêm",
"code": "Mã",
"name": "Tên",
"gender": "Giới tính",
"ageMin": "Tuổi tối thiểu",
"ageMax": "Tuổi tối đa",
"lowValue": "Dưới",
"highValue": "Trên",
"unit": "Đơn vị",
"criticalLow": "Nguy hiểm thấp",
"criticalHigh": "Nguy hiểm cao",
"operation": "Thao tác",
"edit": "Sửa",
"deleteConfirm": "Xác nhận xóa?",
"delete": "Xóa",
"universal": "Chung",
"ageRange": "Khoảng tuổi",
"refLow": "Tham chiếu dưới",
"refHigh": "Tham chiếu trên",
"saveSuccess": "Lưu thành công",
"deleted": "Đã xóa"
}
},
"inspection": {
"groupRec": {
"dataQuery": "Truy vấn dữ liệu",
"patientOrItemPlaceholder": "Tên BN/Tên chỉ số",
"createTime": "Thời gian tạo",
"startDate": "Ngày bắt đầu",
"endDate": "Ngày kết thúc",
"search": "Tìm kiếm",
"reset": "Đặt lại",
"sampleReceive": "Nhận mẫu",
"cancel": "Hủy",
"printBarcode": "In mã vạch",
"sampleName": "Tên mẫu",
"sampleVolume": "Số lượng mẫu",
"sampleStatus": "Trạng thái mẫu",
"collected": "Đã lấy",
"pendingCollection": "Chờ lấy",
"received": "Đã nhận",
"receiveTime": "Thời gian nhận",
"itemName": "Tên chỉ số",
"patientName": "Tên BN",
"gender": "Giới tính",
"pendingReceive": "Chờ nhận",
"receivedStatus": "Đã nhận",
"orderingDoctor": "Bác sĩ chỉ định",
"orderingTime": "Thời gian chỉ định",
"operationSuccess": "Thao tác thành công"
},
"instrument": {
"typeCatalog": "Loại thiết bị",
"all": "Tất cả",
"instrumentName": "Tên thiết bị",
"nameCodePlaceholder": "Tên/Mã/",
"status": "Trạng thái",
"add": "Thêm",
"disable": "Vô hiệu",
"enable": "Kích hoạt",
"query": "Tìm kiếm",
"instrumentCode": "Mã thiết bị",
"instrumentNameCol": "Tên thiết bị",
"mainCode": "Mã chính",
"type": "Loại",
"model": "Model",
"manufacturer": "Nhà sản xuất",
"serialNumber": "Số sê-ri",
"purchasingCompany": "Đơn vị mua",
"contactPerson": "Người liên hệ",
"purchaseDate": "Ngày mua",
"originalPrice": "Giá gốc",
"transactionPrice": "Giá giao dịch",
"installationDate": "Ngày lắp đặt",
"installationPerson": "Người lắp đặt",
"maintenancePerson": "Người bảo trì",
"useDepartment": "Khoa sử dụng",
"identificationPerson": "Người kiểm định",
"recordedTemperature": "Nhiệt độ",
"accessories": "Phụ kiện",
"instrumentStatus": "Trạng thái",
"damageReportDate": "Ngày báo hỏng",
"recheckable": "Có thể tái kiểm",
"usageStatus": "Tình trạng sử dụng",
"decommissionReason": "Lý do thanh lý",
"remarks": "Ghi chú",
"operation": "Thao tác",
"edit": "Sửa",
"confirmEnable": "Xác nhận kích hoạt?",
"enableSuccess": "Kích hoạt thành công",
"confirmDisable": "Xác nhận vô hiệu?",
"disableSuccess": "Vô hiệu thành công",
"addTitle": "Thêm",
"editTitle": "Sửa"
},
"lisConfig": {
"testItem": "Chỉ số xét nghiệm",
"nameCodePlaceholder": "Tên/Mã",
"query": "Tìm kiếm",
"saveConfig": "Lưu cấu hình",
"itemName": "Tên chỉ số",
"consumableName": "Vật tư tiêu hao",
"consumablePlaceholder": "Nhập tên vật tư",
"add": "Thêm",
"delete": "Xóa",
"sampleName": "Tên mẫu",
"samplePlaceholder": "Nhập tên mẫu",
"quantity": "Số lượng",
"quantityPlaceholder": "Nhập số lượng",
"unit": "Đơn vị",
"unitPlaceholder": "Nhập đơn vị",
"observationName": "Tên quan sát",
"observationCode": "Mã quan sát",
"observationPlaceholder": "Nhập tên quan sát",
"saveSuccess": "Lưu thành công",
"duplicateMaterial": "Vật tư đã tồn tại!",
"duplicateSample": "Mẫu đã tồn tại!",
"duplicateObservation": "Quan sát đã tồn tại!"
},
"observation": {
"typeCatalog": "Loại quan sát",
"all": "Tất cả",
"definitionName": "Tên định nghĩa",
"nameCodePlaceholder": "Tên/Mã",
"status": "Trạng thái",
"add": "Thêm",
"disable": "Vô hiệu",
"enable": "Kích hoạt",
"query": "Tìm kiếm",
"observationName": "Tên",
"observationCode": "Mã",
"observationType": "Loại",
"refRange": "Khoảng tham chiếu",
"instrument": "Thiết bị",
"statusCol": "Trạng thái",
"operation": "Thao tác",
"edit": "Sửa",
"confirmEnable": "Xác nhận kích hoạt?",
"enableSuccess": "Kích hoạt thành công",
"confirmDisable": "Xác nhận vô hiệu?",
"disableSuccess": "Vô hiệu thành công",
"addTitle": "Thêm",
"editTitle": "Sửa"
},
"report": {
"dataQuery": "Truy vấn dữ liệu",
"patientOrItemPlaceholder": "Tên BN/Tên chỉ số",
"createTime": "Thời gian tạo",
"startDate": "Ngày bắt đầu",
"endDate": "Ngày kết thúc",
"search": "Tìm kiếm",
"reset": "Đặt lại",
"name": "Tên",
"result": "Kết quả",
"sample": "Mẫu",
"refRange": "Khoảng tham chiếu",
"observer": "Người quan sát",
"observationTime": "Thời gian quan sát",
"itemName": "Tên chỉ số",
"patientName": "Tên BN",
"gender": "Giới tính",
"orderingDoctor": "Bác sĩ",
"orderingTime": "Thời gian chỉ định",
"operation": "Thao tác",
"printReport": "In báo cáo"
},
"sampleCollection": {
"dataQuery": "Truy vấn dữ liệu",
"patientOrItemPlaceholder": "Tên BN/Tên chỉ số",
"createTime": "Thời gian tạo",
"startDate": "Ngày bắt đầu",
"endDate": "Ngày kết thúc",
"search": "Tìm kiếm",
"reset": "Đặt lại",
"collect": "Lấy mẫu",
"mergeTube": "Gộp ống",
"cancel": "Hủy",
"printBarcode": "In mã vạch",
"sampleName": "Tên mẫu",
"sampleVolume": "Số lượng mẫu",
"collectionStatus": "Trạng thái",
"collected": "Đã lấy",
"pendingCollection": "Chờ lấy",
"collectionTime": "Thời gian lấy",
"itemName": "Tên chỉ số",
"patientName": "Tên BN",
"gender": "Giới tính",
"sampleStatus": "Trạng thái mẫu",
"pendingCollect": "Chờ lấy",
"collectedStatus": "Đã lấy",
"orderingDoctor": "Bác sĩ",
"orderingTime": "Thời gian chỉ định",
"operationSuccess": "Thao tác thành công"
},
"sampleType": {
"typeCatalog": "Loại mẫu",
"all": "Tất cả",
"sampleName": "Tên mẫu",
"nameCodePlaceholder": "Tên/Thương hiệu/Tiếng Anh/Mã/Pinyin",
"status": "Trạng thái",
"addNewSample": "Thêm mẫu mới",
"disable": "Vô hiệu",
"enable": "Kích hoạt",
"query": "Tìm kiếm",
"sampleType": "Loại",
"sampleNameCol": "Tên",
"customCode": "Mã tùy chỉnh",
"typeOrder": "Thứ tự loại",
"externalCode": "Mã ngoài",
"serialNumber": "Số thứ tự",
"globalType": "Loại toàn cầu",
"pinyin": "Pinyin",
"wubi": "Wubi",
"specimenClass": "Lớp mẫu",
"extendedType": "Loại mở rộng",
"whonetCode": "Mã WHONET",
"statusCol": "Trạng thái",
"operation": "Thao tác",
"edit": "Sửa",
"confirmEnable": "Xác nhận kích hoạt?",
"enableSuccess": "Kích hoạt thành công",
"confirmDisable": "Xác nhận vô hiệu?",
"disableSuccess": "Vô hiệu thành công",
"addTitle": "Thêm",
"editTitle": "Sửa"
}
},
"report": {
"biDashboard": {
"title": "Báo Cáo Quyết Định BI",
"reportType": "Loại Báo Cáo",
"generateReport": "Tạo Báo Cáo",
"reportData": "Dữ Liệu Báo Cáo",
"date": "Ngày",
"department": "Khoa",
"revenue": "Doanh Thu(10K)",
"cost": "Chi Phí(10K)",
"patientCount": "Bệnh Nhân",
"monthlyTrend": "Xu Hướng Doanh Thu & Chi Phí Hàng Tháng",
"month": "Tháng",
"departmentRevenue": "Phân Bố Doanh Thu Theo Khoa",
"totalRevenue": "Tổng Doanh Thu(10K)",
"totalCost": "Tổng Chi Phí(10K)",
"totalProfit": "Tổng Lợi Nhuận(10K)",
"totalPatients": "Tổng Bệnh Nhân",
"totalRecords": "Tổng Bản Ghi",
"cmiValue": "Giá Trị CMI",
"generateSuccess": "Tạo báo cáo thành công",
"generateFailed": "Tạo thất bại"
},
"dimension": {
"title": "Báo Cáo Đa Chiều",
"queryConditions": "Điều Kiện Truy Vấn",
"dimension": "Chiều",
"byStatus": "Theo Trạng Thái Kiểm Soát",
"byDrg": "Theo Nhóm DRG",
"byDiagnosis": "Theo Chẩn Đoán Chính",
"startDate": "Ngày Bắt Đầu",
"endDate": "Ngày Kết Thúc",
"search": "Tìm Kiếm",
"totalCases": "Tổng Ca Bệnh",
"totalCost": "Tổng Chi Phí",
"avgCost": "Chi Phí Trung Bình",
"detail": " Chi Tiết",
"caseCount": "Số Ca",
"avgLosDays": "TB Ngày Nằm Viện",
"dayUnit": " ngày",
"loadFailed": "Tải thất bại",
"unknownError": "Lỗi không xác định"
},
"dashboard": {
"title": "Bảng Điều Khiển Trực Quan",
"dashboardType": "Loại Bảng",
"overview": "Tổng Quan Vận Hành",
"finance": "Phân Tích Tài Chính",
"patient": "Thống Kê Bệnh Nhân",
"refresh": "Làm Mới",
"totalRevenue": "Tổng Doanh Thu(10K)",
"totalProfit": "Tổng Lợi Nhuận(10K)",
"totalPatients": "Tổng Bệnh Nhân",
"drgCases": "Ca DRG",
"totalCost": "Tổng Chi Phí(10K)",
"latestCmi": "CMI Mới Nhất",
"costControlRate": "Tỷ Lệ Kiểm Soát Chi Phí",
"totalRecords": "Tổng Bản Ghi",
"chartData": "Dữ Liệu Biểu Đồ",
"monthlyTrend": "Xu Hướng Doanh Thu & Chi Phí Hàng Tháng",
"month": "Tháng",
"revenue": "Doanh Thu(10K)",
"cost": "Chi Phí(10K)",
"departmentRevenue": "Phân Bố Doanh Thu Theo Khoa",
"department": "Khoa",
"drgTrend": "Xu Hướng Hiệu Suất DRG",
"cmiValue": "Giá Trị CMI",
"costControlRateCol": "Tỷ Lệ Kiểm Soát Chi Phí(%)",
"caseCount": "Số Ca"
},
"analytics": {
"title": "Báo Cáo Phân Tích Kinh Doanh",
"exportExcel": "Xuất Excel",
"department": "Khoa",
"departmentName": "Tên Khoa",
"startDate": "Ngày Bắt Đầu",
"endDate": "Ngày Kết Thúc",
"search": "Tìm Kiếm",
"reset": "Đặt Lại",
"summaryData": "Dữ Liệu Tổng Hợp",
"totalRecords": "Tổng Bản Ghi",
"totalRevenue": "Tổng Doanh Thu(10K)",
"totalCost": "Tổng Chi Phí(10K)",
"totalProfit": "Tổng Lợi Nhuận(10K)",
"totalPatients": "Tổng Bệnh Nhân",
"profitRate": "Tỷ Suất Lợi Nhuận",
"detailData": "Dữ Liệu Chi Tiết",
"date": "Ngày",
"revenue": "Doanh Thu(10K)",
"cost": "Chi Phí(10K)",
"profit": "Lợi Nhuận(10K)",
"patientCount": "Bệnh Nhân",
"bedCount": "Giường",
"bedOccupancyRate": "Tỷ Lệ Chiếm Giường(%)",
"avgStayDays": "TB Ngày Nằm Viện",
"avgCost": "Chi Phí TB(10K)",
"queryFailed": "Truy vấn thất bại",
"exportSuccess": "Đã xuất {count} bản ghi, vui lòng kiểm tra dữ liệu",
"exportFailed": "Xuất thất bại"
}
},
"medication": {
"dayEnd": {
"queryDate": "Ngày Truy Vấn:",
"startDate": "Ngày Bắt Đầu",
"endDate": "Ngày Kết Thúc",
"settlementType": "Loại Thanh Toán:",
"daily": "Hàng Ngày",
"weekly": "Hàng Tuần",
"monthly": "Hàng Tháng",
"search": "Tìm Kiếm",
"print": "In",
"add": "Thêm",
"edit": "Sửa",
"delete": "Xóa",
"export": "Xuất",
"settlementNo": "Số Thanh Toán",
"settlementDate": "Ngày Thanh Toán",
"settlementTypeCol": "Loại Thanh Toán",
"settlementStatus": "Trạng Thái",
"totalAmount": "Tổng Tiền",
"operator": "Người Vận Hành",
"operationTime": "Thời Gian Thao Tác",
"operation": "Thao Tác",
"view": "Xem",
"addTitle": "Thêm Phiếu Thanh Toán Cuối Ngày",
"editTitle": "Sửa Phiếu Thanh Toán Cuối Ngày",
"settlementNoRequired": "Số thanh toán không được để trống",
"settlementDateRequired": "Ngày thanh toán không được để trống",
"settlementTypeRequired": "Loại thanh toán không được để trống",
"totalAmountRequired": "Tổng tiền không được để trống",
"inputSettlementNo": "Nhập số thanh toán",
"selectSettlementDate": "Chọn ngày thanh toán",
"selectSettlementType": "Chọn loại thanh toán",
"inputTotalAmount": "Nhập tổng tiền",
"remark": "Ghi Chú",
"inputContent": "Nhập nội dung",
"confirm": "Xác Nhận",
"cancel": "Hủy Bỏ",
"confirmDelete": "Xác nhận xóa phiếu thanh toán \"{id}\"?",
"editSuccess": "Cập nhật thành công",
"addSuccess": "Thêm thành công",
"deleteSuccess": "Xóa thành công",
"printNotImplemented": "Chức năng in chưa được triển khai",
"viewNotImplemented": "Chức năng xem chưa được triển khai",
"getListFailed": "Lấy danh sách thanh toán thất bại:"
},
"purchase": {
"documentNo": "Số Chứng Từ",
"approvalStatus": "Trạng Thái Duyệt",
"documentType": "Loại Chứng Từ",
"supplier": "Nhà Cung Cấp",
"handler": "Người Xử Lý",
"queryTime": "Thời Gian Truy Vấn:",
"startDate": "Ngày Bắt Đầu",
"endDate": "Ngày Kết Thúc",
"purchaseInbound": "Nhập Kho Mua",
"delete": "Xóa",
"search": "Tìm Kiếm",
"reset": "Đặt Lại",
"returnStatus": "Trạng Thái Trả Hàng",
"creator": "Người Tạo",
"approver": "Người Duyệt",
"createTime": "Ngày Tạo",
"approvalTime": "Ngày Duyệt",
"operation": "Thao Tác",
"detail": "Chi Tiết",
"edit": "Sửa",
"returnGoods": "Trả Hàng",
"submitApproval": "Gửi Duyệt",
"withdrawApproval": "Rút Duyệt",
"returned": "Đã Trả",
"submitApprovalSuccess": "Gửi duyệt thành công",
"withdrawApprovalSuccess": "Rút duyệt thành công",
"approvedCannotDelete": "Bản ghi đã duyệt không thể xóa",
"confirmDeleteData": "Xác nhận xóa dữ liệu trên?",
"deleteSuccess": "Xóa thành công"
},
"bill": {
"documentNo": "Số Chứng Từ",
"approvalStatus": "Trạng Thái Duyệt",
"documentType": "Loại Chứng Từ",
"handler": "Người Xử Lý",
"supplier": "Nhà Cung Cấp",
"targetWarehouse": "Kho Đích",
"totalAmount": "Tổng Tiền",
"currencyUnit": "VNĐ",
"applicant": "Người Nộp",
"applyTime": "Thời Gian Nộp",
"approver": "Người Duyệt",
"approvalTime": "Thời Gian Duyệt",
"operation": "Thao Tác",
"approve": "Duyệt",
"view": "Xem",
"export": "Xuất",
"reset": "Đặt Lại",
"search": "Tìm Kiếm",
"selectApplyDate": "Chọn ngày nộp",
"operationSuccess": "Thao tác thành công"
},
"pharmacy": {
"selectWarehouse": "Chọn kho",
"selectStartTime": "Chọn thời gian bắt đầu",
"selectEndTime": "Chọn thời gian kết thúc",
"search": "Tìm Kiếm",
"reset": "Đặt Lại",
"warehouse": "Kho",
"initialAmount": "Số Dư Đầu Kỳ",
"finalAmount": "Số Dư Cuối Kỳ",
"expectedFinalAmount": "Số Dư Cuối Kỳ Dự Kiến",
"offsetAmount": "Độ Lệch",
"purchaseInAmount": "Tiền Nhập Kho Mua",
"purchaseInDocs": "Số Chứng Từ Nhập Kho Mua",
"purchaseOutAmount": "Tiền Xuất Kho Mua",
"purchaseOutDocs": "Số Chứng Từ Xuất Kho Mua",
"requisitionOutAmount": "Tiền Xuất Lĩnh",
"requisitionOutDocs": "Số Chứng Từ Xuất Lĩnh",
"requisitionReturnAmount": "Tiền Trả Lĩnh",
"requisitionReturnDocs": "Số Chứng Từ Trả Lĩnh",
"transferInAmount": "Tiền Nhập Điều Chuyển",
"transferInDocs": "Số Chứng Từ Nhập Điều Chuyển",
"transferOutAmount": "Tiền Xuất Điều Chuyển",
"transferOutDocs": "Số Chứng Từ Xuất Điều Chuyển",
"stocktakeAmount": "Tiền Kiểm Kê Lãi/Lỗ",
"stocktakeDocs": "Số Chứng Từ Kiểm Kê",
"lossAmount": "Tiền Báo Hỏng",
"lossDocs": "Số Chứng Từ Báo Hỏng",
"drugIssueAmount": "Tiền Phát Thuốc",
"getReconciliationFailed": "Lấy dữ liệu đối soát thất bại",
"getWarehouseFailed": "Lấy dữ liệu kho thất bại",
"unknownError": "Lỗi không xác định",
"invalidPageIndex": "Chỉ mục trang không hợp lệ"
}
},
"datadict": {
"drugPricing": "Định Giá Thuốc",
"instrumentPricing": "Định Giá Dụng Cụ",
"activityPricing": "Định Giá Hoạt Động",
"financialCategory": "Danh Mục Tài Chính",
"selectFinancialCategory": "Chọn danh mục tài chính",
"status": "Trạng Thái",
"selectStatus": "Chọn trạng thái",
"name": "Tên",
"nameCodePinyin": "Tên/Mã/Pinyin",
"itemName": "Tên Mục",
"department": "Khoa",
"insuranceCategory": "Danh Mục Bảo Hiểm",
"basePrice": "Giá Cơ Bản",
"detailCount": "Số Chi Tiết",
"operation": "Thao Tác",
"edit": "Sửa",
"condition": "Điều Kiện",
"price": "Giá",
"editPricing": "Sửa Định Giá Mục",
"detailTitle": "Chi Tiết",
"operationSuccess": "Thao tác thành công",
"confirm": "Xác Nhận",
"cancel": "Hủy Bỏ",
"confirmBeforeSubmit": "Vui lòng xác nhận trước khi gửi"
} }
} }

View File

@@ -2023,7 +2023,12 @@
}, },
"emr": { "emr": {
"timeliness": { "timeliness": {
"stats": { "pending": "待完成", "completed": "已完成", "overdue": "超时", "rate": "完成率" }, "stats": {
"pending": "待完成",
"completed": "已完成",
"overdue": "超时",
"rate": "完成率"
},
"department": "科室", "department": "科室",
"emrTypeLabel": "病历类型", "emrTypeLabel": "病历类型",
"statusLabel": "状态", "statusLabel": "状态",
@@ -2034,8 +2039,17 @@
"requiredHours": "要求时限(h)", "requiredHours": "要求时限(h)",
"deadline": "截止时间", "deadline": "截止时间",
"actualCompleteTime": "实际完成时间", "actualCompleteTime": "实际完成时间",
"emrType": { "admission": "入院记录", "firstCourse": "首次病程", "dailyCourse": "日常病程", "discharge": "出院记录" }, "emrType": {
"status": { "pending": "待完成", "completed": "已完成", "overdue": "超时" } "admission": "入院记录",
"firstCourse": "首次病程",
"dailyCourse": "日常病程",
"discharge": "出院记录"
},
"status": {
"pending": "待完成",
"completed": "已完成",
"overdue": "超时"
}
}, },
"sync": { "sync": {
"title": "EMR数据同步", "title": "EMR数据同步",
@@ -3275,5 +3289,739 @@
"inputPatientId": "请输入患者ID", "inputPatientId": "请输入患者ID",
"inputRecordId": "请输入记录ID" "inputRecordId": "请输入记录ID"
} }
},
"lab": {
"eqa": {
"title": "室间质评管理",
"totalRecords": "共 {n} 条",
"qualified": "合格 {n}",
"unqualified": "不合格 {n}",
"inputTitle": "录入室间质评",
"assessmentName": "评批名称",
"assessmentNamePlaceholder": "如2026年Q1生化",
"assessmentOrg": "组织机构",
"year": "年度",
"quarter": "季度",
"sampleCode": "样本编号",
"testItem": "检测项目",
"targetValue": "靶值",
"actualValue": "实测值",
"operator": "操作人",
"submit": "提交",
"resultTitle": "室间质评结果",
"queryPlaceholder": "评批名称",
"query": "查询",
"printReport": "打印报告单",
"deviationRate": "偏差率%",
"judgment": "判定",
"qualifiedResult": "合格",
"unqualifiedResult": "不合格",
"reportTitle": "室间质评报告单",
"yearQuarter": "年度/季度",
"reportDate": "报告日期",
"pleaseFillRequired": "请填写评批名称和检测项目",
"submitSuccessQualified": "提交成功,判定: 合格",
"submitSuccessUnqualified": "提交成功,判定: 不合格",
"submitSuccess": "提交成功",
"noDataToPrint": "暂无数据可打印"
},
"qc": {
"title": "室内质控管理",
"totalRecords": "共 {n} 条",
"passed": "合格 {n}",
"failed": "失控 {n}",
"inputTitle": "录入质控数据",
"qcItem": "质控项目",
"qcItemPlaceholder": "如ALT, GLU",
"instrument": "仪器",
"instrumentPlaceholder": "仪器名称",
"targetValue": "靶值",
"actualValue": "实测值",
"qcDate": "检测日期",
"operator": "操作人",
"remarks": "备注",
"runWestgard": "执行Westgard判断",
"chartTitle": "质控图",
"queryItemPlaceholder": "质控项目",
"resultFilter": "结果",
"pass": "通过",
"outOfControl": "失控",
"resultListTitle": "质控结果列表",
"sdValue": "SD",
"cvRate": "CV%",
"westgardRule": "Westgard判定",
"date": "日期",
"pleaseFillRequired": "请填写质控项目和实测值",
"westgardPass": "Westgard判定: ",
"westgardFail": "Westgard判定: ",
"actualValueLegend": "实测值",
"targetValueLegend": "靶值",
"yAxisName": "检测值"
},
"history": {
"title": "检验历史结果对比",
"query": "查询",
"exportReport": "导出报告",
"patientId": "患者ID",
"patientIdPlaceholder": "请输入患者ID",
"testItem": "检验项目",
"testItemPlaceholder": "如: 血糖、血常规",
"dateRange": "日期范围",
"startPlaceholder": "开始",
"endPlaceholder": "结束",
"trendTitle": "检验指标趋势",
"queryFirst": "请先查询患者数据",
"abnormalTitle": "异常指标统计",
"detailTitle": "检验结果明细",
"seqNo": "序号",
"result": "结果",
"unit": "单位",
"refRange": "参考范围",
"abnormal": "异常",
"normal": "正常",
"testDate": "检验日期",
"department": "科室",
"reportTime": "报告时间",
"totalItems": "总项目数",
"normalItems": "正常项",
"abnormalItems": "异常项",
"abnormalRate": "异常率",
"testCount": "检验次数",
"highestAbnormal": "最高异常",
"highItems": "{n}项偏高",
"none": "无",
"highCategory": "偏高(H)",
"lowCategory": "偏低(L)",
"otherAbnormal": "其他异常",
"exportInDev": "导出功能开发中",
"items": "项"
},
"enhanced": {
"title": "检验系统增强",
"iqcTab": "室内质控",
"eqaTab": "室间质评",
"totalTests": "总检测",
"qualified": "合格",
"outOfControl": "失控",
"addRecord": "新增记录",
"instrument": "仪器",
"qcItem": "质控项目",
"qcDate": "质质控日期",
"targetValue": "靶值",
"actualValue": "实测值",
"rule": "规则",
"result": "结果",
"qualifiedResult": "合格",
"outOfControlResult": "失控",
"assessmentProject": "质评项目",
"assessmentOrg": "组织机构",
"testItem": "检测项目",
"deviationRate": "偏差率%",
"addSuccess": "新增成功"
},
"appointment": {
"title": "检查预约排队",
"patientPlaceholder": "患者",
"statusPlaceholder": "状态",
"query": "查询",
"newAppointment": "新建预约",
"queueNumber": "队号",
"patient": "患者",
"examName": "检查项目",
"appointDate": "预约日期",
"timeSlot": "时段",
"room": "诊室",
"status": "状态",
"appointed": "已预约",
"checkedIn": "已签到",
"examining": "检查中",
"completed": "已完成",
"operation": "操作",
"checkin": "签到",
"start": "开始",
"complete": "完成",
"cancel": "取消",
"dialogTitle": "新建预约",
"patientId": "患者ID",
"encounterId": "就诊ID",
"patientName": "患者姓名",
"timeSlotPlaceholder": "如: 上午/下午",
"appointBtn": "预约",
"appointSuccess": "预约成功",
"checkinSuccess": "签到完成",
"startSuccess": "开始检查",
"completeSuccess": "检查完成",
"cancelSuccess": "已取消"
},
"icd10": {
"title": "ICD-10诊断编码库",
"keywordPlaceholder": "编码/名称/拼音",
"query": "查询",
"add": "新增",
"code": "编码",
"diagnosisName": "诊断名称",
"category": "分类",
"pinyin": "拼音",
"operation": "操作",
"edit": "编辑",
"deleteConfirm": "确定删除?",
"delete": "删除",
"saveSuccess": "保存成功",
"deleted": "已删除",
"name": "名称"
},
"pathway": {
"title": "临床路径管理",
"refreshStats": "刷新统计",
"pathwayCount": "路径数",
"entryCount": "入径数",
"completedCount": "完成数",
"variationCount": "变异数",
"completionRate": "完成率",
"pathwayName": "路径名称",
"diseaseCode": "疾病编码",
"diseaseName": "疾病名称",
"department": "科室",
"avgDays": "平均天数",
"avgCost": "平均费用",
"version": "版本",
"operation": "操作",
"enterPathway": "入径",
"enterDialogTitle": "患者入径",
"pathway": "路径",
"patientId": "患者ID",
"encounterId": "就诊ID",
"patientName": "患者姓名",
"expectedDays": "预期天数",
"expectedCost": "预期费用",
"confirmEnter": "确认入径",
"enterSuccess": "入径成功"
},
"radiology": {
"title": "影像图文报告",
"statusPlaceholder": "状态",
"query": "查询",
"newReport": "新建报告",
"patient": "患者",
"exam": "检查",
"type": "类型",
"findings": "所见",
"impression": "印象",
"reporter": "报告人",
"status": "状态",
"draft": "草稿",
"reported": "已报告",
"audited": "已审核",
"operation": "操作",
"submit": "提交",
"audit": "审核",
"dialogTitle": "新建影像报告",
"applyId": "申请ID",
"encounterId": "就诊ID",
"patientName": "患者姓名",
"examName": "检查名称",
"reportType": "报告类型",
"reportTypePlaceholder": "如: X光/CT/MRI",
"conclusion": "结论",
"reportDoctor": "报告医生",
"saveSuccess": "保存成功",
"submitted": "已提交",
"auditedSuccess": "已审核",
"auditDoctor": "审核医生",
"auditReport": "审核报告"
},
"refRange": {
"title": "检验参考范围",
"itemCodePlaceholder": "项目编码",
"genderPlaceholder": "性别",
"male": "男",
"female": "女",
"query": "查询",
"add": "新增",
"code": "编码",
"name": "名称",
"gender": "性别",
"ageMin": "最小年龄",
"ageMax": "最大年龄",
"lowValue": "下限",
"highValue": "上限",
"unit": "单位",
"criticalLow": "危急低",
"criticalHigh": "危急高",
"operation": "操作",
"edit": "编辑",
"deleteConfirm": "确定删除?",
"delete": "删除",
"universal": "通用",
"ageRange": "年龄范围",
"refLow": "参考下限",
"refHigh": "参考上限",
"saveSuccess": "保存成功",
"deleted": "已删除"
}
},
"inspection": {
"groupRec": {
"dataQuery": "数据查询",
"patientOrItemPlaceholder": "患者姓名/项目名称",
"createTime": "创建时间",
"startDate": "开始日期",
"endDate": "结束日期",
"search": "搜索",
"reset": "重置",
"sampleReceive": "样本接收",
"cancel": "取消",
"printBarcode": "打印条码",
"sampleName": "样本名称",
"sampleVolume": "样本数量",
"sampleStatus": "样本状态",
"collected": "已采集",
"pendingCollection": "待采集",
"received": "已接收",
"receiveTime": "接收时间",
"itemName": "项目名称",
"patientName": "患者姓名",
"gender": "性别",
"pendingReceive": "待接收",
"receivedStatus": "已接收",
"orderingDoctor": "开单医生",
"orderingTime": "开单时间",
"operationSuccess": "操作成功"
},
"instrument": {
"typeCatalog": "仪器类型目录",
"all": "全部",
"instrumentName": "仪器名",
"nameCodePlaceholder": "名称/编码/",
"status": "状态",
"add": "添加",
"disable": "停用",
"enable": "启用",
"query": "查询",
"instrumentCode": "仪器编码",
"instrumentNameCol": "仪器名称",
"mainCode": "主编码",
"type": "类型",
"model": "型号",
"manufacturer": "生产厂家",
"serialNumber": "序列号",
"purchasingCompany": "采购单位",
"contactPerson": "联系人",
"purchaseDate": "采购日期",
"originalPrice": "原价",
"transactionPrice": "成交价",
"installationDate": "安装日期",
"installationPerson": "安装人",
"maintenancePerson": "维护人",
"useDepartment": "使用科室",
"identificationPerson": "鉴定人",
"recordedTemperature": "记录温度",
"accessories": "附件",
"instrumentStatus": "仪器状态",
"damageReportDate": "报损日期",
"recheckable": "可复检",
"usageStatus": "使用情况",
"decommissionReason": "报废原因",
"remarks": "备注",
"operation": "操作",
"edit": "编辑",
"confirmEnable": "是否确定启用数据!",
"enableSuccess": "启用成功",
"confirmDisable": "是否确认停用数据!",
"disableSuccess": "停用成功",
"addTitle": "新增",
"editTitle": "编辑"
},
"lisConfig": {
"testItem": "检验项目",
"nameCodePlaceholder": "名称/编码",
"query": "查询",
"saveConfig": "保存配置详情",
"itemName": "项目名称",
"consumableName": "耗材名称",
"consumablePlaceholder": "请输入耗材名称",
"add": "新增",
"delete": "删除",
"sampleName": "样本名称",
"samplePlaceholder": "请输入样本名称",
"quantity": "数量",
"quantityPlaceholder": "请输入数量",
"unit": "单位",
"unitPlaceholder": "请输入单位",
"observationName": "观测名称",
"observationCode": "观测代码",
"observationPlaceholder": "请输入观测名称",
"saveSuccess": "保存成功",
"duplicateMaterial": "请勿重复添加此材料!",
"duplicateSample": "请勿重复添加此样本!",
"duplicateObservation": "请勿重复添加此观察项!"
},
"observation": {
"typeCatalog": "观测类型",
"all": "全部",
"definitionName": "定义名",
"nameCodePlaceholder": "名称/编码",
"status": "状态",
"add": "添加",
"disable": "停用",
"enable": "启用",
"query": "查询",
"observationName": "观测名称",
"observationCode": "观测代码",
"observationType": "观测类型",
"refRange": "参考范围",
"instrument": "仪器",
"statusCol": "状态",
"operation": "操作",
"edit": "编辑",
"confirmEnable": "是否确定启用数据!",
"enableSuccess": "启用成功",
"confirmDisable": "是否确认停用数据!",
"disableSuccess": "停用成功",
"addTitle": "新增",
"editTitle": "编辑"
},
"report": {
"dataQuery": "数据查询",
"patientOrItemPlaceholder": "患者姓名/项目名称",
"createTime": "创建时间",
"startDate": "开始日期",
"endDate": "结束日期",
"search": "搜索",
"reset": "重置",
"name": "名称",
"result": "结果",
"sample": "样本",
"refRange": "参考范围",
"observer": "观测人",
"observationTime": "观测时间",
"itemName": "项目名称",
"patientName": "患者姓名",
"gender": "性别",
"orderingDoctor": "开单医生",
"orderingTime": "开单时间",
"operation": "操作",
"printReport": "打印报告"
},
"sampleCollection": {
"dataQuery": "数据查询",
"patientOrItemPlaceholder": "患者姓名/项目名称",
"createTime": "创建时间",
"startDate": "开始日期",
"endDate": "结束日期",
"search": "搜索",
"reset": "重置",
"collect": "采集",
"mergeTube": "合管",
"cancel": "取消",
"printBarcode": "打印条码",
"sampleName": "样本名称",
"sampleVolume": "样本数量",
"collectionStatus": "采集状态",
"collected": "已采集",
"pendingCollection": "待采集",
"collectionTime": "采集时间",
"itemName": "项目名称",
"patientName": "患者姓名",
"gender": "性别",
"sampleStatus": "样本状态",
"pendingCollect": "待采集",
"collectedStatus": "已采集",
"orderingDoctor": "开单医生",
"orderingTime": "开单时间",
"operationSuccess": "操作成功"
},
"sampleType": {
"typeCatalog": "样本类型目录",
"all": "全部",
"sampleName": "样本名",
"nameCodePlaceholder": "品名/商品名/英文品名/编码/拼音",
"status": "状态",
"addNewSample": "添加新样本",
"disable": "停用",
"enable": "启用",
"query": "查询",
"sampleType": "样本类型",
"sampleNameCol": "样本名称",
"customCode": "自定义码",
"typeOrder": "类型顺序",
"externalCode": "外部代码",
"serialNumber": "序号",
"globalType": "全网型",
"pinyin": "拼音",
"wubi": "五笔",
"specimenClass": "样本类",
"extendedType": "扩展类型",
"whonetCode": "WHONET代码",
"statusCol": "状态",
"operation": "操作",
"edit": "编辑",
"confirmEnable": "是否确定启用数据!",
"enableSuccess": "启用成功",
"confirmDisable": "是否确认停用数据!",
"disableSuccess": "停用成功",
"addTitle": "新增",
"editTitle": "编辑"
}
},
"report": {
"biDashboard": {
"title": "BI决策报表",
"reportType": "报表类型",
"generateReport": "生成报表",
"reportData": "报表数据",
"date": "日期",
"department": "科室",
"revenue": "收入(万)",
"cost": "成本(万)",
"patientCount": "患者数",
"monthlyTrend": "月度收支趋势",
"month": "月份",
"departmentRevenue": "科室收入分布",
"totalRevenue": "总收入(万)",
"totalCost": "总成本(万)",
"totalProfit": "总利润(万)",
"totalPatients": "总患者数",
"totalRecords": "数据记录数",
"cmiValue": "CMI值",
"generateSuccess": "报表生成完成",
"generateFailed": "生成失败"
},
"dimension": {
"title": "多维度报表",
"queryConditions": "查询条件",
"dimension": "统计维度",
"byStatus": "按质控状态",
"byDrg": "按DRG分组",
"byDiagnosis": "按主要诊断",
"startDate": "开始日期",
"endDate": "结束日期",
"search": "查询",
"totalCases": "总病案数",
"totalCost": "总费用",
"avgCost": "平均费用",
"detail": "明细",
"caseCount": "病案数",
"avgLosDays": "平均住院日",
"dayUnit": "天",
"loadFailed": "加载失败",
"unknownError": "未知错误"
},
"dashboard": {
"title": "可视化仪表盘",
"dashboardType": "仪表盘类型",
"overview": "运营总览",
"finance": "财务分析",
"patient": "患者统计",
"refresh": "刷新",
"totalRevenue": "总收入(万)",
"totalProfit": "总利润(万)",
"totalPatients": "总患者数",
"drgCases": "DRG病例数",
"totalCost": "总成本(万)",
"latestCmi": "最新CMI值",
"costControlRate": "成本控制率",
"totalRecords": "数据记录数",
"chartData": "图表数据",
"monthlyTrend": "月度收支趋势",
"month": "月份",
"revenue": "收入(万)",
"cost": "成本(万)",
"departmentRevenue": "科室收入分布",
"department": "科室",
"drgTrend": "DRG绩效趋势",
"cmiValue": "CMI值",
"costControlRateCol": "成本控制率(%)",
"caseCount": "病例数"
},
"analytics": {
"title": "经营分析报告",
"exportExcel": "导出Excel",
"department": "科室",
"departmentName": "科室名称",
"startDate": "开始日期",
"endDate": "结束日期",
"search": "查询",
"reset": "重置",
"summaryData": "汇总数据",
"totalRecords": "总记录数",
"totalRevenue": "总收入(万)",
"totalCost": "总成本(万)",
"totalProfit": "总利润(万)",
"totalPatients": "总患者数",
"profitRate": "利润率",
"detailData": "明细数据",
"date": "日期",
"revenue": "收入(万元)",
"cost": "成本(万元)",
"profit": "利润(万元)",
"patientCount": "患者数",
"bedCount": "床位数",
"bedOccupancyRate": "床位率(%)",
"avgStayDays": "平均住院日",
"avgCost": "平均费用(万)",
"queryFailed": "查询失败",
"exportSuccess": "导出数据共 {count} 条,请查看返回数据",
"exportFailed": "导出失败"
}
},
"medication": {
"dayEnd": {
"queryDate": "查询日期:",
"startDate": "开始日期",
"endDate": "结束日期",
"settlementType": "结算类型:",
"daily": "日结",
"weekly": "周结",
"monthly": "月结",
"search": "查询",
"print": "打印",
"add": "新增",
"edit": "修改",
"delete": "删除",
"export": "导出",
"settlementNo": "结算单号",
"settlementDate": "结算日期",
"settlementTypeCol": "结算类型",
"settlementStatus": "结算状态",
"totalAmount": "总金额",
"operator": "操作人",
"operationTime": "操作时间",
"operation": "操作",
"view": "查看",
"addTitle": "添加日结结算单",
"editTitle": "修改日结结算单",
"settlementNoRequired": "结算单号不能为空",
"settlementDateRequired": "结算日期不能为空",
"settlementTypeRequired": "结算类型不能为空",
"totalAmountRequired": "总金额不能为空",
"inputSettlementNo": "请输入结算单号",
"selectSettlementDate": "请选择结算日期",
"selectSettlementType": "请选择结算类型",
"inputTotalAmount": "请输入总金额",
"remark": "备注",
"inputContent": "请输入内容",
"confirm": "确 定",
"cancel": "取 消",
"confirmDelete": "是否确认删除日结结算单编号为\"{id}\"的数据项?",
"editSuccess": "修改成功",
"addSuccess": "新增成功",
"deleteSuccess": "删除成功",
"printNotImplemented": "打印功能待实现",
"viewNotImplemented": "查看功能待实现",
"getListFailed": "获取日结结算单列表失败:"
},
"purchase": {
"documentNo": "单据号",
"approvalStatus": "审批状态",
"documentType": "单据类型",
"supplier": "供应商",
"handler": "经手人",
"queryTime": "查询时间:",
"startDate": "开始日期",
"endDate": "结束日期",
"purchaseInbound": "采购入库",
"delete": "删除",
"search": "查询",
"reset": "重置",
"returnStatus": "退库状态",
"creator": "制单人",
"approver": "审核人",
"createTime": "制单日期",
"approvalTime": "审核日期",
"operation": "操作",
"detail": "详情",
"edit": "编辑",
"returnGoods": "退库",
"submitApproval": "提交审批",
"withdrawApproval": "撤销审批",
"returned": "已退库",
"submitApprovalSuccess": "提交审批成功",
"withdrawApprovalSuccess": "撤销审批成功",
"approvedCannotDelete": "已审批的记录不能删除",
"confirmDeleteData": "是否确认删除以上数据?",
"deleteSuccess": "删除成功"
},
"bill": {
"documentNo": "单据号",
"approvalStatus": "审批状态",
"documentType": "单据类型",
"handler": "经手人",
"supplier": "供应商",
"targetWarehouse": "目的仓库",
"totalAmount": "总金额",
"currencyUnit": "元",
"applicant": "申请人",
"applyTime": "申请时间",
"approver": "审批人",
"approvalTime": "审批时间",
"operation": "操作",
"approve": "审批",
"view": "查看",
"export": "导出",
"reset": "重置",
"search": "搜索",
"selectApplyDate": "请选择申请日期",
"operationSuccess": "操作成功"
},
"pharmacy": {
"selectWarehouse": "请选择库房",
"selectStartTime": "选择开始时间",
"selectEndTime": "选择结束时间",
"search": "查询",
"reset": "重置",
"warehouse": "库房",
"initialAmount": "期初金额",
"finalAmount": "期末金额",
"expectedFinalAmount": "预期期末金额",
"offsetAmount": "偏移量",
"purchaseInAmount": "采购入库金额",
"purchaseInDocs": "采购入库单据数",
"purchaseOutAmount": "采购出库金额",
"purchaseOutDocs": "采购出库单据数",
"requisitionOutAmount": "领用出库金额",
"requisitionOutDocs": "领用出库单据数",
"requisitionReturnAmount": "领用退货金额",
"requisitionReturnDocs": "领用退货单据数",
"transferInAmount": "调拨入库金额",
"transferInDocs": "调拨入库单据数",
"transferOutAmount": "调拨出库金额",
"transferOutDocs": "调拨出库单据数",
"stocktakeAmount": "盘点盈亏金额",
"stocktakeDocs": "盘点盈亏单据数",
"lossAmount": "报损金额",
"lossDocs": "报损单据数",
"drugIssueAmount": "药品发放金额",
"getReconciliationFailed": "获取对账数据失败",
"getWarehouseFailed": "获取库房数据失败",
"unknownError": "未知错误",
"invalidPageIndex": "无效的页面索引"
}
},
"datadict": {
"drugPricing": "药品定价",
"instrumentPricing": "器具定价",
"activityPricing": "活动定价",
"financialCategory": "财务类别",
"selectFinancialCategory": "请选择财务类别",
"status": "状态",
"selectStatus": "请选择状态",
"name": "名称",
"nameCodePinyin": "名称/编码/拼音",
"itemName": "项目名称",
"department": "所属科室",
"insuranceCategory": "医保类别",
"basePrice": "基础价格",
"detailCount": "费用明细个数",
"operation": "操作",
"edit": "修改",
"condition": "条件",
"price": "价格",
"editPricing": "修改项目定价",
"detailTitle": "明细详情",
"operationSuccess": "操作成功",
"confirm": "确 定",
"cancel": "取 消",
"confirmBeforeSubmit": "请确认后再提交"
} }
} }

View File

@@ -21,7 +21,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item
label-width="100" label-width="100"
label="项目名称" :label="$t('datadict.itemName')"
prop="chargeName" prop="chargeName"
> >
<el-input <el-input
@@ -33,7 +33,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item
label-width="100" label-width="100"
label="所属科室" :label="$t('datadict.department')"
prop="orgId_dictText" prop="orgId_dictText"
> >
<el-input <el-input
@@ -45,7 +45,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item
label-width="100" label-width="100"
label="财务类别" :label="$t('datadict.financialCategory')"
prop="typeCode_dictText" prop="typeCode_dictText"
> >
<el-input <el-input
@@ -57,7 +57,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item
label-width="100" label-width="100"
label="医保类别" :label="$t('datadict.insuranceCategory')"
prop="ybType_dictText" prop="ybType_dictText"
> >
<el-input <el-input
@@ -69,7 +69,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item <el-form-item
label-width="100" label-width="100"
label="基础价格" :label="$t('datadict.basePrice')"
prop="price" prop="price"
> >
<el-input-number <el-input-number
@@ -92,16 +92,19 @@
type="primary" type="primary"
@click="submitForm" @click="submitForm"
> >
{{ $t('datadict.confirm') }}
</el-button> </el-button>
<el-button @click="cancel"> <el-button @click="cancel">
{{ $t('datadict.cancel') }}
</el-button> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const emit = defineEmits(["submit", "update:open"]); const emit = defineEmits(["submit", "update:open"]);
const props = defineProps({ const props = defineProps({
title: String, title: String,
@@ -126,7 +129,7 @@ const submitForm = () => {
emit("submit", fromModel.value); emit("submit", fromModel.value);
} else { } else {
// 验证失败,显示错误消息 // 验证失败,显示错误消息
ElMessage.warning("请确认后再提交"); ElMessage.warning(t('datadict.confirmBeforeSubmit'));
return false; return false;
} }
}); });
@@ -159,4 +162,4 @@ watch(
text-align: left; text-align: left;
line-height: 1; line-height: 1;
} }
</style> </style>

View File

@@ -13,20 +13,20 @@
@tab-click="handleClick" @tab-click="handleClick"
> >
<el-tab-pane <el-tab-pane
label="药品定价" :label="$t('datadict.drugPricing')"
name="1" name="1"
> >
<el-row :gutter="16"> <el-row :gutter="16">
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="财务类别" :label="$t('datadict.financialCategory')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.typeCode" v-model="queryParams.typeCode"
placeholder="请选择财务类别" :placeholder="$t('datadict.selectFinancialCategory')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -44,13 +44,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="状态" :label="$t('datadict.status')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.statusEnum" v-model="queryParams.statusEnum"
placeholder="请选择状态" :placeholder="$t('datadict.selectStatus')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -68,13 +68,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="名称" :label="$t('datadict.name')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码/拼音" :placeholder="$t('datadict.nameCodePinyin')"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@blur="handleQuery" @blur="handleQuery"
@@ -94,7 +94,7 @@
fixed="left" fixed="left"
/> />
<vxe-column <vxe-column
title="项目名称" :title="$t('datadict.itemName')"
width="200" width="200"
field="chargeName" field="chargeName"
align="center" align="center"
@@ -104,7 +104,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="所属科室" :title="$t('datadict.department')"
width="200" width="200"
field="orgId_dictText" field="orgId_dictText"
align="center" align="center"
@@ -114,7 +114,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="财务类别" :title="$t('datadict.financialCategory')"
width="200" width="200"
field=" typeCode_dictText" field=" typeCode_dictText"
align="center" align="center"
@@ -128,7 +128,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="医保类别" :title="$t('datadict.insuranceCategory')"
width="200" width="200"
field="ybType_dictText" field="ybType_dictText"
align="center" align="center"
@@ -140,7 +140,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="基础价格" :title="$t('datadict.basePrice')"
width="200" width="200"
field="price" field="price"
align="center" align="center"
@@ -150,7 +150,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="费用明细个数" :title="$t('datadict.detailCount')"
width="200" width="200"
field="detailCount" field="detailCount"
align="center" align="center"
@@ -171,7 +171,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="状态" :title="$t('datadict.status')"
width="200" width="200"
field="statusEnum_enumText" field="statusEnum_enumText"
align="center" align="center"
@@ -186,7 +186,7 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
min-width="290" min-width="290"
title="操作" :title="$t('datadict.operation')"
align="center" align="center"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
fixed="right" fixed="right"
@@ -197,7 +197,7 @@
type="primary" type="primary"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
> >
修改 {{ $t('datadict.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -211,20 +211,20 @@
/> />
</el-tab-pane> </el-tab-pane>
<el-tab-pane <el-tab-pane
label="器具定价" :label="$t('datadict.instrumentPricing')"
name="2" name="2"
> >
<el-row :gutter="16"> <el-row :gutter="16">
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="财务类别" :label="$t('datadict.financialCategory')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.typeCode" v-model="queryParams.typeCode"
placeholder="请选择财务类别" :placeholder="$t('datadict.selectFinancialCategory')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -242,13 +242,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="状态" :label="$t('datadict.status')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.statusEnum" v-model="queryParams.statusEnum"
placeholder="请选择状态" :placeholder="$t('datadict.selectStatus')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -266,13 +266,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="名称" :label="$t('datadict.name')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码/拼音" :placeholder="$t('datadict.nameCodePinyin')"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@blur="handleQuery" @blur="handleQuery"
@@ -292,7 +292,7 @@
fixed="left" fixed="left"
/> />
<vxe-column <vxe-column
title="项目名称" :title="$t('datadict.itemName')"
width="200" width="200"
field="chargeName" field="chargeName"
align="center" align="center"
@@ -302,7 +302,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="所属科室" :title="$t('datadict.department')"
width="200" width="200"
field="orgId_dictText" field="orgId_dictText"
align="center" align="center"
@@ -312,7 +312,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="财务类别" :title="$t('datadict.financialCategory')"
width="200" width="200"
field=" typeCode_dictText" field=" typeCode_dictText"
align="center" align="center"
@@ -326,7 +326,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="医保类别" :title="$t('datadict.insuranceCategory')"
width="200" width="200"
field="ybType_dictText" field="ybType_dictText"
align="center" align="center"
@@ -338,7 +338,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="基础价格" :title="$t('datadict.basePrice')"
width="200" width="200"
field="price" field="price"
align="center" align="center"
@@ -348,7 +348,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="费用明细个数" :title="$t('datadict.detailCount')"
width="200" width="200"
field="detailCount" field="detailCount"
align="center" align="center"
@@ -369,7 +369,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="状态" :title="$t('datadict.status')"
width="200" width="200"
field="statusEnum_enumText" field="statusEnum_enumText"
align="center" align="center"
@@ -384,7 +384,7 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
min-width="290" min-width="290"
title="操作" :title="$t('datadict.operation')"
align="center" align="center"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
fixed="right" fixed="right"
@@ -395,7 +395,7 @@
type="primary" type="primary"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
> >
修改 {{ $t('datadict.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -409,20 +409,20 @@
/> />
</el-tab-pane> </el-tab-pane>
<el-tab-pane <el-tab-pane
label="活动定价" :label="$t('datadict.activityPricing')"
name="3" name="3"
> >
<el-row :gutter="16"> <el-row :gutter="16">
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="财务类别" :label="$t('datadict.financialCategory')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.typeCode" v-model="queryParams.typeCode"
placeholder="请选择财务类别" :placeholder="$t('datadict.selectFinancialCategory')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -440,13 +440,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="状态" :label="$t('datadict.status')"
prop="chargeItem" prop="chargeItem"
> >
<el-select <el-select
v-model="queryParams.statusEnum" v-model="queryParams.statusEnum"
placeholder="请选择状态" :placeholder="$t('datadict.selectStatus')"
clearable clearable
:disabled="editShow" :disabled="editShow"
@@ -464,13 +464,13 @@
<!-- <el-col :span="4" style="width: 20%"> --> <!-- <el-col :span="4" style="width: 20%"> -->
<el-form-item <el-form-item
label-width="100" label-width="100"
label="名称" :label="$t('datadict.name')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码/拼音" :placeholder="$t('datadict.nameCodePinyin')"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@blur="handleQuery" @blur="handleQuery"
@@ -490,7 +490,7 @@
fixed="left" fixed="left"
/> />
<vxe-column <vxe-column
title="项目名称" :title="$t('datadict.itemName')"
width="200" width="200"
field="chargeName" field="chargeName"
align="center" align="center"
@@ -500,7 +500,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="所属科室" :title="$t('datadict.department')"
width="200" width="200"
field="orgId_dictText" field="orgId_dictText"
align="center" align="center"
@@ -510,7 +510,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="财务类别" :title="$t('datadict.financialCategory')"
width="200" width="200"
field=" typeCode_dictText" field=" typeCode_dictText"
align="center" align="center"
@@ -524,7 +524,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="医保类别" :title="$t('datadict.insuranceCategory')"
width="200" width="200"
field="ybType_dictText" field="ybType_dictText"
align="center" align="center"
@@ -536,7 +536,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="基础价格" :title="$t('datadict.basePrice')"
width="200" width="200"
field="price" field="price"
align="center" align="center"
@@ -546,7 +546,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="费用明细个数" :title="$t('datadict.detailCount')"
width="200" width="200"
field="detailCount" field="detailCount"
align="center" align="center"
@@ -567,7 +567,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="状态" :title="$t('datadict.status')"
width="200" width="200"
field="statusEnum_enumText" field="statusEnum_enumText"
align="center" align="center"
@@ -582,7 +582,7 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
min-width="290" min-width="290"
title="操作" :title="$t('datadict.operation')"
align="center" align="center"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
fixed="right" fixed="right"
@@ -593,7 +593,7 @@
type="primary" type="primary"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
> >
修改 {{ $t('datadict.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -620,7 +620,7 @@
show-overflow="title" show-overflow="title"
> >
<vxe-column <vxe-column
title="条件" :title="$t('datadict.condition')"
field="conditionCode_enumText" field="conditionCode_enumText"
align="center" align="center"
> >
@@ -633,7 +633,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="价格" :title="$t('datadict.price')"
width="200" width="200"
field="amount" field="amount"
align="center" align="center"
@@ -658,6 +658,9 @@
import {getDetail, initOption, listDefinition, updateDefinition,} from "./components/definition"; import {getDetail, initOption, listDefinition, updateDefinition,} from "./components/definition";
import Edit from "./components/edit.vue"; import Edit from "./components/edit.vue";
import {thousandNumber} from "@/utils/his.js"; import {thousandNumber} from "@/utils/his.js";
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const activeName = ref("1"); const activeName = ref("1");
const showSearch = ref("true"); const showSearch = ref("true");
@@ -739,7 +742,7 @@ function handleUpdate(row) {
reset(); reset();
form.value = row; form.value = row;
open.value = true; open.value = true;
title.value = "修改项目定价"; title.value = t('datadict.editPricing');
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleInit() { function handleInit() {
@@ -759,7 +762,7 @@ function handleDetails(row) {
definitionDetailList.value = res.data; definitionDetailList.value = res.data;
openDetails.value = true; openDetails.value = true;
detailLoading.value = false; detailLoading.value = false;
title.value = "明细详情"; title.value = t('datadict.detailTitle');
} }
}); });
} }
@@ -772,7 +775,7 @@ const handleFormChange = (newForm) => {
/** 提交按钮 */ /** 提交按钮 */
function submitForm(form) { function submitForm(form) {
updateDefinition(form).then((response) => { updateDefinition(form).then((response) => {
proxy.$modal.msgSuccess("操作成功"); proxy.$modal.msgSuccess(t('datadict.operationSuccess'));
open.value = false; open.value = false;
getList(); getList();
}); });

View File

@@ -8,19 +8,19 @@
label-width="68px" label-width="68px"
> >
<el-form-item <el-form-item
label="数据查询" :label="$t('inspection.groupRec.dataQuery')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="患者姓名/项目名称" :placeholder="$t('inspection.groupRec.patientOrItemPlaceholder')"
clearable clearable
style="width: 240px" style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="创建时间" :label="$t('inspection.groupRec.createTime')"
style="width: 308px;" style="width: 308px;"
> >
<el-date-picker <el-date-picker
@@ -28,8 +28,8 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
type="daterange" type="daterange"
range-separator="-" range-separator="-"
start-placeholder="开始日期" :start-placeholder="$t('inspection.groupRec.startDate')"
end-placeholder="结束日期" :end-placeholder="$t('inspection.groupRec.endDate')"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -38,13 +38,13 @@
icon="Search" icon="Search"
@click="handleQuery" @click="handleQuery"
> >
搜索 {{ $t('inspection.groupRec.search') }}
</el-button> </el-button>
<el-button <el-button
icon="Refresh" icon="Refresh"
@click="resetQuery" @click="resetQuery"
> >
重置 {{ $t('inspection.groupRec.reset') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -61,7 +61,7 @@
:disabled="collect" :disabled="collect"
@click="handleCollect('已接收')" @click="handleCollect('已接收')"
> >
样本接收 {{ $t('inspection.groupRec.sampleReceive') }}
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5">--> <!-- <el-col :span="1.5">-->
@@ -81,7 +81,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleCollect('已采集')" @click="handleCollect('已采集')"
> >
取消 {{ $t('inspection.groupRec.cancel') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -92,7 +92,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
> >
打印条码 {{ $t('inspection.groupRec.printBarcode') }}
</el-button> </el-button>
</el-col> </el-col>
<right-toolbar <right-toolbar
@@ -130,11 +130,11 @@
/> />
<vxe-column <vxe-column
field="specimenName" field="specimenName"
title="样本名称" :title="$t('inspection.groupRec.sampleName')"
/> />
<vxe-column <vxe-column
field="specimenVolume" field="specimenVolume"
title="样本数量" :title="$t('inspection.groupRec.sampleVolume')"
> >
<template #default="innerProps"> <template #default="innerProps">
{{ innerProps.row.specimenVolume }} {{ innerProps.row.specimenUnit }} {{ innerProps.row.specimenVolume }} {{ innerProps.row.specimenUnit }}
@@ -142,32 +142,32 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="collectionStatusEnumText" field="collectionStatusEnumText"
title="样本状态" :title="$t('inspection.groupRec.sampleStatus')"
> >
<template #default="nerProp"> <template #default="nerProp">
<span <span
v-if="nerProp.row.collectionStatusEnum == 1" v-if="nerProp.row.collectionStatusEnum == 1"
style="color:green" style="color:green"
> >
已采集 {{ $t('inspection.groupRec.collected') }}
</span> </span>
<span <span
v-else-if="nerProp.row.collectionStatusEnum == 0" v-else-if="nerProp.row.collectionStatusEnum == 0"
style="color:orange" style="color:orange"
> >
待采集 {{ $t('inspection.groupRec.pendingCollection') }}
</span> </span>
<span <span
v-else-if="nerProp.row.collectionStatusEnum == 2" v-else-if="nerProp.row.collectionStatusEnum == 2"
style="color:#0EB396" style="color:#0EB396"
> >
已接收 {{ $t('inspection.groupRec.received') }}
</span> </span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="receivedDate" field="receivedDate"
title="接收时间" :title="$t('inspection.groupRec.receiveTime')"
/> />
</vxe-table> </vxe-table>
</template> </template>
@@ -175,43 +175,43 @@
<!-- 母表列 --> <!-- 母表列 -->
<vxe-column <vxe-column
field="chargeName" field="chargeName"
title="项目名称" :title="$t('inspection.groupRec.itemName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="patientName" field="patientName"
title="患者姓名" :title="$t('inspection.groupRec.patientName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="genderEnumText" field="genderEnumText"
title="性别" :title="$t('inspection.groupRec.gender')"
:sortable="true" :sortable="true"
/> />
<vxe-column title="样本状态"> <vxe-column :title="$t('inspection.groupRec.sampleStatus')">
<template #default="sprops"> <template #default="sprops">
<span <span
v-if="hasPendingCollection(sprops.row.children)" v-if="hasPendingCollection(sprops.row.children)"
style="color:red" style="color:red"
> >
待接收 {{ $t('inspection.groupRec.pendingReceive') }}
</span> </span>
<span <span
v-else v-else
style="color:#0EB396" style="color:#0EB396"
> >
已接收 {{ $t('inspection.groupRec.receivedStatus') }}
</span> </span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="doctorName" field="doctorName"
title="开单医生" :title="$t('inspection.groupRec.orderingDoctor')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="authoredTime" field="authoredTime"
title="开单时间" :title="$t('inspection.groupRec.orderingTime')"
:sortable="true" :sortable="true"
/> />
</vxe-table> </vxe-table>
@@ -230,6 +230,8 @@
import {collectionList, editStatus} from "./components/collect.js"; import {collectionList, editStatus} from "./components/collect.js";
import {formatDateStr} from "@/utils/index.js"; import {formatDateStr} from "@/utils/index.js";
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dataList = ref([]); const dataList = ref([]);
@@ -301,7 +303,7 @@ function handleSelectionChange(selection) {
function handleCollect(type) { function handleCollect(type) {
editStatus(ids.value,type).then(()=>{ editStatus(ids.value,type).then(()=>{
proxy.$modal.msgSuccess("操作成功"); proxy.$modal.msgSuccess(t('inspection.groupRec.operationSuccess'));
getList(); getList();
}) })
} }

View File

@@ -7,7 +7,7 @@
:xs="24" :xs="24"
> >
<div class="head-title"> <div class="head-title">
仪器类型目录 {{ $t('inspection.instrument.typeCatalog') }}
</div> </div>
<div class="head-container"> <div class="head-container">
<el-tree <el-tree
@@ -38,13 +38,13 @@
<el-row :gutter="24"> <el-row :gutter="24">
<!-- <el-col :span="6"> --> <!-- <el-col :span="6"> -->
<el-form-item <el-form-item
label="仪器名" :label="$t('inspection.instrument.instrumentName')"
prop="searchKey" prop="searchKey"
label-width="55" label-width="55"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码/" :placeholder="$t('inspection.instrument.nameCodePlaceholder')"
clearable clearable
style="width: 220px" style="width: 220px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -53,7 +53,7 @@
<!-- </el-col> --> <!-- </el-col> -->
<!-- <el-col :span="5"> --> <!-- <el-col :span="5"> -->
<el-form-item <el-form-item
label="状态" :label="$t('inspection.instrument.status')"
prop="statusEnum" prop="statusEnum"
label-width="50" label-width="50"
> >
@@ -83,7 +83,7 @@
icon="Plus" icon="Plus"
@click="openAddInstrument()" @click="openAddInstrument()"
> >
添加 {{ $t('inspection.instrument.add') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -94,7 +94,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleClose" @click="handleClose"
> >
停用 {{ $t('inspection.instrument.disable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -105,7 +105,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleStart" @click="handleStart"
> >
启用 {{ $t('inspection.instrument.enable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -115,7 +115,7 @@
icon="Search" icon="Search"
@click="getList" @click="getList"
> >
查询 {{ $t('inspection.instrument.query') }}
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
@@ -142,91 +142,91 @@
/> />
<vxe-column <vxe-column
key="instrumentCode" key="instrumentCode"
title="仪器编码" :title="$t('inspection.instrument.instrumentCode')"
align="center" align="center"
field="instrumentCode" field="instrumentCode"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="instrumentName" key="instrumentName"
title="仪器名称" :title="$t('inspection.instrument.instrumentNameCol')"
align="center" align="center"
field="instrumentName" field="instrumentName"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="instrumentMainCode" key="instrumentMainCode"
title="主编码" :title="$t('inspection.instrument.mainCode')"
align="center" align="center"
field="instrumentMainCode" field="instrumentMainCode"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="instrumentTypeEnumText" key="instrumentTypeEnumText"
title="类型" :title="$t('inspection.instrument.type')"
align="center" align="center"
field="instrumentTypeEnumText" field="instrumentTypeEnumText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="instrumentModel" key="instrumentModel"
title="型号" :title="$t('inspection.instrument.model')"
align="center" align="center"
field="instrumentModel" field="instrumentModel"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="manufacturer" key="manufacturer"
title="生产厂家" :title="$t('inspection.instrument.manufacturer')"
align="center" align="center"
field="manufacturer" field="manufacturer"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="serialNumber" key="serialNumber"
title="序列号" :title="$t('inspection.instrument.serialNumber')"
align="center" align="center"
field="serialNumber" field="serialNumber"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="purchasingCompany" key="purchasingCompany"
title="采购单位" :title="$t('inspection.instrument.purchasingCompany')"
align="center" align="center"
field="purchasingCompany" field="purchasingCompany"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="contactPerson" key="contactPerson"
title="联系人" :title="$t('inspection.instrument.contactPerson')"
align="center" align="center"
field="contactPerson" field="contactPerson"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="purchaseDate" key="purchaseDate"
title="采购日期" :title="$t('inspection.instrument.purchaseDate')"
align="center" align="center"
field="purchaseDate" field="purchaseDate"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="originalPrice" key="originalPrice"
title="原价" :title="$t('inspection.instrument.originalPrice')"
align="center" align="center"
field="originalPrice" field="originalPrice"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="transactionPrice" key="transactionPrice"
title="成交价" :title="$t('inspection.instrument.transactionPrice')"
align="center" align="center"
field="transactionPrice" field="transactionPrice"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="installationDate" key="installationDate"
title="安装日期" :title="$t('inspection.instrument.installationDate')"
align="center" align="center"
field="installationDate" field="installationDate"
show-overflow="title" show-overflow="title"
@@ -237,91 +237,91 @@
</vxe-column>> </vxe-column>>
<vxe-column <vxe-column
key="installationPerson" key="installationPerson"
title="安装人" :title="$t('inspection.instrument.installationPerson')"
align="center" align="center"
field="installationPerson" field="installationPerson"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="maintenancePerson" key="maintenancePerson"
title="维护人" :title="$t('inspection.instrument.maintenancePerson')"
align="center" align="center"
field="maintenancePerson" field="maintenancePerson"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="orgId_dictText" key="orgId_dictText"
title="使用科室" :title="$t('inspection.instrument.useDepartment')"
align="center" align="center"
field="orgId_dictText" field="orgId_dictText"
show-overflow="title" show-overflow="title"
/>> />>
<vxe-column <vxe-column
key="identificationPerson" key="identificationPerson"
title="鉴定人" :title="$t('inspection.instrument.identificationPerson')"
align="center" align="center"
field="identificationPerson" field="identificationPerson"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="recordedTemperature" key="recordedTemperature"
title="记录温度" :title="$t('inspection.instrument.recordedTemperature')"
align="center" align="center"
field="recordedTemperature" field="recordedTemperature"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="accessories" key="accessories"
title="附件" :title="$t('inspection.instrument.accessories')"
align="center" align="center"
field="accessories" field="accessories"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="instrumentStatusEnum" key="instrumentStatusEnum"
title="仪器状态" :title="$t('inspection.instrument.instrumentStatus')"
align="center" align="center"
field="instrumentStatusEnum" field="instrumentStatusEnum"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="damageReportDate" key="damageReportDate"
title="报损日期" :title="$t('inspection.instrument.damageReportDate')"
align="center" align="center"
field="damageReportDate" field="damageReportDate"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="recheckableInstrumentEnum" key="recheckableInstrumentEnum"
title="可复检" :title="$t('inspection.instrument.recheckable')"
align="center" align="center"
field="recheckableInstrumentEnum" field="recheckableInstrumentEnum"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="usageStatusEnum" key="usageStatusEnum"
title="使用情况" :title="$t('inspection.instrument.usageStatus')"
align="center" align="center"
field="usageStatusEnum" field="usageStatusEnum"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="decommissionReason" key="decommissionReason"
title="报废原因" :title="$t('inspection.instrument.decommissionReason')"
align="center" align="center"
field="decommissionReason" field="decommissionReason"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="remarks" key="remarks"
title="备注" :title="$t('inspection.instrument.remarks')"
align="center" align="center"
field="remarks" field="remarks"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.instrument.operation')"
align="center" align="center"
width="150" width="150"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -334,7 +334,7 @@
icon="Edit" icon="Edit"
@click="openEditInstrument(scope.row)" @click="openEditInstrument(scope.row)"
> >
编辑 {{ $t('inspection.instrument.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -371,6 +371,8 @@ import instrumentDialog from "./components/instrumentDialog.vue";
import {nextTick} from "vue"; import {nextTick} from "vue";
import {parseTime} from "../../../utils/his.js"; import {parseTime} from "../../../utils/his.js";
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const instrumentList = ref([]); const instrumentList = ref([]);
@@ -454,13 +456,13 @@ function handleStart() {
const startIds = ids.value; const startIds = ids.value;
// selectedData // selectedData
proxy.$modal proxy.$modal
.confirm("是否确定启用数据!") .confirm(t('inspection.instrument.confirmEnable'))
.then(function () { .then(function () {
return editInstrumentStatus(startIds,'启用'); return editInstrumentStatus(startIds,'启用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("启用成功"); proxy.$modal.msgSuccess(t('inspection.instrument.enableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -468,13 +470,13 @@ function handleStart() {
function handleClose() { function handleClose() {
const stopIds = ids.value; const stopIds = ids.value;
proxy.$modal proxy.$modal
.confirm("是否确认停用数据!") .confirm(t('inspection.instrument.confirmDisable'))
.then(function () { .then(function () {
return editInstrumentStatus(stopIds,'停用'); return editInstrumentStatus(stopIds,'停用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("停用成功"); proxy.$modal.msgSuccess(t('inspection.instrument.disableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -503,7 +505,7 @@ function openAddInstrument() {
// if (!currentCategoryEnum.value) { // if (!currentCategoryEnum.value) {
// return proxy.$modal.msgError("请选择器材目录分类"); // return proxy.$modal.msgError("请选择器材目录分类");
// } // }
title.value = "新增"; title.value = t('inspection.instrument.addTitle');
nextTick(() => { nextTick(() => {
proxy.$refs.instrumentRef.show(); proxy.$refs.instrumentRef.show();
}); });
@@ -515,7 +517,7 @@ function openEditInstrument(row) {
getInstrumentOne(row.id).then((response) => { getInstrumentOne(row.id).then((response) => {
console.log(response, "currentDataform"); console.log(response, "currentDataform");
currentData.value = response.data; currentData.value = response.data;
title.value = "编辑"; title.value = t('inspection.instrument.editTitle');
nextTick(() => { nextTick(() => {
proxy.$refs["instrumentRef"].edit(); proxy.$refs["instrumentRef"].edit();
}); });

View File

@@ -1,4 +1,4 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-row :gutter="20"> <el-row :gutter="20">
<!--诊疗目录--> <!--诊疗目录-->
@@ -7,11 +7,11 @@
:xs="24" :xs="24"
> >
<div class="head-title"> <div class="head-title">
检验项目 {{ $t('inspection.lisConfig.testItem') }}
</div> </div>
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码" :placeholder="$t('inspection.lisConfig.nameCodePlaceholder')"
clearable clearable
style="width: 220px" style="width: 220px"
@keyup.enter="getItemList" @keyup.enter="getItemList"
@@ -22,7 +22,7 @@
icon="Search" icon="Search"
@click="getItemPageList()" @click="getItemPageList()"
> >
查询 {{ $t('inspection.lisConfig.query') }}
</el-button> </el-button>
<div> <div>
<vxe-table <vxe-table
@@ -33,7 +33,7 @@
@cell-click="handleRowClick" @cell-click="handleRowClick"
> >
<vxe-column <vxe-column
title="项目名称" :title="$t('inspection.lisConfig.itemName')"
align="left" align="left"
field="name" field="name"
/> />
@@ -63,7 +63,7 @@
icon="Plus" icon="Plus"
@click="handleFormSubmit" @click="handleFormSubmit"
> >
保存配置详情 {{ $t('inspection.lisConfig.saveConfig') }}
</el-button> </el-button>
</el-col> </el-col>
</el-row> </el-row>
@@ -82,7 +82,7 @@
@cell-click="addMaterialsRow" @cell-click="addMaterialsRow"
> >
<vxe-column <vxe-column
title="项目名称" :title="$t('inspection.lisConfig.itemName')"
align="left" align="left"
field="name" field="name"
/> />
@@ -91,7 +91,7 @@
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<el-input <el-input
v-model="query.deviceSearchKey" v-model="query.deviceSearchKey"
placeholder="请输入耗材名称" :placeholder="$t('inspection.lisConfig.consumablePlaceholder')"
style="flex-grow: 1;" style="flex-grow: 1;"
@focus="handleFocus('materials')" @focus="handleFocus('materials')"
@blur="handleBlur('materials')" @blur="handleBlur('materials')"
@@ -103,7 +103,7 @@
style="margin-left: 8px; cursor: pointer;" style="margin-left: 8px; cursor: pointer;"
:disabled="true" :disabled="true"
> >
新增 {{ $t('inspection.lisConfig.add') }}
</el-button> </el-button>
</div> </div>
</template> </template>
@@ -116,12 +116,12 @@
> >
<vxe-column <vxe-column
field="deviceDefinitionName" field="deviceDefinitionName"
title="耗材名称" :title="$t('inspection.lisConfig.consumableName')"
width="200" width="200"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.lisConfig.operation')"
align="center" align="center"
width="400" width="400"
> >
@@ -133,7 +133,7 @@
:disabled="scope.row.id == ''" :disabled="scope.row.id == ''"
@click="deleteMaterial(scope.row)" @click="deleteMaterial(scope.row)"
> >
删除 {{ $t('inspection.lisConfig.delete') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -153,7 +153,7 @@
@cell-click="addSamplesRow" @cell-click="addSamplesRow"
> >
<vxe-column <vxe-column
title="项目名称" :title="$t('inspection.lisConfig.itemName')"
align="left" align="left"
field="specimenName" field="specimenName"
/> />
@@ -162,7 +162,7 @@
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<el-input <el-input
v-model="query.specimenSearchKey" v-model="query.specimenSearchKey"
placeholder="请输入样本名称" :placeholder="$t('inspection.lisConfig.samplePlaceholder')"
style="flex-grow: 1;" style="flex-grow: 1;"
@focus="handleFocus('samples')" @focus="handleFocus('samples')"
@blur="handleBlur('samples')" @blur="handleBlur('samples')"
@@ -174,7 +174,7 @@
style="margin-left: 8px; cursor: pointer;" style="margin-left: 8px; cursor: pointer;"
:disabled="true" :disabled="true"
> >
新增 {{ $t('inspection.lisConfig.add') }}
</el-button> </el-button>
</div> </div>
</template> </template>
@@ -187,37 +187,37 @@
> >
<vxe-column <vxe-column
field="specimenName" field="specimenName"
title="样本名称" :title="$t('inspection.lisConfig.sampleName')"
width="200" width="200"
/> />
<vxe-column <vxe-column
field="specimenVolume" field="specimenVolume"
title="数量" :title="$t('inspection.lisConfig.quantity')"
width="200" width="200"
> >
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model="scope.row.specimenVolume" v-model="scope.row.specimenVolume"
placeholder="请输入数量" :placeholder="$t('inspection.lisConfig.quantityPlaceholder')"
/> />
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="specimenUnit" field="specimenUnit"
title="单位" :title="$t('inspection.lisConfig.unit')"
width="200" width="200"
> >
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model="scope.row.specimenUnit" v-model="scope.row.specimenUnit"
placeholder="请输入单位" :placeholder="$t('inspection.lisConfig.unitPlaceholder')"
/> />
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="操作" :title="$t('inspection.lisConfig.operation')"
align="center" align="center"
width="400" width="400"
> >
@@ -229,7 +229,7 @@
:disabled="scope.row.id == ''" :disabled="scope.row.id == ''"
@click="deleteSample(scope.row)" @click="deleteSample(scope.row)"
> >
删除 {{ $t('inspection.lisConfig.delete') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -248,7 +248,7 @@
@cell-click="addObservationsRow" @cell-click="addObservationsRow"
> >
<vxe-column <vxe-column
title="项目名称" :title="$t('inspection.lisConfig.itemName')"
align="left" align="left"
field="name" field="name"
/> />
@@ -257,7 +257,7 @@
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<el-input <el-input
v-model="query.observationSearchKey" v-model="query.observationSearchKey"
placeholder="请输入观测名称" :placeholder="$t('inspection.lisConfig.observationPlaceholder')"
style="flex-grow: 1;" style="flex-grow: 1;"
@focus="handleFocus('observations')" @focus="handleFocus('observations')"
@blur="handleBlur('observations')" @blur="handleBlur('observations')"
@@ -269,7 +269,7 @@
style="margin-left: 8px; cursor: pointer;" style="margin-left: 8px; cursor: pointer;"
:disabled="true" :disabled="true"
> >
新增 {{ $t('inspection.lisConfig.add') }}
</el-button> </el-button>
</div> </div>
</template> </template>
@@ -283,16 +283,16 @@
> >
<vxe-column <vxe-column
field="observationName" field="observationName"
title="观测名称" :title="$t('inspection.lisConfig.observationName')"
width="200" width="200"
/> />
<vxe-column <vxe-column
field="observationCode" field="observationCode"
title="观测代码" :title="$t('inspection.lisConfig.observationCode')"
width="200" width="200"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.lisConfig.operation')"
align="center" align="center"
width="400" width="400"
> >
@@ -304,7 +304,7 @@
:disabled="scope.row.id == ''" :disabled="scope.row.id == ''"
@click="deleteObservation(scope.row)" @click="deleteObservation(scope.row)"
> >
删除 {{ $t('inspection.lisConfig.delete') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -350,6 +350,8 @@ const data = reactive({
}); });
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { queryParams, form, tableRules, query} = toRefs(data); const { queryParams, form, tableRules, query} = toRefs(data);
/** 获取字典列表 */ /** 获取字典列表 */
@@ -424,7 +426,7 @@ function handleFormSubmit() {
activityDefObservationDefs: observationList.value, activityDefObservationDefs: observationList.value,
}).then((res) => { }).then((res) => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success("保存成功"); ElMessage.success(t('inspection.lisConfig.saveSuccess'));
} }
}); });
@@ -444,7 +446,7 @@ function isDuplicate(id, list,e) {
} }
function addMaterialsRow(row) { function addMaterialsRow(row) {
if (isDuplicate(row.id, materialsList.value,'materials')) { if (isDuplicate(row.id, materialsList.value,'materials')) {
ElMessage.warning("请勿重复添加此材料!"); ElMessage.warning(t('inspection.lisConfig.duplicateMaterial'));
return; return;
} }
let newRow = { deviceDefinitionName: row.name, deviceDefinitionId let newRow = { deviceDefinitionName: row.name, deviceDefinitionId
@@ -454,7 +456,7 @@ function addMaterialsRow(row) {
function addSamplesRow(row) { function addSamplesRow(row) {
if (isDuplicate(row.id, sampleList.value,'samples')) { if (isDuplicate(row.id, sampleList.value,'samples')) {
ElMessage.warning("请勿重复添加此样本!"); ElMessage.warning(t('inspection.lisConfig.duplicateSample'));
return; return;
} }
let newRow = { specimenName: row.specimenName, specimenDefinitionId: row.id }; let newRow = { specimenName: row.specimenName, specimenDefinitionId: row.id };
@@ -462,7 +464,7 @@ function addSamplesRow(row) {
} }
function addObservationsRow(row) { function addObservationsRow(row) {
if (isDuplicate(row.id, observationList.value,'observations')) { if (isDuplicate(row.id, observationList.value,'observations')) {
ElMessage.warning("请勿重复添加此观察项!"); ElMessage.warning(t('inspection.lisConfig.duplicateObservation'));
return; return;
} }
let newRow = { observationName: row.name, observationDefinitionId: row.id }; let newRow = { observationName: row.name, observationDefinitionId: row.id };

View File

@@ -7,7 +7,7 @@
:xs="24" :xs="24"
> >
<div class="head-title"> <div class="head-title">
观测类型 {{ $t('inspection.observation.typeCatalog') }}
</div> </div>
<div class="head-container"> <div class="head-container">
<el-tree <el-tree
@@ -38,13 +38,13 @@
<el-row :gutter="24"> <el-row :gutter="24">
<!-- <el-col :span="6"> --> <!-- <el-col :span="6"> -->
<el-form-item <el-form-item
label="定义名" :label="$t('inspection.observation.definitionName')"
prop="searchKey" prop="searchKey"
label-width="55" label-width="55"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="名称/编码" :placeholder="$t('inspection.observation.nameCodePlaceholder')"
clearable clearable
style="width: 220px" style="width: 220px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -53,7 +53,7 @@
<!-- </el-col> --> <!-- </el-col> -->
<!-- <el-col :span="5"> --> <!-- <el-col :span="5"> -->
<el-form-item <el-form-item
label="状态" :label="$t('inspection.observation.status')"
prop="statusEnum" prop="statusEnum"
label-width="50" label-width="50"
> >
@@ -83,7 +83,7 @@
icon="Plus" icon="Plus"
@click="openAddObservation()" @click="openAddObservation()"
> >
添加 {{ $t('inspection.observation.add') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -94,7 +94,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleClose" @click="handleClose"
> >
停用 {{ $t('inspection.observation.disable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -105,7 +105,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleStart" @click="handleStart"
> >
启用 {{ $t('inspection.observation.enable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -115,7 +115,7 @@
icon="Search" icon="Search"
@click="getList" @click="getList"
> >
查询 {{ $t('inspection.observation.query') }}
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
@@ -143,7 +143,7 @@
<vxe-column <vxe-column
key="name" key="name"
title="观测名称" :title="$t('inspection.observation.observationName')"
align="center" align="center"
field="name" field="name"
show-overflow="title" show-overflow="title"
@@ -151,7 +151,7 @@
<vxe-column <vxe-column
key="code" key="code"
title="观测代码" :title="$t('inspection.observation.observationCode')"
align="center" align="center"
field="code" field="code"
show-overflow="title" show-overflow="title"
@@ -159,7 +159,7 @@
<vxe-column <vxe-column
key="observationTypeEnumText" key="observationTypeEnumText"
title="观测类型" :title="$t('inspection.observation.observationType')"
align="center" align="center"
field="observationTypeEnumText" field="observationTypeEnumText"
show-overflow="title" show-overflow="title"
@@ -167,7 +167,7 @@
<vxe-column <vxe-column
key="referenceRange" key="referenceRange"
title="参考范围" :title="$t('inspection.observation.refRange')"
align="center" align="center"
field="referenceRange" field="referenceRange"
show-overflow="title" show-overflow="title"
@@ -175,7 +175,7 @@
<vxe-column <vxe-column
key="instrumentId_dictText" key="instrumentId_dictText"
title="仪器" :title="$t('inspection.observation.instrument')"
align="center" align="center"
field="instrumentId_dictText" field="instrumentId_dictText"
show-overflow="title" show-overflow="title"
@@ -183,13 +183,13 @@
<vxe-column <vxe-column
key="statusEnumText" key="statusEnumText"
title="状态" :title="$t('inspection.observation.statusCol')"
align="center" align="center"
field="statusEnumText" field="statusEnumText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.observation.operation')"
align="center" align="center"
width="150" width="150"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -202,7 +202,7 @@
icon="Edit" icon="Edit"
@click="openEditObservation(scope.row)" @click="openEditObservation(scope.row)"
> >
编辑 {{ $t('inspection.observation.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -238,6 +238,8 @@ import {
import observationDialog from "./components/observationDialog.vue"; import observationDialog from "./components/observationDialog.vue";
import {nextTick} from "vue"; import {nextTick} from "vue";
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const observationList = ref([]); const observationList = ref([]);
@@ -319,13 +321,13 @@ function handleStart() {
const startIds = ids.value; const startIds = ids.value;
// selectedData // selectedData
proxy.$modal proxy.$modal
.confirm("是否确定启用数据!") .confirm(t('inspection.observation.confirmEnable'))
.then(function () { .then(function () {
return editObservationStatus(startIds,'启用'); return editObservationStatus(startIds,'启用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("启用成功"); proxy.$modal.msgSuccess(t('inspection.observation.enableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -333,13 +335,13 @@ function handleStart() {
function handleClose() { function handleClose() {
const stopIds = ids.value; const stopIds = ids.value;
proxy.$modal proxy.$modal
.confirm("是否确认停用数据!") .confirm(t('inspection.observation.confirmDisable'))
.then(function () { .then(function () {
return editObservationStatus(stopIds,'停用'); return editObservationStatus(stopIds,'停用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("停用成功"); proxy.$modal.msgSuccess(t('inspection.observation.disableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -368,7 +370,7 @@ function openAddObservation() {
// if (!currentCategoryEnum.value) { // if (!currentCategoryEnum.value) {
// return proxy.$modal.msgError("请选择器材目录分类"); // return proxy.$modal.msgError("请选择器材目录分类");
// } // }
title.value = "新增"; title.value = t('inspection.observation.addTitle');
nextTick(() => { nextTick(() => {
proxy.$refs.observationRef.show(); proxy.$refs.observationRef.show();
}); });
@@ -380,7 +382,7 @@ function openEditObservation(row) {
getObservationOne(row.id).then((response) => { getObservationOne(row.id).then((response) => {
console.log(response, "currentDataform"); console.log(response, "currentDataform");
currentData.value = response.data; currentData.value = response.data;
title.value = "编辑"; title.value = t('inspection.observation.editTitle');
nextTick(() => { nextTick(() => {
proxy.$refs["observationRef"].edit(); proxy.$refs["observationRef"].edit();
}); });

View File

@@ -8,19 +8,19 @@
label-width="68px" label-width="68px"
> >
<el-form-item <el-form-item
label="数据查询" :label="$t('inspection.report.dataQuery')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="患者姓名/项目名称" :placeholder="$t('inspection.report.patientOrItemPlaceholder')"
clearable clearable
style="width: 240px" style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="创建时间" :label="$t('inspection.report.createTime')"
style="width: 308px;" style="width: 308px;"
> >
<el-date-picker <el-date-picker
@@ -28,8 +28,8 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
type="daterange" type="daterange"
range-separator="-" range-separator="-"
start-placeholder="开始日期" :start-placeholder="$t('inspection.report.startDate')"
end-placeholder="结束日期" :end-placeholder="$t('inspection.report.endDate')"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -38,13 +38,13 @@
icon="Search" icon="Search"
@click="handleQuery" @click="handleQuery"
> >
搜索 {{ $t('inspection.report.search') }}
</el-button> </el-button>
<el-button <el-button
icon="Refresh" icon="Refresh"
@click="resetQuery" @click="resetQuery"
> >
重置 {{ $t('inspection.report.reset') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -90,27 +90,27 @@
> >
<vxe-column <vxe-column
field="observationName" field="observationName"
title="名称" :title="$t('inspection.report.name')"
/> />
<vxe-column <vxe-column
field="observationResult" field="observationResult"
title="结果" :title="$t('inspection.report.result')"
/> />
<vxe-column <vxe-column
field="specimenName" field="specimenName"
title="样本" :title="$t('inspection.report.sample')"
/> />
<vxe-column <vxe-column
field="referenceRange" field="referenceRange"
title="参考范围" :title="$t('inspection.report.refRange')"
/> />
<vxe-column <vxe-column
field="receivedDate" field="receivedDate"
title="观测人" :title="$t('inspection.report.observer')"
/> />
<vxe-column <vxe-column
field="observationDate" field="observationDate"
title="观测时间" :title="$t('inspection.report.observationTime')"
/> />
</vxe-table> </vxe-table>
</template> </template>
@@ -118,31 +118,31 @@
<!-- 母表列 --> <!-- 母表列 -->
<vxe-column <vxe-column
field="chargeName" field="chargeName"
title="项目名称" :title="$t('inspection.report.itemName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="patientName" field="patientName"
title="患者姓名" :title="$t('inspection.report.patientName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="genderEnumText" field="genderEnumText"
title="性别" :title="$t('inspection.report.gender')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="doctorName" field="doctorName"
title="开单医生" :title="$t('inspection.report.orderingDoctor')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="authoredTime" field="authoredTime"
title="开单时间" :title="$t('inspection.report.orderingTime')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.report.operation')"
width="120" width="120"
fixed="right" fixed="right"
> >
@@ -152,7 +152,7 @@
size="mini" size="mini"
@click="printReport(scope.row)" @click="printReport(scope.row)"
> >
打印报告 {{ $t('inspection.report.printReport') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -173,6 +173,8 @@ import {reportList, reports} from "./components/report.js";
import {formatDateStr} from "@/utils/index.js"; import {formatDateStr} from "@/utils/index.js";
import { getCurrentInstance, toRefs } from 'vue'; import { getCurrentInstance, toRefs } from 'vue';
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dataList = ref([]); const dataList = ref([]);

View File

@@ -8,19 +8,19 @@
label-width="68px" label-width="68px"
> >
<el-form-item <el-form-item
label="数据查询" :label="$t('inspection.sampleCollection.dataQuery')"
prop="searchKey" prop="searchKey"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="患者姓名/项目名称" :placeholder="$t('inspection.sampleCollection.patientOrItemPlaceholder')"
clearable clearable
style="width: 240px" style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="创建时间" :label="$t('inspection.sampleCollection.createTime')"
style="width: 308px;" style="width: 308px;"
> >
<el-date-picker <el-date-picker
@@ -28,8 +28,8 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
type="daterange" type="daterange"
range-separator="-" range-separator="-"
start-placeholder="开始日期" :start-placeholder="$t('inspection.sampleCollection.startDate')"
end-placeholder="结束日期" :end-placeholder="$t('inspection.sampleCollection.endDate')"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -38,13 +38,13 @@
icon="Search" icon="Search"
@click="handleQuery" @click="handleQuery"
> >
搜索 {{ $t('inspection.sampleCollection.search') }}
</el-button> </el-button>
<el-button <el-button
icon="Refresh" icon="Refresh"
@click="resetQuery" @click="resetQuery"
> >
重置 {{ $t('inspection.sampleCollection.reset') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -61,7 +61,7 @@
:disabled="collect" :disabled="collect"
@click="handleCollect('已采集')" @click="handleCollect('已采集')"
> >
采集 {{ $t('inspection.sampleCollection.collect') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -72,7 +72,7 @@
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
> >
合管 {{ $t('inspection.sampleCollection.mergeTube') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -83,7 +83,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleCollect('待采集')" @click="handleCollect('待采集')"
> >
取消 {{ $t('inspection.sampleCollection.cancel') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -94,7 +94,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
> >
打印条码 {{ $t('inspection.sampleCollection.printBarcode') }}
</el-button> </el-button>
</el-col> </el-col>
<right-toolbar <right-toolbar
@@ -132,11 +132,11 @@
/> />
<vxe-column <vxe-column
field="specimenName" field="specimenName"
title="样本名称" :title="$t('inspection.sampleCollection.sampleName')"
/> />
<vxe-column <vxe-column
field="specimenVolume" field="specimenVolume"
title="样本数量" :title="$t('inspection.sampleCollection.sampleVolume')"
> >
<template #default="innerProps"> <template #default="innerProps">
{{ innerProps.row.specimenVolume }} {{ innerProps.row.specimenUnit }} {{ innerProps.row.specimenVolume }} {{ innerProps.row.specimenUnit }}
@@ -144,26 +144,26 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="collectionStatusEnumText" field="collectionStatusEnumText"
title="采集状态" :title="$t('inspection.sampleCollection.collectionStatus')"
> >
<template #default="nerProp"> <template #default="nerProp">
<span <span
v-if="nerProp.row.collectionStatusEnum == 1" v-if="nerProp.row.collectionStatusEnum == 1"
style="color:green" style="color:green"
> >
已采集 {{ $t('inspection.sampleCollection.collected') }}
</span> </span>
<span <span
v-else-if="nerProp.row.collectionStatusEnum == 0" v-else-if="nerProp.row.collectionStatusEnum == 0"
style="color:orange" style="color:orange"
> >
待采集 {{ $t('inspection.sampleCollection.pendingCollection') }}
</span> </span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="collectionDate" field="collectionDate"
title="采集时间" :title="$t('inspection.sampleCollection.collectionTime')"
/> />
</vxe-table> </vxe-table>
</template> </template>
@@ -171,45 +171,45 @@
<!-- 母表列 --> <!-- 母表列 -->
<vxe-column <vxe-column
field="chargeName" field="chargeName"
title="项目名称" :title="$t('inspection.sampleCollection.itemName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="patientName" field="patientName"
title="患者姓名" :title="$t('inspection.sampleCollection.patientName')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="genderEnumText" field="genderEnumText"
title="性别" :title="$t('inspection.sampleCollection.gender')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
title="样本状态" :title="$t('inspection.sampleCollection.sampleStatus')"
> >
<template #default="sprops"> <template #default="sprops">
<span <span
v-if="hasPendingCollection(sprops.row.children)" v-if="hasPendingCollection(sprops.row.children)"
style="color:orange" style="color:orange"
> >
待采集 {{ $t('inspection.sampleCollection.pendingCollect') }}
</span> </span>
<span <span
v-else v-else
style="color:green" style="color:green"
> >
已采集 {{ $t('inspection.sampleCollection.collectedStatus') }}
</span> </span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="doctorName" field="doctorName"
title="开单医生" :title="$t('inspection.sampleCollection.orderingDoctor')"
:sortable="true" :sortable="true"
/> />
<vxe-column <vxe-column
field="authoredTime" field="authoredTime"
title="开单时间" :title="$t('inspection.sampleCollection.orderingTime')"
:sortable="true" :sortable="true"
/> />
</vxe-table> </vxe-table>
@@ -228,6 +228,8 @@
import {collectionList, editStatus} from "./components/collect.js"; import {collectionList, editStatus} from "./components/collect.js";
import {formatDateStr} from "@/utils/index.js"; import {formatDateStr} from "@/utils/index.js";
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dataList = ref([]); const dataList = ref([]);
@@ -299,7 +301,7 @@ function handleSelectionChange(selection) {
function handleCollect(type) { function handleCollect(type) {
editStatus(ids.value,type).then(()=>{ editStatus(ids.value,type).then(()=>{
proxy.$modal.msgSuccess("操作成功"); proxy.$modal.msgSuccess(t('inspection.sampleCollection.operationSuccess'));
getList(); getList();
}) })
} }

View File

@@ -7,7 +7,7 @@
:xs="24" :xs="24"
> >
<div class="head-title"> <div class="head-title">
样本类型目录 {{ $t('inspection.sampleType.typeCatalog') }}
</div> </div>
<div class="head-container"> <div class="head-container">
<el-tree <el-tree
@@ -38,13 +38,13 @@
<el-row :gutter="24"> <el-row :gutter="24">
<!-- <el-col :span="6"> --> <!-- <el-col :span="6"> -->
<el-form-item <el-form-item
label="样本名" :label="$t('inspection.sampleType.sampleName')"
prop="searchKey" prop="searchKey"
label-width="55" label-width="55"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="品名/商品名/英文品名/编码/拼音" :placeholder="$t('inspection.sampleType.nameCodePlaceholder')"
clearable clearable
style="width: 220px" style="width: 220px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -53,7 +53,7 @@
<!-- </el-col> --> <!-- </el-col> -->
<!-- <el-col :span="5"> --> <!-- <el-col :span="5"> -->
<el-form-item <el-form-item
label="状态" :label="$t('inspection.sampleType.status')"
prop="statusEnum" prop="statusEnum"
label-width="50" label-width="50"
> >
@@ -83,7 +83,7 @@
icon="Plus" icon="Plus"
@click="openAddSpecimen()" @click="openAddSpecimen()"
> >
添加新样本 {{ $t('inspection.sampleType.addNewSample') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -94,7 +94,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleClose" @click="handleClose"
> >
停用 {{ $t('inspection.sampleType.disable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -105,7 +105,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleStart" @click="handleStart"
> >
启用 {{ $t('inspection.sampleType.enable') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -115,7 +115,7 @@
icon="Search" icon="Search"
@click="getList" @click="getList"
> >
查询 {{ $t('inspection.sampleType.query') }}
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
@@ -142,97 +142,97 @@
/> />
<vxe-column <vxe-column
key="specimenTypeEnumText" key="specimenTypeEnumText"
title="样本类型" :title="$t('inspection.sampleType.sampleType')"
align="center" align="center"
field="specimenTypeEnumText" field="specimenTypeEnumText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="specimenName" key="specimenName"
title="样本名称" :title="$t('inspection.sampleType.sampleNameCol')"
align="center" align="center"
field="specimenName" field="specimenName"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="customCode" key="customCode"
title="自定义码" :title="$t('inspection.sampleType.customCode')"
align="center" align="center"
field="customCode" field="customCode"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="typeOrder" key="typeOrder"
title="类型顺序" :title="$t('inspection.sampleType.typeOrder')"
align="center" align="center"
field="typeOrder" field="typeOrder"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="externalCode" key="externalCode"
title="外部代码" :title="$t('inspection.sampleType.externalCode')"
align="center" align="center"
field="externalCode" field="externalCode"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="serialNumber" key="serialNumber"
title="序号" :title="$t('inspection.sampleType.serialNumber')"
align="center" align="center"
field="serialNumber" field="serialNumber"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="globalType" key="globalType"
title="全网型" :title="$t('inspection.sampleType.globalType')"
align="center" align="center"
field="globalType" field="globalType"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="pyStr" key="pyStr"
title="拼音" :title="$t('inspection.sampleType.pinyin')"
align="center" align="center"
field="pyStr" field="pyStr"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="wbStr" key="wbStr"
title="五笔" :title="$t('inspection.sampleType.wubi')"
align="center" align="center"
field="wbStr" field="wbStr"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="specimenClass" key="specimenClass"
title="样本类" :title="$t('inspection.sampleType.specimenClass')"
align="center" align="center"
field="specimenClass" field="specimenClass"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="extendedType" key="extendedType"
title="扩展类型" :title="$t('inspection.sampleType.extendedType')"
align="center" align="center"
field="extendedType" field="extendedType"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="whonetCode" key="whonetCode"
title="WHONET代码" :title="$t('inspection.sampleType.whonetCode')"
align="center" align="center"
field="whonetCode" field="whonetCode"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="statusEnumText" key="statusEnumText"
title="状态" :title="$t('inspection.sampleType.statusCol')"
align="center" align="center"
field="statusEnumText" field="statusEnumText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
title="操作" :title="$t('inspection.sampleType.operation')"
align="center" align="center"
width="150" width="150"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -245,7 +245,7 @@
icon="Edit" icon="Edit"
@click="openEditSpecimen(scope.row)" @click="openEditSpecimen(scope.row)"
> >
编辑 {{ $t('inspection.sampleType.edit') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -275,6 +275,8 @@ import {editSpecimenStatus, getSpecimenInit, getSpecimenList, getSpecimenOne,} f
import specimenDialog from "./components/specimenDialog.vue"; import specimenDialog from "./components/specimenDialog.vue";
import {nextTick} from "vue"; import {nextTick} from "vue";
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const specimenList = ref([]); const specimenList = ref([]);
@@ -359,13 +361,13 @@ function handleStart() {
const startIds = ids.value; const startIds = ids.value;
// selectedData // selectedData
proxy.$modal proxy.$modal
.confirm("是否确定启用数据!") .confirm(t('inspection.sampleType.confirmEnable'))
.then(function () { .then(function () {
return editSpecimenStatus(startIds,'启用'); return editSpecimenStatus(startIds,'启用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("启用成功"); proxy.$modal.msgSuccess(t('inspection.sampleType.enableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -373,13 +375,13 @@ function handleStart() {
function handleClose() { function handleClose() {
const stopIds = ids.value; const stopIds = ids.value;
proxy.$modal proxy.$modal
.confirm("是否确认停用数据!") .confirm(t('inspection.sampleType.confirmDisable'))
.then(function () { .then(function () {
return editSpecimenStatus(stopIds,'停用'); return editSpecimenStatus(stopIds,'停用');
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess("停用成功"); proxy.$modal.msgSuccess(t('inspection.sampleType.disableSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -408,7 +410,7 @@ function openAddSpecimen() {
// if (!currentCategoryEnum.value) { // if (!currentCategoryEnum.value) {
// return proxy.$modal.msgError("请选择器材目录分类"); // return proxy.$modal.msgError("请选择器材目录分类");
// } // }
title.value = "新增"; title.value = t('inspection.sampleType.addTitle');
nextTick(() => { nextTick(() => {
proxy.$refs.specimenRef.show(); proxy.$refs.specimenRef.show();
}); });
@@ -420,7 +422,7 @@ function openEditSpecimen(row) {
getSpecimenOne(row.id).then((response) => { getSpecimenOne(row.id).then((response) => {
console.log(response, "currentDataform"); console.log(response, "currentDataform");
currentData.value = response.data; currentData.value = response.data;
title.value = "编辑"; title.value = t('inspection.sampleType.editTitle');
nextTick(() => { nextTick(() => {
proxy.$refs["specimenRef"].edit(); proxy.$refs["specimenRef"].edit();
}); });

View File

@@ -1,29 +1,29 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px;display:flex;align-items:center;gap:16px"> <div style="margin-bottom:16px;display:flex;align-items:center;gap:16px">
<span style="font-size:18px;font-weight:bold">室间质评管理</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.eqa.title') }}</span>
<el-tag v-if="stats.total" type="info"> {{ stats.total }} </el-tag> <el-tag v-if="stats.total" type="info">{{ $t('lab.eqa.totalRecords', { n: stats.total }) }}</el-tag>
<el-tag v-if="stats.qualified" type="success">合格 {{ stats.qualified }}</el-tag> <el-tag v-if="stats.qualified" type="success">{{ $t('lab.eqa.qualified', { n: stats.qualified }) }}</el-tag>
<el-tag v-if="stats.unqualified" type="danger">不合格 {{ stats.unqualified }}</el-tag> <el-tag v-if="stats.unqualified" type="danger">{{ $t('lab.eqa.unqualified', { n: stats.unqualified }) }}</el-tag>
</div> </div>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="8"> <el-col :span="8">
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<span>录入室间质评</span> <span>{{ $t('lab.eqa.inputTitle') }}</span>
</template> </template>
<el-form :model="form" label-width="90px" size="default"> <el-form :model="form" label-width="90px" size="default">
<el-form-item label="评批名称"> <el-form-item :label="$t('lab.eqa.assessmentName')">
<el-input v-model="form.assessmentName" placeholder="2026年Q1生化" /> <el-input v-model="form.assessmentName" :placeholder="$t('lab.eqa.assessmentNamePlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item label="组织机构"> <el-form-item :label="$t('lab.eqa.assessmentOrg')">
<el-input v-model="form.assessmentOrg" /> <el-input v-model="form.assessmentOrg" />
</el-form-item> </el-form-item>
<el-form-item label="年度"> <el-form-item :label="$t('lab.eqa.year')">
<el-input-number v-model="form.assessmentYear" :min="2020" :max="2030" style="width:100%" /> <el-input-number v-model="form.assessmentYear" :min="2020" :max="2030" style="width:100%" />
</el-form-item> </el-form-item>
<el-form-item label="季度"> <el-form-item :label="$t('lab.eqa.quarter')">
<el-select v-model="form.assessmentQuarter" style="width:100%"> <el-select v-model="form.assessmentQuarter" style="width:100%">
<el-option label="Q1" :value="1" /> <el-option label="Q1" :value="1" />
<el-option label="Q2" :value="2" /> <el-option label="Q2" :value="2" />
@@ -31,23 +31,23 @@
<el-option label="Q4" :value="4" /> <el-option label="Q4" :value="4" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="样本编号"> <el-form-item :label="$t('lab.eqa.sampleCode')">
<el-input v-model="form.sampleCode" /> <el-input v-model="form.sampleCode" />
</el-form-item> </el-form-item>
<el-form-item label="检测项目"> <el-form-item :label="$t('lab.eqa.testItem')">
<el-input v-model="form.testItem" /> <el-input v-model="form.testItem" />
</el-form-item> </el-form-item>
<el-form-item label="靶值"> <el-form-item :label="$t('lab.eqa.targetValue')">
<el-input v-model="form.targetValue" /> <el-input v-model="form.targetValue" />
</el-form-item> </el-form-item>
<el-form-item label="实测值"> <el-form-item :label="$t('lab.eqa.actualValue')">
<el-input v-model="form.actualValue" /> <el-input v-model="form.actualValue" />
</el-form-item> </el-form-item>
<el-form-item label="操作人"> <el-form-item :label="$t('lab.eqa.operator')">
<el-input v-model="form.operatorName" /> <el-input v-model="form.operatorName" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitRecord" :loading="loading">提交</el-button> <el-button type="primary" @click="submitRecord" :loading="loading">{{ $t('lab.eqa.submit') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -56,30 +56,30 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<div style="display:flex;justify-content:space-between;align-items:center"> <div style="display:flex;justify-content:space-between;align-items:center">
<span>室间质评结果</span> <span>{{ $t('lab.eqa.resultTitle') }}</span>
<div style="display:flex;gap:8px"> <div style="display:flex;gap:8px">
<el-input v-model="query.assessmentName" placeholder="评批名称" clearable style="width:160px" /> <el-input v-model="query.assessmentName" :placeholder="$t('lab.eqa.queryPlaceholder')" clearable style="width:160px" />
<el-button type="primary" @click="loadResults">查询</el-button> <el-button type="primary" @click="loadResults">{{ $t('lab.eqa.query') }}</el-button>
<el-button type="success" @click="printReport">打印报告单</el-button> <el-button type="success" @click="printReport">{{ $t('lab.eqa.printReport') }}</el-button>
</div> </div>
</div> </div>
</template> </template>
<el-table :data="tableData" border stripe size="small" ref="tableRef"> <el-table :data="tableData" border stripe size="small" ref="tableRef">
<el-table-column prop="assessmentName" label="评批名称" width="150" /> <el-table-column prop="assessmentName" :label="$t('lab.eqa.assessmentName')" width="150" />
<el-table-column prop="assessmentOrg" label="组织机构" width="120" /> <el-table-column prop="assessmentOrg" :label="$t('lab.eqa.assessmentOrg')" width="120" />
<el-table-column prop="assessmentYear" label="年度" width="70" /> <el-table-column prop="assessmentYear" :label="$t('lab.eqa.year')" width="70" />
<el-table-column prop="assessmentQuarter" label="季度" width="60" /> <el-table-column prop="assessmentQuarter" :label="$t('lab.eqa.quarter')" width="60" />
<el-table-column prop="sampleCode" label="样本编号" width="100" /> <el-table-column prop="sampleCode" :label="$t('lab.eqa.sampleCode')" width="100" />
<el-table-column prop="testItem" label="检测项目" width="100" /> <el-table-column prop="testItem" :label="$t('lab.eqa.testItem')" width="100" />
<el-table-column prop="targetValue" label="靶值" width="90" /> <el-table-column prop="targetValue" :label="$t('lab.eqa.targetValue')" width="90" />
<el-table-column prop="actualValue" label="实测值" width="90" /> <el-table-column prop="actualValue" :label="$t('lab.eqa.actualValue')" width="90" />
<el-table-column prop="deviationRate" label="偏差率%" width="80" /> <el-table-column prop="deviationRate" :label="$t('lab.eqa.deviationRate')" width="80" />
<el-table-column prop="result" label="判定" width="80"> <el-table-column prop="result" :label="$t('lab.eqa.judgment')" width="80">
<template #default="{row}"> <template #default="{row}">
<el-tag :type="row.result === '合格' ? 'success' : 'danger'" size="small">{{ row.result }}</el-tag> <el-tag :type="row.result === '合格' ? 'success' : 'danger'" size="small">{{ row.result }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="operatorName" label="操作人" width="80" /> <el-table-column prop="operatorName" :label="$t('lab.eqa.operator')" width="80" />
</el-table> </el-table>
<el-pagination <el-pagination
v-model:current-page="query.pageNo" v-model:current-page="query.pageNo"
@@ -95,23 +95,23 @@
<div id="printArea" ref="printRef" style="display:none"> <div id="printArea" ref="printRef" style="display:none">
<div style="padding:20px;font-family:SimSun;font-size:12px"> <div style="padding:20px;font-family:SimSun;font-size:12px">
<div style="text-align:center;font-size:16px;font-weight:bold;margin-bottom:16px">室间质评报告单</div> <div style="text-align:center;font-size:16px;font-weight:bold;margin-bottom:16px">{{ $t('lab.eqa.reportTitle') }}</div>
<div style="display:flex;justify-content:space-between;margin-bottom:8px"> <div style="display:flex;justify-content:space-between;margin-bottom:8px">
<span>评批名称{{ form.assessmentName || '-' }}</span> <span>{{ $t('lab.eqa.assessmentName') }}{{ form.assessmentName || '-' }}</span>
<span>组织机构{{ form.assessmentOrg || '-' }}</span> <span>{{ $t('lab.eqa.assessmentOrg') }}{{ form.assessmentOrg || '-' }}</span>
</div> </div>
<div style="display:flex;justify-content:space-between;margin-bottom:12px"> <div style="display:flex;justify-content:space-between;margin-bottom:12px">
<span>年度/季度{{ form.assessmentYear || '-' }} Q{{ form.assessmentQuarter || '-' }}</span> <span>{{ $t('lab.eqa.yearQuarter') }}{{ form.assessmentYear || '-' }} Q{{ form.assessmentQuarter || '-' }}</span>
<span>样本编号{{ form.sampleCode || '-' }}</span> <span>{{ $t('lab.eqa.sampleCode') }}{{ form.sampleCode || '-' }}</span>
</div> </div>
<table style="width:100%;border-collapse:collapse;border:1px solid #000"> <table style="width:100%;border-collapse:collapse;border:1px solid #000">
<thead> <thead>
<tr style="background:#f0f0f0"> <tr style="background:#f0f0f0">
<th style="border:1px solid #000;padding:4px">检测项目</th> <th style="border:1px solid #000;padding:4px">{{ $t('lab.eqa.testItem') }}</th>
<th style="border:1px solid #000;padding:4px">靶值</th> <th style="border:1px solid #000;padding:4px">{{ $t('lab.eqa.targetValue') }}</th>
<th style="border:1px solid #000;padding:4px">实测值</th> <th style="border:1px solid #000;padding:4px">{{ $t('lab.eqa.actualValue') }}</th>
<th style="border:1px solid #000;padding:4px">偏差率%</th> <th style="border:1px solid #000;padding:4px">{{ $t('lab.eqa.deviationRate') }}</th>
<th style="border:1px solid #000;padding:4px">判定</th> <th style="border:1px solid #000;padding:4px">{{ $t('lab.eqa.judgment') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -125,8 +125,8 @@
</tbody> </tbody>
</table> </table>
<div style="margin-top:16px;display:flex;justify-content:space-between"> <div style="margin-top:16px;display:flex;justify-content:space-between">
<span>操作人{{ form.operatorName || '-' }}</span> <span>{{ $t('lab.eqa.operator') }}{{ form.operatorName || '-' }}</span>
<span>报告日期{{ new Date().toLocaleDateString() }}</span> <span>{{ $t('lab.eqa.reportDate') }}{{ new Date().toLocaleDateString() }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -135,6 +135,8 @@
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { recordEqa, getEqaResults, getEqaStats } from '@/api/lab/labEqa' import { recordEqa, getEqaResults, getEqaStats } from '@/api/lab/labEqa'
@@ -166,18 +168,18 @@ const loadStats = async () => {
const submitRecord = async () => { const submitRecord = async () => {
if (!form.value.assessmentName || !form.value.testItem) { if (!form.value.assessmentName || !form.value.testItem) {
ElMessage.warning('请填写评批名称和检测项目') ElMessage.warning(t('lab.eqa.pleaseFillRequired'))
return return
} }
loading.value = true loading.value = true
try { try {
const r = await recordEqa(form.value) const r = await recordEqa(form.value)
if (r.data?.result === '合格') { if (r.data?.result === '合格') {
ElMessage.success('提交成功,判定: 合格') ElMessage.success(t('lab.eqa.submitSuccessQualified'))
} else if (r.data?.result === '不合格') { } else if (r.data?.result === '不合格') {
ElMessage.warning('提交成功,判定: 不合格') ElMessage.warning(t('lab.eqa.submitSuccessUnqualified'))
} else { } else {
ElMessage.success('提交成功') ElMessage.success(t('lab.eqa.submitSuccess'))
} }
form.value = defaultForm() form.value = defaultForm()
await loadResults() await loadResults()
@@ -189,12 +191,12 @@ const submitRecord = async () => {
const printReport = () => { const printReport = () => {
if (tableData.value.length === 0) { if (tableData.value.length === 0) {
ElMessage.warning('暂无数据可打印') ElMessage.warning(t('lab.eqa.noDataToPrint'))
return return
} }
const printContent = printRef.value.innerHTML const printContent = printRef.value.innerHTML
const win = window.open('', '_blank') const win = window.open('', '_blank')
win.document.write(`<html><head><title>室间质评报告单</title></head><body>${printContent}</body></html>`) win.document.write(`<html><head><title>{{ $t('lab.eqa.reportTitle') }}</title></head><body>${printContent}</body></html>`)
win.document.close() win.document.close()
win.print() win.print()
} }

View File

@@ -1,42 +1,42 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px;display:flex;align-items:center;gap:16px"> <div style="margin-bottom:16px;display:flex;align-items:center;gap:16px">
<span style="font-size:18px;font-weight:bold">室内质控管理</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.qc.title') }}</span>
<el-tag v-if="stats.total" type="info"> {{ stats.total }} </el-tag> <el-tag v-if="stats.total" type="info">{{ $t('lab.qc.totalRecords', { n: stats.total }) }}</el-tag>
<el-tag v-if="stats.passed" type="success">合格 {{ stats.passed }}</el-tag> <el-tag v-if="stats.passed" type="success">{{ $t('lab.qc.passed', { n: stats.passed }) }}</el-tag>
<el-tag v-if="stats.failed" type="danger">失控 {{ stats.failed }}</el-tag> <el-tag v-if="stats.failed" type="danger">{{ $t('lab.qc.failed', { n: stats.failed }) }}</el-tag>
</div> </div>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="8"> <el-col :span="8">
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<span>录入质控数据</span> <span>{{ $t('lab.qc.inputTitle') }}</span>
</template> </template>
<el-form :model="form" label-width="80px" size="default"> <el-form :model="form" label-width="80px" size="default">
<el-form-item label="质控项目"> <el-form-item :label="$t('lab.qc.qcItem')">
<el-input v-model="form.qcItem" placeholder="ALT, GLU" /> <el-input v-model="form.qcItem" :placeholder="$t('lab.qc.qcItemPlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item label="仪器"> <el-form-item :label="$t('lab.qc.instrument')">
<el-input v-model="form.instrumentName" placeholder="仪器名称" /> <el-input v-model="form.instrumentName" :placeholder="$t('lab.qc.instrumentPlaceholder')" />
</el-form-item> </el-form-item>
<el-form-item label="靶值"> <el-form-item :label="$t('lab.qc.targetValue')">
<el-input-number v-model="form.targetValue" :precision="4" :step="0.1" style="width:100%" /> <el-input-number v-model="form.targetValue" :precision="4" :step="0.1" style="width:100%" />
</el-form-item> </el-form-item>
<el-form-item label="实测值"> <el-form-item :label="$t('lab.qc.actualValue')">
<el-input-number v-model="form.actualValue" :precision="4" :step="0.1" style="width:100%" /> <el-input-number v-model="form.actualValue" :precision="4" :step="0.1" style="width:100%" />
</el-form-item> </el-form-item>
<el-form-item label="检测日期"> <el-form-item :label="$t('lab.qc.qcDate')">
<el-date-picker v-model="form.qcDate" type="date" value-format="YYYY-MM-DD" style="width:100%" /> <el-date-picker v-model="form.qcDate" type="date" value-format="YYYY-MM-DD" style="width:100%" />
</el-form-item> </el-form-item>
<el-form-item label="操作人"> <el-form-item :label="$t('lab.qc.operator')">
<el-input v-model="form.operatorName" /> <el-input v-model="form.operatorName" />
</el-form-item> </el-form-item>
<el-form-item label="备注"> <el-form-item :label="$t('lab.qc.remarks')">
<el-input v-model="form.remarks" type="textarea" :rows="2" /> <el-input v-model="form.remarks" type="textarea" :rows="2" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="doRunWestgard" :loading="loading">执行Westgard判断</el-button> <el-button type="primary" @click="doRunWestgard" :loading="loading">{{ $t('lab.qc.runWestgard') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -45,14 +45,14 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<div style="display:flex;justify-content:space-between;align-items:center"> <div style="display:flex;justify-content:space-between;align-items:center">
<span>质控图</span> <span>{{ $t('lab.qc.chartTitle') }}</span>
<div style="display:flex;gap:8px"> <div style="display:flex;gap:8px">
<el-input v-model="query.qcItem" placeholder="质控项目" clearable style="width:140px" /> <el-input v-model="query.qcItem" :placeholder="$t('lab.qc.queryItemPlaceholder')" clearable style="width:140px" />
<el-select v-model="query.isPass" placeholder="结果" clearable style="width:100px"> <el-select v-model="query.isPass" :placeholder="$t('lab.qc.resultFilter')" clearable style="width:100px">
<el-option label="通过" :value="true" /> <el-option :label="$t('lab.qc.pass')" :value="true" />
<el-option label="失控" :value="false" /> <el-option :label="$t('lab.qc.outOfControl')" :value="false" />
</el-select> </el-select>
<el-button type="primary" @click="loadResults">查询</el-button> <el-button type="primary" @click="loadResults">{{ $t('lab.qc.query') }}</el-button>
</div> </div>
</div> </div>
</template> </template>
@@ -60,22 +60,22 @@
</el-card> </el-card>
<el-card shadow="never" style="margin-top:12px"> <el-card shadow="never" style="margin-top:12px">
<template #header> <template #header>
<span>质控结果列表</span> <span>{{ $t('lab.qc.resultListTitle') }}</span>
</template> </template>
<el-table :data="tableData" border stripe size="small"> <el-table :data="tableData" border stripe size="small">
<el-table-column prop="qcItem" label="质控项目" width="120" /> <el-table-column prop="qcItem" :label="$t('lab.qc.qcItem')" width="120" />
<el-table-column prop="instrumentName" label="仪器" width="120" /> <el-table-column prop="instrumentName" :label="$t('lab.qc.instrument')" width="120" />
<el-table-column prop="targetValue" label="靶值" width="90" /> <el-table-column prop="targetValue" :label="$t('lab.qc.targetValue')" width="90" />
<el-table-column prop="actualValue" label="实测值" width="90" /> <el-table-column prop="actualValue" :label="$t('lab.qc.actualValue')" width="90" />
<el-table-column prop="sdValue" label="SD" width="80" /> <el-table-column prop="sdValue" :label="$t('lab.qc.sdValue')" width="80" />
<el-table-column prop="cvRate" label="CV%" width="80" /> <el-table-column prop="cvRate" :label="$t('lab.qc.cvRate')" width="80" />
<el-table-column prop="westgardRule" label="Westgard判定" width="180"> <el-table-column prop="westgardRule" :label="$t('lab.qc.westgardRule')" width="180">
<template #default="{row}"> <template #default="{row}">
<el-tag :type="row.isPass ? 'success' : 'danger'" size="small">{{ row.westgardRule }}</el-tag> <el-tag :type="row.isPass ? 'success' : 'danger'" size="small">{{ row.westgardRule }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="qcDate" label="日期" width="110" /> <el-table-column prop="qcDate" :label="$t('lab.qc.date')" width="110" />
<el-table-column prop="operatorName" label="操作人" width="80" /> <el-table-column prop="operatorName" :label="$t('lab.qc.operator')" width="80" />
</el-table> </el-table>
<el-pagination <el-pagination
v-model:current-page="query.pageNo" v-model:current-page="query.pageNo"
@@ -93,6 +93,8 @@
<script setup> <script setup>
import { ref, onMounted, nextTick, onUnmounted } from 'vue' import { ref, onMounted, nextTick, onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { runWestgard as runWestgardApi, getQcResults, getQcStats } from '@/api/lab/labQc' import { runWestgard as runWestgardApi, getQcResults, getQcStats } from '@/api/lab/labQc'
@@ -127,16 +129,16 @@ const loadStats = async () => {
const doRunWestgard = async () => { const doRunWestgard = async () => {
if (!form.value.qcItem || !form.value.actualValue) { if (!form.value.qcItem || !form.value.actualValue) {
ElMessage.warning('请填写质控项目和实测值') ElMessage.warning(t('lab.qc.pleaseFillRequired'))
return return
} }
loading.value = true loading.value = true
try { try {
const res = await runWestgardApi(form.value) const res = await runWestgardApi(form.value)
if (res.data?.isPass) { if (res.data?.isPass) {
ElMessage.success('Westgard判定: ' + res.data.westgardRule) ElMessage.success(t('lab.qc.westgardPass') + res.data.westgardRule)
} else { } else {
ElMessage.error('Westgard判定: ' + res.data.westgardRule) ElMessage.error(t('lab.qc.westgardFail') + res.data.westgardRule)
} }
form.value = defaultForm() form.value = defaultForm()
await loadResults() await loadResults()
@@ -162,13 +164,13 @@ const renderChart = () => {
chartInstance.setOption({ chartInstance.setOption({
tooltip: { trigger: 'axis' }, tooltip: { trigger: 'axis' },
legend: { data: ['实测值', '靶值', '+2SD', '-2SD', '+3SD', '-3SD'] }, legend: { data: [t('lab.qc.actualValueLegend'), t('lab.qc.targetValueLegend'), '+2SD', '-2SD', '+3SD', '-3SD'] },
grid: { left: 60, right: 20, top: 40, bottom: 40 }, grid: { left: 60, right: 20, top: 40, bottom: 40 },
xAxis: { type: 'category', data: dates }, xAxis: { type: 'category', data: dates },
yAxis: { type: 'value', name: '检测值' }, yAxis: { type: 'value', name: t('lab.qc.yAxisName') },
series: [ series: [
{ name: '实测值', type: 'line', data: values, itemStyle: { color: '#409EFF' }, lineStyle: { width: 2 } }, { name: t('lab.qc.actualValueLegend'), type: 'line', data: values, itemStyle: { color: '#409EFF' }, lineStyle: { width: 2 } },
{ name: '靶值', type: 'line', data: targetValues, lineStyle: { type: 'dashed', color: '#67C23A' }, itemStyle: { color: '#67C23A' } }, { name: t('lab.qc.targetValueLegend'), type: 'line', data: targetValues, lineStyle: { type: 'dashed', color: '#67C23A' }, itemStyle: { color: '#67C23A' } },
{ name: '+2SD', type: 'line', data: dates.map(() => mean + 2 * sd), lineStyle: { type: 'dotted', color: '#E6A23C' }, itemStyle: { color: '#E6A23C' }, symbol: 'none' }, { name: '+2SD', type: 'line', data: dates.map(() => mean + 2 * sd), lineStyle: { type: 'dotted', color: '#E6A23C' }, itemStyle: { color: '#E6A23C' }, symbol: 'none' },
{ name: '-2SD', type: 'line', data: dates.map(() => mean - 2 * sd), lineStyle: { type: 'dotted', color: '#E6A23C' }, itemStyle: { color: '#E6A23C' }, symbol: 'none' }, { name: '-2SD', type: 'line', data: dates.map(() => mean - 2 * sd), lineStyle: { type: 'dotted', color: '#E6A23C' }, itemStyle: { color: '#E6A23C' }, symbol: 'none' },
{ name: '+3SD', type: 'line', data: dates.map(() => mean + 3 * sd), lineStyle: { type: 'dotted', color: '#F56C6C' }, itemStyle: { color: '#F56C6C' }, symbol: 'none' }, { name: '+3SD', type: 'line', data: dates.map(() => mean + 3 * sd), lineStyle: { type: 'dotted', color: '#F56C6C' }, itemStyle: { color: '#F56C6C' }, symbol: 'none' },

View File

@@ -1,18 +1,18 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px"> <div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">检查预约排队</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.appointment.title') }}</span>
</div> </div>
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap"> <div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-input <el-input
v-model="q.patientName" v-model="q.patientName"
placeholder="患者" :placeholder="$t('lab.appointment.patientPlaceholder')"
clearable clearable
style="width:140px" style="width:140px"
/> />
<el-select <el-select
v-model="q.status" v-model="q.status"
placeholder="状态" :placeholder="$t('lab.appointment.statusPlaceholder')"
clearable clearable
style="width:120px" style="width:120px"
> >
@@ -27,13 +27,13 @@
type="primary" type="primary"
@click="loadData" @click="loadData"
> >
查询 {{ $t('lab.appointment.query') }}
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@click="openAppoint" @click="openAppoint"
> >
新建预约 {{ $t('lab.appointment.newAppointment') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -43,38 +43,38 @@
> >
<el-table-column <el-table-column
prop="queueNumber" prop="queueNumber"
label="队号" :label="$t('lab.appointment.queueNumber')"
width="60" width="60"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="patientName" prop="patientName"
label="患者" :label="$t('lab.appointment.patient')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="examName" prop="examName"
label="检查项目" :label="$t('lab.appointment.examName')"
width="150" width="150"
/> />
<el-table-column <el-table-column
prop="appointDate" prop="appointDate"
label="预约日期" :label="$t('lab.appointment.appointDate')"
width="110" width="110"
/> />
<el-table-column <el-table-column
prop="appointTime" prop="appointTime"
label="时段" :label="$t('lab.appointment.timeSlot')"
width="80" width="80"
/> />
<el-table-column <el-table-column
prop="room" prop="room"
label="诊室" :label="$t('lab.appointment.room')"
width="80" width="80"
/> />
<el-table-column <el-table-column
prop="status" prop="status"
label="状态" :label="$t('lab.appointment.status')"
width="90" width="90"
> >
<template #default="{row}"> <template #default="{row}">
@@ -83,28 +83,28 @@
type="info" type="info"
size="small" size="small"
> >
已预约 {{ $t('lab.appointment.appointed') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else-if="row.status==='CHECKED_IN'" v-else-if="row.status==='CHECKED_IN'"
type="warning" type="warning"
size="small" size="small"
> >
已签到 {{ $t('lab.appointment.checkedIn') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else-if="row.status==='EXAMINING'" v-else-if="row.status==='EXAMINING'"
type="primary" type="primary"
size="small" size="small"
> >
检查中 {{ $t('lab.appointment.examining') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else-if="row.status==='COMPLETED'" v-else-if="row.status==='COMPLETED'"
type="success" type="success"
size="small" size="small"
> >
已完成 {{ $t('lab.appointment.completed') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else v-else
@@ -116,7 +116,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="操作" :label="$t('lab.appointment.operation')"
width="220" width="220"
> >
<template #default="{row}"> <template #default="{row}">
@@ -127,7 +127,7 @@
size="small" size="small"
@click="doCheckin(row.id)" @click="doCheckin(row.id)"
> >
签到 {{ $t('lab.appointment.checkin') }}
</el-button> </el-button>
<el-button <el-button
v-if="row.status==='CHECKED_IN'" v-if="row.status==='CHECKED_IN'"
@@ -136,7 +136,7 @@
size="small" size="small"
@click="doStart(row.id)" @click="doStart(row.id)"
> >
开始 {{ $t('lab.appointment.start') }}
</el-button> </el-button>
<el-button <el-button
v-if="row.status==='EXAMINING'" v-if="row.status==='EXAMINING'"
@@ -145,7 +145,7 @@
size="small" size="small"
@click="doComplete(row.id)" @click="doComplete(row.id)"
> >
完成 {{ $t('lab.appointment.complete') }}
</el-button> </el-button>
<el-button <el-button
v-if="row.status!=='COMPLETED'&&row.status!=='CANCELLED'" v-if="row.status!=='COMPLETED'&&row.status!=='CANCELLED'"
@@ -154,7 +154,7 @@
size="small" size="small"
@click="doCancel(row.id)" @click="doCancel(row.id)"
> >
取消 {{ $t('lab.appointment.cancel') }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -169,49 +169,49 @@
/> />
<el-dialog <el-dialog
v-model="dlgVisible" v-model="dlgVisible"
title="新建预约" :title="$t('lab.appointment.dialogTitle')"
width="500px" width="500px"
> >
<el-form <el-form
:model="form" :model="form"
label-width="80px" label-width="80px"
> >
<el-form-item label="患者ID"> <el-form-item :label="$t('lab.appointment.patientId')">
<el-input v-model.number="form.patientId" /> <el-input v-model.number="form.patientId" />
</el-form-item> </el-form-item>
<el-form-item label="就诊ID"> <el-form-item :label="$t('lab.appointment.encounterId')">
<el-input v-model.number="form.encounterId" /> <el-input v-model.number="form.encounterId" />
</el-form-item> </el-form-item>
<el-form-item label="患者姓名"> <el-form-item :label="$t('lab.appointment.patientName')">
<el-input v-model="form.patientName" /> <el-input v-model="form.patientName" />
</el-form-item> </el-form-item>
<el-form-item label="检查项目"> <el-form-item :label="$t('lab.appointment.examName')">
<el-input v-model="form.examName" /> <el-input v-model="form.examName" />
</el-form-item> </el-form-item>
<el-form-item label="预约日期"> <el-form-item :label="$t('lab.appointment.appointDate')">
<el-date-picker <el-date-picker
v-model="form.appointDate" v-model="form.appointDate"
type="date" type="date"
/> />
</el-form-item> </el-form-item>
<el-form-item label="时段"> <el-form-item :label="$t('lab.appointment.timeSlot')">
<el-input <el-input
v-model="form.appointTime" v-model="form.appointTime"
placeholder="如: 上午/下午" :placeholder="$t('lab.appointment.timeSlotPlaceholder')"
/> />
</el-form-item> </el-form-item>
<el-form-item label="诊室"> <el-form-item :label="$t('lab.appointment.room')">
<el-input v-model="form.room" /> <el-input v-model="form.room" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="dlgVisible=false"> <el-button @click="dlgVisible=false">
取消 {{ $t('common.cancel') }}
</el-button><el-button </el-button><el-button
type="primary" type="primary"
@click="doAppoint" @click="doAppoint"
> >
预约 {{ $t('lab.appointment.appointBtn') }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
@@ -219,16 +219,18 @@
</template> </template>
<script setup> <script setup>
import { useDict } from '@/utils/dict' import { useDict } from '@/utils/dict'
import {ref,onMounted} from 'vue';import {ElMessage} from 'element-plus';import {getPage,appoint,checkin,startExam,complete,cancel} from './api' import {ref,onMounted} from 'vue';import {useI18n} from 'vue-i18n';import {ElMessage} from 'element-plus';
const {t} = useI18n()
import {getPage,appoint,checkin,startExam,complete,cancel} from './api'
const { exam_appointment_status } = useDict('exam_appointment_status') const { exam_appointment_status } = useDict('exam_appointment_status')
const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,patientName:'',status:''}) const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,patientName:'',status:''})
const dlgVisible=ref(false);const form=ref({patientId:null,encounterId:null,patientName:'',examName:'',appointDate:null,appointTime:'',room:''}) const dlgVisible=ref(false);const form=ref({patientId:null,encounterId:null,patientName:'',examName:'',appointDate:null,appointTime:'',room:''})
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0} const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
const openAppoint=()=>{form.value={patientId:null,encounterId:null,patientName:'',examName:'',appointDate:null,appointTime:'',room:''};dlgVisible.value=true} const openAppoint=()=>{form.value={patientId:null,encounterId:null,patientName:'',examName:'',appointDate:null,appointTime:'',room:''};dlgVisible.value=true}
const doAppoint=async()=>{await appoint(form.value);ElMessage.success('预约成功');dlgVisible.value=false;loadData()} const doAppoint=async()=>{await appoint(form.value);ElMessage.success(t('lab.appointment.appointSuccess'));dlgVisible.value=false;loadData()}
const doCheckin=async(id)=>{await checkin(id);ElMessage.success('签到完成');loadData()} const doCheckin=async(id)=>{await checkin(id);ElMessage.success(t('lab.appointment.checkinSuccess'));loadData()}
const doStart=async(id)=>{await startExam(id);ElMessage.success('开始检查');loadData()} const doStart=async(id)=>{await startExam(id);ElMessage.success(t('lab.appointment.startSuccess'));loadData()}
const doComplete=async(id)=>{await complete(id);ElMessage.success('检查完成');loadData()} const doComplete=async(id)=>{await complete(id);ElMessage.success(t('lab.appointment.completeSuccess'));loadData()}
const doCancel=async(id)=>{await cancel(id);ElMessage.success('已取消');loadData()} const doCancel=async(id)=>{await cancel(id);ElMessage.success(t('lab.appointment.cancelSuccess'));loadData()}
onMounted(()=>loadData()) onMounted(()=>loadData())
</script> </script>

View File

@@ -1,12 +1,12 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px"> <div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">ICD-10诊断编码库</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.icd10.title') }}</span>
</div> </div>
<div style="margin-bottom:12px;display:flex;gap:8px"> <div style="margin-bottom:12px;display:flex;gap:8px">
<el-input <el-input
v-model="q.keyword" v-model="q.keyword"
placeholder="编码/名称/拼音" :placeholder="$t('lab.icd10.keywordPlaceholder')"
clearable clearable
style="width:200px" style="width:200px"
@keyup.enter="loadData" @keyup.enter="loadData"
@@ -15,13 +15,13 @@
type="primary" type="primary"
@click="loadData" @click="loadData"
> >
查询 {{ $t('lab.icd10.query') }}
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@click="dlgVisible=true;isEdit=false;form={code:'',name:'',category:'',pinyin:''}" @click="dlgVisible=true;isEdit=false;form={code:'',name:'',category:'',pinyin:''}"
> >
新增 {{ $t('lab.icd10.add') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -31,24 +31,24 @@
> >
<el-table-column <el-table-column
prop="code" prop="code"
label="编码" :label="$t('lab.icd10.code')"
width="120" width="120"
/><el-table-column /><el-table-column
prop="name" prop="name"
label="诊断名称" :label="$t('lab.icd10.diagnosisName')"
min-width="200" min-width="200"
/> />
<el-table-column <el-table-column
prop="category" prop="category"
label="分类" :label="$t('lab.icd10.category')"
width="80" width="80"
/><el-table-column /><el-table-column
prop="pinyin" prop="pinyin"
label="拼音" :label="$t('lab.icd10.pinyin')"
width="120" width="120"
/> />
<el-table-column <el-table-column
label="操作" :label="$t('lab.icd10.operation')"
width="140" width="140"
> >
<template #default="{row}"> <template #default="{row}">
@@ -58,10 +58,10 @@
size="small" size="small"
@click="isEdit=true;form={...row};dlgVisible=true" @click="isEdit=true;form={...row};dlgVisible=true"
> >
编辑 {{ $t('lab.icd10.edit') }}
</el-button> </el-button>
<el-popconfirm <el-popconfirm
title="确定删除?" :title="$t('lab.icd10.deleteConfirm')"
@confirm="delItem(row.id)" @confirm="delItem(row.id)"
> >
<template #reference> <template #reference>
@@ -70,7 +70,7 @@
link link
size="small" size="small"
> >
删除 {{ $t('lab.icd10.delete') }}
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
@@ -87,45 +87,47 @@
/> />
<el-dialog <el-dialog
v-model="dlgVisible" v-model="dlgVisible"
:title="isEdit?'编辑':'新增'" :title="isEdit ? $t('common.edit') : $t('common.add')"
width="500px" width="500px"
> >
<el-form <el-form
:model="form" :model="form"
label-width="80px" label-width="80px"
> >
<el-form-item label="编码"> <el-form-item :label="$t('lab.icd10.code')">
<el-input v-model="form.code" /> <el-input v-model="form.code" />
</el-form-item> </el-form-item>
<el-form-item label="名称"> <el-form-item :label="$t('lab.icd10.name')">
<el-input v-model="form.name" /> <el-input v-model="form.name" />
</el-form-item> </el-form-item>
<el-form-item label="分类"> <el-form-item :label="$t('lab.icd10.category')">
<el-input v-model="form.category" /> <el-input v-model="form.category" />
</el-form-item> </el-form-item>
<el-form-item label="拼音"> <el-form-item :label="$t('lab.icd10.pinyin')">
<el-input v-model="form.pinyin" /> <el-input v-model="form.pinyin" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="dlgVisible=false"> <el-button @click="dlgVisible=false">
取消 {{ $t('common.cancel') }}
</el-button><el-button </el-button><el-button
type="primary" type="primary"
@click="saveData" @click="saveData"
> >
保存 {{ $t('common.save') }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import {ref,onMounted} from 'vue';import {ElMessage} from 'element-plus';import {getPage,add,update,del} from './api' import {ref,onMounted} from 'vue';import {useI18n} from 'vue-i18n';import {ElMessage} from 'element-plus';
const {t} = useI18n()
import {getPage,add,update,del} from './api'
const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,keyword:''}) const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,keyword:''})
const dlgVisible=ref(false);const isEdit=ref(false);const form=ref({}) const dlgVisible=ref(false);const isEdit=ref(false);const form=ref({})
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0} const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
const saveData=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success('保存成功');dlgVisible.value=false;loadData()} const saveData=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success(t('lab.icd10.saveSuccess'));dlgVisible.value=false;loadData()}
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData()} const delItem=async(id)=>{await del(id);ElMessage.success(t('lab.icd10.deleted'));loadData()}
onMounted(()=>loadData()) onMounted(()=>loadData())
</script> </script>

View File

@@ -1,14 +1,14 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px"> <div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">检验系统增强</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.enhanced.title') }}</span>
</div> </div>
<el-tabs <el-tabs
v-model="tab" v-model="tab"
type="border-card" type="border-card"
> >
<el-tab-pane <el-tab-pane
label="室内质控" :label="$t('lab.enhanced.iqcTab')"
name="iqc" name="iqc"
> >
<el-card <el-card
@@ -19,17 +19,17 @@
<div> <div>
<div style="font-size:28px;font-weight:bold;color:#409eff"> <div style="font-size:28px;font-weight:bold;color:#409eff">
{{ iqcStats.total||0 }} {{ iqcStats.total||0 }}
</div><div>总检测</div> </div><div>{{ $t('lab.enhanced.totalTests') }}</div>
</div> </div>
<div> <div>
<div style="font-size:28px;font-weight:bold;color:#67c23a"> <div style="font-size:28px;font-weight:bold;color:#67c23a">
{{ iqcStats.passed||0 }} {{ iqcStats.passed||0 }}
</div><div>合格</div> </div><div>{{ $t('lab.enhanced.qualified') }}</div>
</div> </div>
<div> <div>
<div style="font-size:28px;font-weight:bold;color:#f56c6c"> <div style="font-size:28px;font-weight:bold;color:#f56c6c">
{{ iqcStats.failed||0 }} {{ iqcStats.failed||0 }}
</div><div>失控</div> </div><div>{{ $t('lab.enhanced.outOfControl') }}</div>
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -38,7 +38,7 @@
type="success" type="success"
@click="showIqc=true" @click="showIqc=true"
> >
新增记录 {{ $t('lab.enhanced.addRecord') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -48,45 +48,45 @@
> >
<el-table-column <el-table-column
prop="instrumentName" prop="instrumentName"
label="仪器" :label="$t('lab.enhanced.instrument')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="qcItem" prop="qcItem"
label="质控项目" :label="$t('lab.enhanced.qcItem')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="qcDate" prop="qcDate"
label="质控日期" :label="$t('lab.enhanced.qcDate')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="targetValue" prop="targetValue"
label="靶值" :label="$t('lab.enhanced.targetValue')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="actualValue" prop="actualValue"
label="实测值" :label="$t('lab.enhanced.actualValue')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="cvRate" prop="cvRate"
label="CV%" :label="$t('lab.enhanced.cvRate')"
width="70" width="70"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="westgardRule" prop="westgardRule"
label="规则" :label="$t('lab.enhanced.rule')"
width="80" width="80"
/> />
<el-table-column <el-table-column
prop="isPass" prop="isPass"
label="结果" :label="$t('lab.enhanced.result')"
width="70" width="70"
> >
<template #default="{row}"> <template #default="{row}">
@@ -94,14 +94,14 @@
:type="row.isPass?'success':'danger'" :type="row.isPass?'success':'danger'"
size="small" size="small"
> >
{{ row.isPass?'合格':'失控' }} {{ row.isPass ? $t('lab.enhanced.qualifiedResult') : $t('lab.enhanced.outOfControlResult') }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane <el-tab-pane
label="室间质评" :label="$t('lab.enhanced.eqaTab')"
name="eqa" name="eqa"
> >
<div style="margin-bottom:12px"> <div style="margin-bottom:12px">
@@ -109,7 +109,7 @@
type="success" type="success"
@click="showEqa=true" @click="showEqa=true"
> >
新增记录 {{ $t('lab.enhanced.addRecord') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -119,38 +119,38 @@
> >
<el-table-column <el-table-column
prop="assessmentName" prop="assessmentName"
label="质评项目" :label="$t('lab.enhanced.assessmentProject')"
width="150" width="150"
/> />
<el-table-column <el-table-column
prop="assessmentOrg" prop="assessmentOrg"
label="组织机构" :label="$t('lab.enhanced.assessmentOrg')"
width="150" width="150"
/> />
<el-table-column <el-table-column
prop="testItem" prop="testItem"
label="检测项目" :label="$t('lab.enhanced.testItem')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="targetValue" prop="targetValue"
label="靶值" :label="$t('lab.enhanced.targetValue')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="actualValue" prop="actualValue"
label="实测值" :label="$t('lab.enhanced.actualValue')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="deviationRate" prop="deviationRate"
label="偏差率%" :label="$t('lab.enhanced.deviationRate')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="result" prop="result"
label="结果" :label="$t('lab.enhanced.result')"
width="80" width="80"
> >
<template #default="{row}"> <template #default="{row}">
@@ -170,6 +170,8 @@
<script setup> <script setup>
import {ref,reactive,onMounted} from 'vue' import {ref,reactive,onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import {getInternalQcPage,addInternalQc,getQcStats,getExternalEqaPage,addExternalEqa} from './api' import {getInternalQcPage,addInternalQc,getQcStats,getExternalEqaPage,addExternalEqa} from './api'
const tab=ref('iqc') const tab=ref('iqc')
@@ -182,7 +184,7 @@ const loadData=async()=>{
const [i,q,e]=await Promise.all([getInternalQcPage({pageNo:1,pageSize:50}),getQcStats(),getExternalEqaPage({pageNo:1,pageSize:50})]) const [i,q,e]=await Promise.all([getInternalQcPage({pageNo:1,pageSize:50}),getQcStats(),getExternalEqaPage({pageNo:1,pageSize:50})])
iqcData.value=i.data?.records||[];iqcStats.value=q.data||[];eqaData.value=e.data?.records||[] iqcData.value=i.data?.records||[];iqcStats.value=q.data||[];eqaData.value=e.data?.records||[]
} }
const submitIqc=async()=>{await addInternalQc(iqcForm);ElMessage.success('新增成功');showIqc.value=false;loadData()} const submitIqc=async()=>{await addInternalQc(iqcForm);ElMessage.success(t('lab.enhanced.addSuccess'));showIqc.value=false;loadData()}
const submitEqa=async()=>{await addExternalEqa(eqaForm);ElMessage.success('新增成功');showEqa.value=false;loadData()} const submitEqa=async()=>{await addExternalEqa(eqaForm);ElMessage.success(t('lab.enhanced.addSuccess'));showEqa.value=false;loadData()}
onMounted(()=>loadData()) onMounted(()=>loadData())
</script> </script>

View File

@@ -1,12 +1,12 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center"> <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('lab.pathway.title') }}</span>
<el-button <el-button
type="primary" type="primary"
@click="loadStats" @click="loadStats"
> >
刷新统计 {{ $t('lab.pathway.refreshStats') }}
</el-button> </el-button>
</div> </div>
<el-row <el-row
@@ -19,7 +19,7 @@
<div style="font-size:20px;font-weight:bold;color:#409eff"> <div style="font-size:20px;font-weight:bold;color:#409eff">
{{ stats.totalPathways||0 }} {{ stats.totalPathways||0 }}
</div><div style="font-size:12px;color:#999"> </div><div style="font-size:12px;color:#999">
路径数 {{ $t('lab.pathway.pathwayCount') }}
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -30,7 +30,7 @@
<div style="font-size:20px;font-weight:bold;color:#67c23a"> <div style="font-size:20px;font-weight:bold;color:#67c23a">
{{ stats.totalExecutions||0 }} {{ stats.totalExecutions||0 }}
</div><div style="font-size:12px;color:#999"> </div><div style="font-size:12px;color:#999">
入径数 {{ $t('lab.pathway.entryCount') }}
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -41,7 +41,7 @@
<div style="font-size:20px;font-weight:bold;color:#e6a23c"> <div style="font-size:20px;font-weight:bold;color:#e6a23c">
{{ stats.completedExecutions||0 }} {{ stats.completedExecutions||0 }}
</div><div style="font-size:12px;color:#999"> </div><div style="font-size:12px;color:#999">
完成数 {{ $t('lab.pathway.completedCount') }}
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -52,7 +52,7 @@
<div style="font-size:20px;font-weight:bold;color:#f56c6c"> <div style="font-size:20px;font-weight:bold;color:#f56c6c">
{{ stats.variedExecutions||0 }} {{ stats.variedExecutions||0 }}
</div><div style="font-size:12px;color:#999"> </div><div style="font-size:12px;color:#999">
变异数 {{ $t('lab.pathway.variationCount') }}
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -63,7 +63,7 @@
<div style="font-size:20px;font-weight:bold;color:#909399"> <div style="font-size:20px;font-weight:bold;color:#909399">
{{ stats.completionRate||0 }}% {{ stats.completionRate||0 }}%
</div><div style="font-size:12px;color:#999"> </div><div style="font-size:12px;color:#999">
完成率 {{ $t('lab.pathway.completionRate') }}
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -76,44 +76,44 @@
> >
<el-table-column <el-table-column
prop="pathwayName" prop="pathwayName"
label="路径名称" :label="$t('lab.pathway.pathwayName')"
min-width="150" min-width="150"
/> />
<el-table-column <el-table-column
prop="diseaseCode" prop="diseaseCode"
label="疾病编码" :label="$t('lab.pathway.diseaseCode')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="diseaseName" prop="diseaseName"
label="疾病名称" :label="$t('lab.pathway.diseaseName')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="departmentName" prop="departmentName"
label="科室" :label="$t('lab.pathway.department')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="avgDays" prop="avgDays"
label="平均天数" :label="$t('lab.pathway.avgDays')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="avgCost" prop="avgCost"
label="平均费用" :label="$t('lab.pathway.avgCost')"
width="100" width="100"
align="right" align="right"
/> />
<el-table-column <el-table-column
prop="version" prop="version"
label="版本" :label="$t('lab.pathway.version')"
width="60" width="60"
align="center" align="center"
/> />
<el-table-column <el-table-column
label="操作" :label="$t('lab.pathway.operation')"
width="100" width="100"
> >
<template #default="{row}"> <template #default="{row}">
@@ -123,7 +123,7 @@
size="small" size="small"
@click="openEnter(row)" @click="openEnter(row)"
> >
入径 {{ $t('lab.pathway.enterPathway') }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -138,35 +138,35 @@
/> />
<el-dialog <el-dialog
v-model="enterDialog" v-model="enterDialog"
title="患者入径" :title="$t('lab.pathway.enterDialogTitle')"
width="500px" width="500px"
> >
<el-form <el-form
:model="enterForm" :model="enterForm"
label-width="80px" label-width="80px"
> >
<el-form-item label="路径"> <el-form-item :label="$t('lab.pathway.pathway')">
<el-input <el-input
:model-value="enterForm.pathwayName" :model-value="enterForm.pathwayName"
disabled disabled
/> />
</el-form-item> </el-form-item>
<el-form-item label="患者ID"> <el-form-item :label="$t('lab.pathway.patientId')">
<el-input v-model.number="enterForm.patientId" /> <el-input v-model.number="enterForm.patientId" />
</el-form-item> </el-form-item>
<el-form-item label="就诊ID"> <el-form-item :label="$t('lab.pathway.encounterId')">
<el-input v-model.number="enterForm.encounterId" /> <el-input v-model.number="enterForm.encounterId" />
</el-form-item> </el-form-item>
<el-form-item label="患者姓名"> <el-form-item :label="$t('lab.pathway.patientName')">
<el-input v-model="enterForm.patientName" /> <el-input v-model="enterForm.patientName" />
</el-form-item> </el-form-item>
<el-form-item label="预期天数"> <el-form-item :label="$t('lab.pathway.expectedDays')">
<el-input-number <el-input-number
v-model="enterForm.expectedDays" v-model="enterForm.expectedDays"
:min="1" :min="1"
/> />
</el-form-item> </el-form-item>
<el-form-item label="预期费用"> <el-form-item :label="$t('lab.pathway.expectedCost')">
<el-input-number <el-input-number
v-model="enterForm.expectedCost" v-model="enterForm.expectedCost"
:min="0" :min="0"
@@ -176,24 +176,26 @@
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="enterDialog=false"> <el-button @click="enterDialog=false">
取消 {{ $t('common.cancel') }}
</el-button><el-button </el-button><el-button
type="primary" type="primary"
@click="doEnter" @click="doEnter"
> >
确认入径 {{ $t('lab.pathway.confirmEnter') }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import {ref,onMounted} from 'vue';import {ElMessage} from 'element-plus';import {getPage,enterPathway,getStats} from './api' import {ref,onMounted} from 'vue';import {useI18n} from 'vue-i18n';import {ElMessage} from 'element-plus';
const {t} = useI18n()
import {getPage,enterPathway,getStats} from './api'
const tableData=ref([]);const total=ref(0);const stats=ref({});const q=ref({pageNo:1,pageSize: 10}) const tableData=ref([]);const total=ref(0);const stats=ref({});const q=ref({pageNo:1,pageSize: 10})
const enterDialog=ref(false);const enterForm=ref({pathwayId:null,pathwayName:'',patientId:null,encounterId:null,patientName:'',expectedDays:7,expectedCost:0}) const enterDialog=ref(false);const enterForm=ref({pathwayId:null,pathwayName:'',patientId:null,encounterId:null,patientName:'',expectedDays:7,expectedCost:0})
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0} const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
const loadStats=async()=>{const r=await getStats();stats.value=r.data||{}} const loadStats=async()=>{const r=await getStats();stats.value=r.data||{}}
const openEnter=(row)=>{enterForm.value.pathwayId=row.id;enterForm.value.pathwayName=row.pathwayName;enterForm.value.expectedDays=row.avgDays;enterForm.value.expectedCost=row.avgCost;enterDialog.value=true} const openEnter=(row)=>{enterForm.value.pathwayId=row.id;enterForm.value.pathwayName=row.pathwayName;enterForm.value.expectedDays=row.avgDays;enterForm.value.expectedCost=row.avgCost;enterDialog.value=true}
const doEnter=async()=>{await enterPathway(enterForm.value);ElMessage.success('入径成功');enterDialog.value=false;loadStats()} const doEnter=async()=>{await enterPathway(enterForm.value);ElMessage.success(t('lab.pathway.enterSuccess'));enterDialog.value=false;loadStats()}
onMounted(()=>{loadData();loadStats()}) onMounted(()=>{loadData();loadStats()})
</script> </script>

View File

@@ -1,12 +1,12 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px"> <div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">影像图文报告</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.radiology.title') }}</span>
</div> </div>
<div style="margin-bottom:12px;display:flex;gap:8px"> <div style="margin-bottom:12px;display:flex;gap:8px">
<el-select <el-select
v-model="q.status" v-model="q.status"
placeholder="状态" :placeholder="$t('lab.radiology.statusPlaceholder')"
clearable clearable
style="width:120px" style="width:120px"
> >
@@ -21,13 +21,13 @@
type="primary" type="primary"
@click="loadData" @click="loadData"
> >
查询 {{ $t('lab.radiology.query') }}
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@click="openReport" @click="openReport"
> >
新建报告 {{ $t('lab.radiology.newReport') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -37,40 +37,40 @@
> >
<el-table-column <el-table-column
prop="patientName" prop="patientName"
label="患者" :label="$t('lab.radiology.patient')"
width="100" width="100"
/> />
<el-table-column <el-table-column
prop="examName" prop="examName"
label="检查" :label="$t('lab.radiology.exam')"
width="150" width="150"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="reportType" prop="reportType"
label="类型" :label="$t('lab.radiology.type')"
width="80" width="80"
/> />
<el-table-column <el-table-column
prop="findings" prop="findings"
label="所见" :label="$t('lab.radiology.findings')"
min-width="150" min-width="150"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="impression" prop="impression"
label="印象" :label="$t('lab.radiology.impression')"
min-width="150" min-width="150"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="reportDoctor" prop="reportDoctor"
label="报告人" :label="$t('lab.radiology.reporter')"
width="80" width="80"
/> />
<el-table-column <el-table-column
prop="status" prop="status"
label="状态" :label="$t('lab.radiology.status')"
width="80" width="80"
> >
<template #default="{row}"> <template #default="{row}">
@@ -79,26 +79,26 @@
type="info" type="info"
size="small" size="small"
> >
草稿 {{ $t('lab.radiology.draft') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else-if="row.status==='REPORTED'" v-else-if="row.status==='REPORTED'"
type="warning" type="warning"
size="small" size="small"
> >
已报告 {{ $t('lab.radiology.reported') }}
</el-tag> </el-tag>
<el-tag <el-tag
v-else v-else
type="success" type="success"
size="small" size="small"
> >
已审核 {{ $t('lab.radiology.audited') }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="操作" :label="$t('lab.radiology.operation')"
width="160" width="160"
> >
<template #default="{row}"> <template #default="{row}">
@@ -109,7 +109,7 @@
size="small" size="small"
@click="doSubmit(row.id)" @click="doSubmit(row.id)"
> >
提交 {{ $t('lab.radiology.submit') }}
</el-button> </el-button>
<el-button <el-button
v-if="row.status==='REPORTED'" v-if="row.status==='REPORTED'"
@@ -118,7 +118,7 @@
size="small" size="small"
@click="doVerify(row.id)" @click="doVerify(row.id)"
> >
审核 {{ $t('lab.radiology.audit') }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -133,64 +133,64 @@
/> />
<el-dialog <el-dialog
v-model="dlgVisible" v-model="dlgVisible"
title="新建影像报告" :title="$t('lab.radiology.dialogTitle')"
width="600px" width="600px"
> >
<el-form <el-form
:model="form" :model="form"
label-width="80px" label-width="80px"
> >
<el-form-item label="申请ID"> <el-form-item :label="$t('lab.radiology.applyId')">
<el-input v-model.number="form.applyId" /> <el-input v-model.number="form.applyId" />
</el-form-item> </el-form-item>
<el-form-item label="就诊ID"> <el-form-item :label="$t('lab.radiology.encounterId')">
<el-input v-model.number="form.encounterId" /> <el-input v-model.number="form.encounterId" />
</el-form-item> </el-form-item>
<el-form-item label="患者姓名"> <el-form-item :label="$t('lab.radiology.patientName')">
<el-input v-model="form.patientName" /> <el-input v-model="form.patientName" />
</el-form-item> </el-form-item>
<el-form-item label="检查名称"> <el-form-item :label="$t('lab.radiology.examName')">
<el-input v-model="form.examName" /> <el-input v-model="form.examName" />
</el-form-item> </el-form-item>
<el-form-item label="报告类型"> <el-form-item :label="$t('lab.radiology.reportType')">
<el-input <el-input
v-model="form.reportType" v-model="form.reportType"
placeholder="如: X光/CT/MRI" :placeholder="$t('lab.radiology.reportTypePlaceholder')"
/> />
</el-form-item> </el-form-item>
<el-form-item label="所见"> <el-form-item :label="$t('lab.radiology.findings')">
<el-input <el-input
v-model="form.findings" v-model="form.findings"
type="textarea" type="textarea"
:rows="3" :rows="3"
/> />
</el-form-item> </el-form-item>
<el-form-item label="印象"> <el-form-item :label="$t('lab.radiology.impression')">
<el-input <el-input
v-model="form.impression" v-model="form.impression"
type="textarea" type="textarea"
:rows="3" :rows="3"
/> />
</el-form-item> </el-form-item>
<el-form-item label="结论"> <el-form-item :label="$t('lab.radiology.conclusion')">
<el-input <el-input
v-model="form.conclusion" v-model="form.conclusion"
type="textarea" type="textarea"
:rows="2" :rows="2"
/> />
</el-form-item> </el-form-item>
<el-form-item label="报告医生"> <el-form-item :label="$t('lab.radiology.reportDoctor')">
<el-input v-model="form.reportDoctor" /> <el-input v-model="form.reportDoctor" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="dlgVisible=false"> <el-button @click="dlgVisible=false">
取消 {{ $t('common.cancel') }}
</el-button><el-button </el-button><el-button
type="primary" type="primary"
@click="doAddReport" @click="doAddReport"
> >
保存 {{ $t('common.save') }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
@@ -198,14 +198,16 @@
</template> </template>
<script setup> <script setup>
import { useDict } from '@/utils/dict' import { useDict } from '@/utils/dict'
import {ref,onMounted} from 'vue';import {ElMessage,ElMessageBox} from 'element-plus';import {getReportPage,addReport,submitReport,verifyReport} from './api' import {ref,onMounted} from 'vue';import {useI18n} from 'vue-i18n';import {ElMessage,ElMessageBox} from 'element-plus';
const {t} = useI18n()
import {getReportPage,addReport,submitReport,verifyReport} from './api'
const { lab_report_status } = useDict('lab_report_status') const { lab_report_status } = useDict('lab_report_status')
const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,status:''}) const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,status:''})
const dlgVisible=ref(false);const form=ref({applyId:null,encounterId:null,patientName:'',examName:'',reportType:'',findings:'',impression:'',conclusion:'',reportDoctor:''}) const dlgVisible=ref(false);const form=ref({applyId:null,encounterId:null,patientName:'',examName:'',reportType:'',findings:'',impression:'',conclusion:'',reportDoctor:''})
const loadData=async()=>{const r=await getReportPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0} const loadData=async()=>{const r=await getReportPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
const openReport=()=>{form.value={applyId:null,encounterId:null,patientName:'',examName:'',reportType:'',findings:'',impression:'',conclusion:'',reportDoctor:''};dlgVisible.value=true} const openReport=()=>{form.value={applyId:null,encounterId:null,patientName:'',examName:'',reportType:'',findings:'',impression:'',conclusion:'',reportDoctor:''};dlgVisible.value=true}
const doAddReport=async()=>{await addReport(form.value);ElMessage.success('保存成功');dlgVisible.value=false;loadData()} const doAddReport=async()=>{await addReport(form.value);ElMessage.success(t('lab.radiology.saveSuccess'));dlgVisible.value=false;loadData()}
const doSubmit=async(id)=>{await submitReport(id);ElMessage.success('已提交');loadData()} const doSubmit=async(id)=>{await submitReport(id);ElMessage.success(t('lab.radiology.submitted'));loadData()}
const doVerify=async(id)=>{const {value}=await ElMessageBox.prompt('审核医生','审核报告');if(value){await verifyReport(id,value);ElMessage.success('已审核');loadData()}} const doVerify=async(id)=>{const {value}=await ElMessageBox.prompt(t('lab.radiology.auditDoctor'), t('lab.radiology.auditReport'));if(value){await verifyReport(id,value);ElMessage.success(t('lab.radiology.auditedSuccess'));loadData()}}
onMounted(()=>loadData()) onMounted(()=>loadData())
</script> </script>

View File

@@ -1,26 +1,26 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px"> <div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">检验参考范围</span> <span style="font-size:18px;font-weight:bold">{{ $t('lab.refRange.title') }}</span>
</div> </div>
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap"> <div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-input <el-input
v-model="q.itemCode" v-model="q.itemCode"
placeholder="项目编码" :placeholder="$t('lab.refRange.itemCodePlaceholder')"
clearable clearable
style="width:140px" style="width:140px"
/> />
<el-select <el-select
v-model="q.gender" v-model="q.gender"
placeholder="性别" :placeholder="$t('lab.refRange.genderPlaceholder')"
clearable clearable
style="width:100px" style="width:100px"
> >
<el-option <el-option
label="" :label="$t('lab.refRange.male')"
value="男" value="男"
/><el-option /><el-option
label="" :label="$t('lab.refRange.female')"
value="女" value="女"
/> />
</el-select> </el-select>
@@ -28,13 +28,13 @@
type="primary" type="primary"
@click="loadData" @click="loadData"
> >
查询 {{ $t('lab.refRange.query') }}
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
@click="dlgVisible=true;isEdit=false;form={itemCode:'',itemName:'',gender:'',ageMin:null,ageMax:null,lowValue:null,highValue:null,unit:'',criticalLow:null,criticalHigh:null}" @click="dlgVisible=true;isEdit=false;form={itemCode:'',itemName:'',gender:'',ageMin:null,ageMax:null,lowValue:null,highValue:null,unit:'',criticalLow:null,criticalHigh:null}"
> >
新增 {{ $t('lab.refRange.add') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@@ -44,57 +44,57 @@
> >
<el-table-column <el-table-column
prop="itemCode" prop="itemCode"
label="编码" :label="$t('lab.refRange.code')"
width="120" width="120"
/><el-table-column /><el-table-column
prop="itemName" prop="itemName"
label="名称" :label="$t('lab.refRange.name')"
width="150" width="150"
/> />
<el-table-column <el-table-column
prop="gender" prop="gender"
label="性别" :label="$t('lab.refRange.gender')"
width="70" width="70"
/><el-table-column /><el-table-column
prop="ageMin" prop="ageMin"
label="最小年龄" :label="$t('lab.refRange.ageMin')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="ageMax" prop="ageMax"
label="最大年龄" :label="$t('lab.refRange.ageMax')"
width="80" width="80"
align="center" align="center"
/><el-table-column /><el-table-column
prop="lowValue" prop="lowValue"
label="下限" :label="$t('lab.refRange.lowValue')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="highValue" prop="highValue"
label="上限" :label="$t('lab.refRange.highValue')"
width="80" width="80"
align="center" align="center"
/><el-table-column /><el-table-column
prop="unit" prop="unit"
label="单位" :label="$t('lab.refRange.unit')"
width="70" width="70"
/> />
<el-table-column <el-table-column
prop="criticalLow" prop="criticalLow"
label="危急低" :label="$t('lab.refRange.criticalLow')"
width="80" width="80"
align="center" align="center"
/><el-table-column /><el-table-column
prop="criticalHigh" prop="criticalHigh"
label="危急高" :label="$t('lab.refRange.criticalHigh')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
label="操作" :label="$t('lab.refRange.operation')"
width="140" width="140"
> >
<template #default="{row}"> <template #default="{row}">
@@ -104,10 +104,10 @@
size="small" size="small"
@click="isEdit=true;form={...row};dlgVisible=true" @click="isEdit=true;form={...row};dlgVisible=true"
> >
编辑 {{ $t('lab.refRange.edit') }}
</el-button> </el-button>
<el-popconfirm <el-popconfirm
title="确定删除?" :title="$t('lab.refRange.deleteConfirm')"
@confirm="delItem(row.id)" @confirm="delItem(row.id)"
> >
<template #reference> <template #reference>
@@ -116,7 +116,7 @@
link link
size="small" size="small"
> >
删除 {{ $t('lab.refRange.delete') }}
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
@@ -133,33 +133,33 @@
/> />
<el-dialog <el-dialog
v-model="dlgVisible" v-model="dlgVisible"
:title="isEdit?'编辑':'新增'" :title="isEdit ? $t('common.edit') : $t('common.add')"
width="500px" width="500px"
> >
<el-form <el-form
:model="form" :model="form"
label-width="80px" label-width="80px"
> >
<el-form-item label="编码"> <el-form-item :label="$t('lab.refRange.code')">
<el-input v-model="form.itemCode" /> <el-input v-model="form.itemCode" />
</el-form-item><el-form-item label="名称"> </el-form-item><el-form-item :label="$t('lab.refRange.name')">
<el-input v-model="form.itemName" /> <el-input v-model="form.itemName" />
</el-form-item> </el-form-item>
<el-form-item label="性别"> <el-form-item :label="$t('lab.refRange.gender')">
<el-select v-model="form.gender"> <el-select v-model="form.gender">
<el-option <el-option
label="通用" :label="$t('lab.refRange.universal')"
value="" value=""
/><el-option /><el-option
label="" :label="$t('lab.refRange.male')"
value="男" value="男"
/><el-option /><el-option
label="" :label="$t('lab.refRange.female')"
value="女" value="女"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="年龄范围"> <el-form-item :label="$t('lab.refRange.ageRange')">
<el-input-number <el-input-number
v-model="form.ageMin" v-model="form.ageMin"
:min="0" :min="0"
@@ -168,31 +168,31 @@
:min="0" :min="0"
/> />
</el-form-item> </el-form-item>
<el-form-item label="参考下限"> <el-form-item :label="$t('lab.refRange.refLow')">
<el-input-number <el-input-number
v-model="form.lowValue" v-model="form.lowValue"
:precision="4" :precision="4"
/> />
</el-form-item> </el-form-item>
<el-form-item label="参考上限"> <el-form-item :label="$t('lab.refRange.refHigh')">
<el-input-number <el-input-number
v-model="form.highValue" v-model="form.highValue"
:precision="4" :precision="4"
/> />
</el-form-item> </el-form-item>
<el-form-item label="单位"> <el-form-item :label="$t('lab.refRange.unit')">
<el-input <el-input
v-model="form.unit" v-model="form.unit"
style="width:120px" style="width:120px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="危急低"> <el-form-item :label="$t('lab.refRange.criticalLow')">
<el-input-number <el-input-number
v-model="form.criticalLow" v-model="form.criticalLow"
:precision="4" :precision="4"
/> />
</el-form-item> </el-form-item>
<el-form-item label="危急高"> <el-form-item :label="$t('lab.refRange.criticalHigh')">
<el-input-number <el-input-number
v-model="form.criticalHigh" v-model="form.criticalHigh"
:precision="4" :precision="4"
@@ -201,23 +201,25 @@
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="dlgVisible=false"> <el-button @click="dlgVisible=false">
取消 {{ $t('common.cancel') }}
</el-button><el-button </el-button><el-button
type="primary" type="primary"
@click="saveData" @click="saveData"
> >
保存 {{ $t('common.save') }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import {ref,onMounted} from 'vue';import {ElMessage} from 'element-plus';import {getPage,add,update,del} from './api' import {ref,onMounted} from 'vue';import {useI18n} from 'vue-i18n';import {ElMessage} from 'element-plus';
const {t} = useI18n()
import {getPage,add,update,del} from './api'
const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,itemCode:'',gender:''}) const tableData=ref([]);const total=ref(0);const q=ref({pageNo:1,pageSize: 10,itemCode:'',gender:''})
const dlgVisible=ref(false);const isEdit=ref(false);const form=ref({}) const dlgVisible=ref(false);const isEdit=ref(false);const form=ref({})
const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0} const loadData=async()=>{const r=await getPage(q.value);tableData.value=r.data?.records||[];total.value=r.data?.total||0}
const saveData=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success('保存成功');dlgVisible.value=false;loadData()} const saveData=async()=>{if(isEdit.value){await update(form.value)}else{await add(form.value)}ElMessage.success(t('lab.refRange.saveSuccess'));dlgVisible.value=false;loadData()}
const delItem=async(id)=>{await del(id);ElMessage.success('已删除');loadData()} const delItem=async(id)=>{await del(id);ElMessage.success(t('lab.refRange.deleted'));loadData()}
onMounted(()=>loadData()) onMounted(()=>loadData())
</script> </script>

View File

@@ -1,19 +1,19 @@
<template> <template>
<div style="padding:16px"> <div style="padding:16px">
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center"> <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('lab.history.title') }}</span>
<div> <div>
<el-button <el-button
type="primary" type="primary"
@click="loadData" @click="loadData"
> >
查询 {{ $t('lab.history.query') }}
</el-button> </el-button>
<el-button <el-button
type="warning" type="warning"
@click="exportReport" @click="exportReport"
> >
导出报告 {{ $t('lab.history.exportReport') }}
</el-button> </el-button>
</div> </div>
</div> </div>
@@ -24,27 +24,27 @@
style="margin-bottom:16px" style="margin-bottom:16px"
> >
<el-form inline> <el-form inline>
<el-form-item label="患者ID"> <el-form-item :label="$t('lab.history.patientId')">
<el-input <el-input
v-model="patientId" v-model="patientId"
placeholder="请输入患者ID" :placeholder="$t('lab.history.patientIdPlaceholder')"
style="width:180px" style="width:180px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="检验项目"> <el-form-item :label="$t('lab.history.testItem')">
<el-input <el-input
v-model="testItem" v-model="testItem"
clearable clearable
placeholder="如: 血糖、血常规" :placeholder="$t('lab.history.testItemPlaceholder')"
style="width:180px" style="width:180px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="日期范围"> <el-form-item :label="$t('lab.history.dateRange')">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
type="daterange" type="daterange"
start-placeholder="开始" :start-placeholder="$t('lab.history.startPlaceholder')"
end-placeholder="结束" :end-placeholder="$t('lab.history.endPlaceholder')"
style="width:240px" style="width:240px"
/> />
</el-form-item> </el-form-item>
@@ -88,7 +88,7 @@
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
检验指标趋势 {{ $t('lab.history.trendTitle') }}
</template> </template>
<div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column"> <div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column">
<div <div
@@ -109,7 +109,7 @@
</div> </div>
<el-empty <el-empty
v-else v-else
description="请先查询患者数据" :description="$t('lab.history.queryFirst')"
/> />
</div> </div>
</el-card> </el-card>
@@ -117,7 +117,7 @@
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
异常指标统计 {{ $t('lab.history.abnormalTitle') }}
</template> </template>
<div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:12px"> <div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:12px">
<div <div
@@ -135,7 +135,7 @@
<div style="width:200px;background:#f0f0f0;border-radius:4px;height:24px"> <div style="width:200px;background:#f0f0f0;border-radius:4px;height:24px">
<div :style="{width: item.percent + '%', background: item.color, height: '100%', borderRadius: '4px', transition: 'width 0.5s'}" /> <div :style="{width: item.percent + '%', background: item.color, height: '100%', borderRadius: '4px', transition: 'width 0.5s'}" />
</div> </div>
<span style="font-size:13px;font-weight:bold">{{ item.count }} ({{ item.percent }}%)</span> <span style="font-size:13px;font-weight:bold">{{ item.count }}{{ $t('lab.history.items') }} ({{ item.percent }}%)</span>
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -145,7 +145,7 @@
<!-- 数据表格 --> <!-- 数据表格 -->
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
检验结果明细 {{ $t('lab.history.detailTitle') }}
</template> </template>
<el-table <el-table
v-loading="loading" v-loading="loading"
@@ -155,18 +155,18 @@
> >
<el-table-column <el-table-column
type="index" type="index"
label="序号" :label="$t('lab.history.seqNo')"
width="60" width="60"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="testItem" prop="testItem"
label="检验项目" :label="$t('lab.history.testItem')"
width="140" width="140"
/> />
<el-table-column <el-table-column
prop="testValue" prop="testValue"
label="结果" :label="$t('lab.history.result')"
width="100" width="100"
align="center" align="center"
> >
@@ -178,19 +178,19 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="unit" prop="unit"
label="单位" :label="$t('lab.history.unit')"
width="80" width="80"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="referenceRange" prop="referenceRange"
label="参考范围" :label="$t('lab.history.refRange')"
width="120" width="120"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="abnormalFlag" prop="abnormalFlag"
label="异常" :label="$t('lab.history.abnormal')"
width="80" width="80"
align="center" align="center"
> >
@@ -205,22 +205,22 @@
<span <span
v-else v-else
style="color:#67C23A" style="color:#67C23A"
>正常</span> >{{ $t('lab.history.normal') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="testDate" prop="testDate"
label="检验日期" :label="$t('lab.history.testDate')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="departmentName" prop="departmentName"
label="科室" :label="$t('lab.history.department')"
width="120" width="120"
/> />
<el-table-column <el-table-column
prop="reportTime" prop="reportTime"
label="报告时间" :label="$t('lab.history.reportTime')"
width="160" width="160"
/> />
</el-table> </el-table>
@@ -230,6 +230,8 @@
<script setup> <script setup>
import {ref, computed, onMounted} from 'vue' import {ref, computed, onMounted} from 'vue'
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import {compareResults} from './api' import {compareResults} from './api'
@@ -239,13 +241,15 @@ const dateRange = ref(null)
const loading = ref(false) const loading = ref(false)
const resultData = ref([]) const resultData = ref([])
const statCards = ref([ const statsRaw = ref({ normal: 0, abnormal: 0, highCount: 0 })
{label:'总项目数', value:0, color:'#409eff'},
{label:'正常项', value:0, color:'#67c23a'}, const statCards = computed(() => [
{label:'异常项', value:0, color:'#f56c6c'}, {label: t('lab.history.totalItems'), value: resultData.value.length, color:'#409eff'},
{label:'异常率', value:'0%', color:'#e6a23c'}, {label: t('lab.history.normalItems'), value: statsRaw.value.normal, color:'#67c23a'},
{label:'检验次数', value:0, color:'#909399'}, {label: t('lab.history.abnormalItems'), value: statsRaw.value.abnormal, color:'#f56c6c'},
{label:'最高异常', value:'-', color:'#409eff'} {label: t('lab.history.abnormalRate'), value: resultData.value.length > 0 ? Math.round(statsRaw.value.abnormal * 100 / resultData.value.length) + '%' : '0%', color:'#e6a23c'},
{label: t('lab.history.testCount'), value: new Set(resultData.value.map(r => r.testDate)).size, color:'#909399'},
{label: t('lab.history.highestAbnormal'), value: statsRaw.value.highCount > 0 ? t('lab.history.highItems', {n: statsRaw.value.highCount}) : t('lab.history.none'), color:'#409eff'}
]) ])
const abnormalStats = computed(() => { const abnormalStats = computed(() => {
@@ -257,9 +261,9 @@ const abnormalStats = computed(() => {
}) })
const total = resultData.value.length || 1 const total = resultData.value.length || 1
return [ return [
{category:'偏高(H)', count:high, percent:Math.round(high*100/total), type:'danger', color:'#F56C6C'}, {category: t('lab.history.highCategory'), count:high, percent:Math.round(high*100/total), type:'danger', color:'#F56C6C'},
{category:'偏低(L)', count:low, percent:Math.round(low*100/total), type:'warning', color:'#E6A23C'}, {category: t('lab.history.lowCategory'), count:low, percent:Math.round(low*100/total), type:'warning', color:'#E6A23C'},
{category:'其他异常', count:other, percent:Math.round(other*100/total), type:'info', color:'#909399'} {category: t('lab.history.otherAbnormal'), count:other, percent:Math.round(other*100/total), type:'info', color:'#909399'}
] ]
}) })
@@ -277,7 +281,6 @@ async function loadData() {
try { try {
const r = await compareResults({patientId:patientId.value, testItem:testItem.value}) const r = await compareResults({patientId:patientId.value, testItem:testItem.value})
resultData.value = r.data || [] resultData.value = r.data || []
// Stats
let normal = 0, abnormal = 0, highCount = 0 let normal = 0, abnormal = 0, highCount = 0
resultData.value.forEach(row => { resultData.value.forEach(row => {
if (row.abnormalFlag) { if (row.abnormalFlag) {
@@ -285,16 +288,11 @@ async function loadData() {
if (row.abnormalFlag === 'H' || row.abnormalFlag === '↑') highCount++ if (row.abnormalFlag === 'H' || row.abnormalFlag === '↑') highCount++
} else normal++ } else normal++
}) })
statCards.value[0].value = resultData.value.length statsRaw.value = { normal, abnormal, highCount }
statCards.value[1].value = normal
statCards.value[2].value = abnormal
statCards.value[3].value = resultData.value.length > 0 ? Math.round(abnormal * 100 / resultData.value.length) + '%' : '0%'
statCards.value[4].value = new Set(resultData.value.map(r => r.testDate)).size
statCards.value[5].value = highCount > 0 ? highCount + '项偏高' : '无'
} finally { loading.value = false } } finally { loading.value = false }
} }
function exportReport() { ElMessage.info('导出功能开发中') } function exportReport() { ElMessage.info(t('lab.history.exportInDev')) }
onMounted(() => {}) onMounted(() => {})
</script> </script>

View File

@@ -4,12 +4,12 @@
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
class="table-header-search" class="table-header-search"
placeholder="单据号" :placeholder="$t('medication.bill.documentNo')"
/> />
<el-select <el-select
v-model="queryParams.statusEnum" v-model="queryParams.statusEnum"
class="table-header-search" class="table-header-search"
placeholder="审批状态" :placeholder="$t('medication.bill.approvalStatus')"
clearable clearable
> >
<el-option <el-option
@@ -22,7 +22,7 @@
<el-select <el-select
v-model="queryParams.typeEnum" v-model="queryParams.typeEnum"
class="table-header-search" class="table-header-search"
placeholder="单据类型" :placeholder="$t('medication.bill.documentType')"
clearable clearable
> >
<el-option <el-option
@@ -34,7 +34,7 @@
</el-select> </el-select>
<el-date-picker <el-date-picker
v-model="queryParams.applyTime" v-model="queryParams.applyTime"
placeholder="请选择申请日期" :placeholder="$t('medication.bill.selectApplyDate')"
type="date" type="date"
size="default" size="default"
placement="bottom" placement="bottom"
@@ -48,7 +48,7 @@
icon="Download" icon="Download"
@click="handleExport" @click="handleExport"
> >
导出 {{ $t('medication.bill.export') }}
</el-button> </el-button>
<el-button <el-button
class="table-header-button" class="table-header-button"
@@ -66,7 +66,7 @@
} }
" "
> >
重置 {{ $t('medication.bill.reset') }}
</el-button> </el-button>
<el-button <el-button
class="table-header-button" class="table-header-button"
@@ -74,7 +74,7 @@
icon="Search" icon="Search"
@click="getList" @click="getList"
> >
搜索 {{ $t('medication.bill.search') }}
</el-button> </el-button>
</div> </div>
<vxe-table <vxe-table
@@ -84,23 +84,23 @@
:row-config="{ keyField: 'supplyBusNo' }" :row-config="{ keyField: 'supplyBusNo' }"
> >
<vxe-column <vxe-column
title="单据号" :title="$t('medication.bill.documentNo')"
align="center" align="center"
field="supplyBusNo" field="supplyBusNo"
width="160" width="160"
/> />
<vxe-column <vxe-column
title="审批状态" :title="$t('medication.bill.approvalStatus')"
align="center" align="center"
field="statusEnum_enumText" field="statusEnum_enumText"
/> />
<vxe-column <vxe-column
title="单据类型" :title="$t('medication.bill.documentType')"
align="center" align="center"
field="typeEnum_enumText" field="typeEnum_enumText"
/> />
<vxe-column <vxe-column
title="经手人" :title="$t('medication.bill.handler')"
align="center" align="center"
field="practitionerId_dictText" field="practitionerId_dictText"
> >
@@ -109,7 +109,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="供应商" :title="$t('medication.bill.supplier')"
align="center" align="center"
field="supplierId_dictText" field="supplierId_dictText"
width="180" width="180"
@@ -120,7 +120,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="目的仓库" :title="$t('medication.bill.targetWarehouse')"
align="center" align="center"
field="purposeLocationId_dictText" field="purposeLocationId_dictText"
> >
@@ -129,17 +129,17 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="总金额" :title="$t('medication.bill.totalAmount')"
align="center" align="center"
field="totalAmount" field="totalAmount"
> >
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.totalAmount">{{ scope.row.totalAmount }} </span> <span v-if="scope.row.totalAmount">{{ scope.row.totalAmount }} {{ $t('medication.bill.currencyUnit') }} </span>
<span v-else>{{ '-' }}</span> <span v-else>{{ '-' }}</span>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="申请人" :title="$t('medication.bill.applicant')"
align="center" align="center"
field="applicantId_dictText" field="applicantId_dictText"
> >
@@ -148,7 +148,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="申请时间" :title="$t('medication.bill.applyTime')"
align="center" align="center"
field="applyTime" field="applyTime"
width="180" width="180"
@@ -158,7 +158,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="审批人" :title="$t('medication.bill.approver')"
align="center" align="center"
field="approverId_dictText" field="approverId_dictText"
> >
@@ -167,7 +167,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="审批时间" :title="$t('medication.bill.approvalTime')"
align="center" align="center"
field="approvalTime" field="approvalTime"
width="180" width="180"
@@ -177,7 +177,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="操作" :title="$t('medication.bill.operation')"
align="center" align="center"
width="200" width="200"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -189,14 +189,14 @@
:disabled="scope.row.statusEnum == 3 || scope.row.statusEnum == 4" :disabled="scope.row.statusEnum == 3 || scope.row.statusEnum == 4"
@click="handelApplys(scope.row, 'apply')" @click="handelApplys(scope.row, 'apply')"
> >
审批 {{ $t('medication.bill.approve') }}
</el-button> </el-button>
<el-button <el-button
link link
type="primary" type="primary"
@click="handelApplys(scope.row, 'view')" @click="handelApplys(scope.row, 'view')"
> >
查看 {{ $t('medication.bill.view') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -235,7 +235,9 @@ import {useStore} from '@/store/store';
import {formatDate} from '@/utils/index'; import {formatDate} from '@/utils/index';
import ChkstockDetailsDialog from '@/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue'; import ChkstockDetailsDialog from '@/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue';
import TransferDetailsDialog from '@/views/medicationmanagement/transferManagent/components/transferDetailsDialog.vue'; import TransferDetailsDialog from '@/views/medicationmanagement/transferManagent/components/transferDetailsDialog.vue';
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const store = useStore(); const store = useStore();
@@ -274,108 +276,90 @@ function getList() {
function handelApply(row) { function handelApply(row) {
if (row.typeEnum == 2 || row.typeEnum == 8) { if (row.typeEnum == 2 || row.typeEnum == 8) {
//商品调拨 8 批量
productTransferApproved(row.supplyBusNo).then((res) => { productTransferApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} else if (row.typeEnum == 7) { } else if (row.typeEnum == 7) {
//领用出库审批通过
requisitionIssueApproved(row.supplyBusNo).then((res) => { requisitionIssueApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} else if (row.typeEnum == 9) { } else if (row.typeEnum == 9) {
//领用退库审批通过
returnIssueApproved(row.supplyBusNo).then((res) => { returnIssueApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} else if (row.typeEnum == 4 || row.typeEnum == 10) { } else if (row.typeEnum == 4 || row.typeEnum == 10) {
//盘点审批 批量盘点10通过
productStocktakingApproved(row.supplyBusNo).then((res) => { productStocktakingApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} else if (row.typeEnum == 6) { } else if (row.typeEnum == 6) {
// 报损审批通过
lossReportApproved(row.supplyBusNo).then((res) => { lossReportApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} else { } else {
purchaseInventoryApproved(row.supplyBusNo).then((res) => { purchaseInventoryApproved(row.supplyBusNo).then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess(t('medication.bill.operationSuccess'));
getList(); getList();
} }
}); });
} }
} }
// 审批,查看
function handelApplys(row, view) { function handelApplys(row, view) {
if (row.typeEnum == 100086) { if (row.typeEnum == 100086) {
//商品调拨
// 跳转到审核页面
router.replace({ router.replace({
path: '/medicationmanagement/transferManagement/transferManagent', path: '/medicationmanagement/transferManagement/transferManagent',
query: { supplyBusNo: row.supplyBusNo, view: view }, query: { supplyBusNo: row.supplyBusNo, view: view },
}); });
} else if (row.typeEnum == 8 || row.typeEnum == 2) { } else if (row.typeEnum == 8 || row.typeEnum == 2) {
//8 批量
isApply.value = true; isApply.value = true;
proxy.$refs['tranDetailsDialogRef'].open(row.supplyBusNo); proxy.$refs['tranDetailsDialogRef'].open(row.supplyBusNo);
} else if (row.typeEnum == 7) { } else if (row.typeEnum == 7) {
//领用出库审批通过
router.replace({ router.replace({
path: '/medicationmanagement/requisitionManagement/requisitionManagement', path: '/medicationmanagement/requisitionManagement/requisitionManagement',
query: { supplyBusNo: row.supplyBusNo, view: view }, query: { supplyBusNo: row.supplyBusNo, view: view },
}); });
} else if (row.typeEnum == 9) { } else if (row.typeEnum == 9) {
//领用退库审批通过
router.replace({ router.replace({
path: '/medicationmanagement/requisitionManagement/returningInventory', path: '/medicationmanagement/requisitionManagement/returningInventory',
query: { supplyBusNo: row.supplyBusNo, view: view }, query: { supplyBusNo: row.supplyBusNo, view: view },
}); });
} else if (row.typeEnum == 4) { } else if (row.typeEnum == 4) {
isApply.value = true; isApply.value = true;
//盘点审批
proxy.$refs['detailsDialogRef'].open(row.supplyBusNo); proxy.$refs['detailsDialogRef'].open(row.supplyBusNo);
} else if (row.typeEnum == 10) { } else if (row.typeEnum == 10) {
// 批量盘点
router.replace({ router.replace({
path: '/medicationmanagement/chkstock/chkstockBatch', path: '/medicationmanagement/chkstock/chkstockBatch',
query: { supplyBusNo: row.supplyBusNo, view: view }, query: { supplyBusNo: row.supplyBusNo, view: view },
}); });
} else if (row.typeEnum == 6) { } else if (row.typeEnum == 6) {
// 报损审批通过
router.replace({ router.replace({
path: '/medicationmanagement/lossReportingManagement/lossReportingManagement', path: '/medicationmanagement/lossReportingManagement/lossReportingManagement',
query: { supplyBusNo: row.supplyBusNo, view: view }, query: { supplyBusNo: row.supplyBusNo, view: view },
}); });
} else if (row.typeEnum == 5) { } else if (row.typeEnum == 5) {
// 采购退货通过5
router.replace({ router.replace({
path: '/medicationmanagement/medicationmanagement/returnedPurchase', path: '/medicationmanagement/medicationmanagement/returnedPurchase',
query: { originalSupplyBusNo: row.supplyBusNo, view: view }, query: { originalSupplyBusNo: row.supplyBusNo, view: view },
}); });
// });
} else { } else {
// 采购入库 1
getpurchaseInventoryDetail(row.supplyBusNo).then((response) => { getpurchaseInventoryDetail(row.supplyBusNo).then((response) => {
let currentData = response.data; let currentData = response.data;
// 从明细数据中获取仓库ID并设置到row确保跳转后仓库字段能正确显示
if (currentData && currentData.length > 0 && !row.purposeLocationId) { if (currentData && currentData.length > 0 && !row.purposeLocationId) {
row.purposeLocationId = currentData[0].purposeLocationId; row.purposeLocationId = currentData[0].purposeLocationId;
row.purposeLocationId_dictText = currentData[0].purposeLocationName; row.purposeLocationId_dictText = currentData[0].purposeLocationName;
@@ -431,4 +415,4 @@ function optionInit() {
float: right; float: right;
margin-left: 10px; margin-left: 10px;
} }
</style> </style>

View File

@@ -7,34 +7,34 @@
:inline="true" :inline="true"
label-width="90px" label-width="90px"
> >
<el-form-item label="查询日期:"> <el-form-item :label="$t('medication.dayEnd.queryDate')">
<el-date-picker <el-date-picker
v-model="queryTime" v-model="queryTime"
type="daterange" type="daterange"
start-placeholder="开始日期" :start-placeholder="$t('medication.dayEnd.startDate')"
end-placeholder="结束日期" :end-placeholder="$t('medication.dayEnd.endDate')"
style="width: 300px; margin-right: 20px" style="width: 300px; margin-right: 20px"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@change="handleQuery" @change="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="结算类型:"> <el-form-item :label="$t('medication.dayEnd.settlementType')">
<el-select <el-select
v-model="queryParams.settlementType" v-model="queryParams.settlementType"
placeholder="结算类型" :placeholder="$t('medication.dayEnd.settlementType')"
clearable clearable
style="width: 150px; margin-right: 30px" style="width: 150px; margin-right: 30px"
> >
<el-option <el-option
label="日结" :label="$t('medication.dayEnd.daily')"
value="daily" value="daily"
/> />
<el-option <el-option
label="周结" :label="$t('medication.dayEnd.weekly')"
value="weekly" value="weekly"
/> />
<el-option <el-option
label="月结" :label="$t('medication.dayEnd.monthly')"
value="monthly" value="monthly"
/> />
</el-select> </el-select>
@@ -44,7 +44,7 @@
icon="Search" icon="Search"
@click="handleQuery" @click="handleQuery"
> >
查询 {{ $t('medication.dayEnd.search') }}
</el-button> </el-button>
<el-button <el-button
type="primary" type="primary"
@@ -52,7 +52,7 @@
icon="Printer" icon="Printer"
@click="handlePrint" @click="handlePrint"
> >
打印 {{ $t('medication.dayEnd.print') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -69,7 +69,7 @@
icon="Plus" icon="Plus"
@click="handleAdd" @click="handleAdd"
> >
新增 {{ $t('medication.dayEnd.add') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -81,7 +81,7 @@
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
> >
修改 {{ $t('medication.dayEnd.edit') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -93,7 +93,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
> >
删除 {{ $t('medication.dayEnd.delete') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -104,7 +104,7 @@
icon="Download" icon="Download"
@click="handleExport" @click="handleExport"
> >
导出 {{ $t('medication.dayEnd.export') }}
</el-button> </el-button>
</el-col> </el-col>
<right-toolbar <right-toolbar
@@ -124,12 +124,12 @@
align="center" align="center"
/> />
<vxe-column <vxe-column
title="结算单号" :title="$t('medication.dayEnd.settlementNo')"
align="center" align="center"
field="settlementNo" field="settlementNo"
/> />
<vxe-column <vxe-column
title="结算日期" :title="$t('medication.dayEnd.settlementDate')"
align="center" align="center"
field="settlementDate" field="settlementDate"
width="180" width="180"
@@ -139,12 +139,12 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="结算类型" :title="$t('medication.dayEnd.settlementTypeCol')"
align="center" align="center"
field="settlementType" field="settlementType"
/> />
<vxe-column <vxe-column
title="结算状态" :title="$t('medication.dayEnd.settlementStatus')"
align="center" align="center"
field="status" field="status"
> >
@@ -156,17 +156,17 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="总金额" :title="$t('medication.dayEnd.totalAmount')"
align="center" align="center"
field="totalAmount" field="totalAmount"
/> />
<vxe-column <vxe-column
title="操作人" :title="$t('medication.dayEnd.operator')"
align="center" align="center"
field="operator" field="operator"
/> />
<vxe-column <vxe-column
title="操作时间" :title="$t('medication.dayEnd.operationTime')"
align="center" align="center"
field="createTime" field="createTime"
width="180" width="180"
@@ -176,7 +176,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="操作" :title="$t('medication.dayEnd.operation')"
align="center" align="center"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
> >
@@ -188,7 +188,7 @@
icon="View" icon="View"
@click="handleView(scope.row)" @click="handleView(scope.row)"
> >
查看 {{ $t('medication.dayEnd.view') }}
</el-button> </el-button>
<el-button <el-button
v-hasPermi="['medication:dayEndSettlement:edit']" v-hasPermi="['medication:dayEndSettlement:edit']"
@@ -197,7 +197,7 @@
icon="Edit" icon="Edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
> >
修改 {{ $t('medication.dayEnd.edit') }}
</el-button> </el-button>
<el-button <el-button
v-hasPermi="['medication:dayEndSettlement:remove']" v-hasPermi="['medication:dayEndSettlement:remove']"
@@ -206,7 +206,7 @@
icon="Delete" icon="Delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
> >
删除 {{ $t('medication.dayEnd.delete') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -235,16 +235,16 @@
label-width="100px" label-width="100px"
> >
<el-form-item <el-form-item
label="结算单号" :label="$t('medication.dayEnd.settlementNo')"
prop="settlementNo" prop="settlementNo"
> >
<el-input <el-input
v-model="form.settlementNo" v-model="form.settlementNo"
placeholder="请输入结算单号" :placeholder="$t('medication.dayEnd.inputSettlementNo')"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="结算日期" :label="$t('medication.dayEnd.settlementDate')"
prop="settlementDate" prop="settlementDate"
> >
<el-date-picker <el-date-picker
@@ -252,33 +252,33 @@
clearable clearable
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="请选择结算日期" :placeholder="$t('medication.dayEnd.selectSettlementDate')"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="结算类型" :label="$t('medication.dayEnd.settlementTypeCol')"
prop="settlementType" prop="settlementType"
> >
<el-select <el-select
v-model="form.settlementType" v-model="form.settlementType"
placeholder="请选择结算类型" :placeholder="$t('medication.dayEnd.selectSettlementType')"
> >
<el-option <el-option
label="日结" :label="$t('medication.dayEnd.daily')"
value="daily" value="daily"
/> />
<el-option <el-option
label="周结" :label="$t('medication.dayEnd.weekly')"
value="weekly" value="weekly"
/> />
<el-option <el-option
label="月结" :label="$t('medication.dayEnd.monthly')"
value="monthly" value="monthly"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="结算状态" :label="$t('medication.dayEnd.settlementStatus')"
prop="status" prop="status"
> >
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
@@ -292,23 +292,23 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="总金额" :label="$t('medication.dayEnd.totalAmount')"
prop="totalAmount" prop="totalAmount"
> >
<el-input-number <el-input-number
v-model="form.totalAmount" v-model="form.totalAmount"
placeholder="请输入总金额" :placeholder="$t('medication.dayEnd.inputTotalAmount')"
style="width: 100%" style="width: 100%"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="备注" :label="$t('medication.dayEnd.remark')"
prop="remark" prop="remark"
> >
<el-input <el-input
v-model="form.remark" v-model="form.remark"
type="textarea" type="textarea"
placeholder="请输入内容" :placeholder="$t('medication.dayEnd.inputContent')"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -318,10 +318,10 @@
type="primary" type="primary"
@click="submitForm" @click="submitForm"
> >
{{ $t('medication.dayEnd.confirm') }}
</el-button> </el-button>
<el-button @click="cancel"> <el-button @click="cancel">
{{ $t('medication.dayEnd.cancel') }}
</el-button> </el-button>
</div> </div>
</template> </template>
@@ -331,7 +331,9 @@
<script setup name="DayEndSettlement"> <script setup name="DayEndSettlement">
import { listDayEndSettlement, getDayEndSettlement, delDayEndSettlement, addDayEndSettlement, updateDayEndSettlement } from "@/api/medicationmanagement/dayEndSettlement"; import { listDayEndSettlement, getDayEndSettlement, delDayEndSettlement, addDayEndSettlement, updateDayEndSettlement } from "@/api/medicationmanagement/dayEndSettlement";
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
@@ -357,20 +359,20 @@ const queryParams = ref({
}); });
const form = ref({}); const form = ref({});
const rules = ref({ const rules = computed(() => ({
settlementNo: [ settlementNo: [
{ required: true, message: "结算单号不能为空", trigger: "blur" } { required: true, message: t('medication.dayEnd.settlementNoRequired'), trigger: "blur" }
], ],
settlementDate: [ settlementDate: [
{ required: true, message: "结算日期不能为空", trigger: "blur" } { required: true, message: t('medication.dayEnd.settlementDateRequired'), trigger: "blur" }
], ],
settlementType: [ settlementType: [
{ required: true, message: "结算类型不能为空", trigger: "change" } { required: true, message: t('medication.dayEnd.settlementTypeRequired'), trigger: "change" }
], ],
totalAmount: [ totalAmount: [
{ required: true, message: "总金额不能为空", trigger: "blur" } { required: true, message: t('medication.dayEnd.totalAmountRequired'), trigger: "blur" }
] ]
}); }));
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
@@ -382,7 +384,7 @@ const getList = async () => {
dayEndSettlementList.value = response.rows; dayEndSettlementList.value = response.rows;
total.value = response.total; total.value = response.total;
} catch (error) { } catch (error) {
console.error('获取日结结算单列表失败:', error); console.error(t('medication.dayEnd.getListFailed'), error);
} finally { } finally {
loading.value = false; loading.value = false;
} }
@@ -432,7 +434,7 @@ const handleSelectionChange = (selection) => {
const handleAdd = () => { const handleAdd = () => {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加日结结算单"; title.value = t('medication.dayEnd.addTitle');
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
@@ -442,7 +444,7 @@ const handleUpdate = (row) => {
getDayEndSettlement(settlementId).then(response => { getDayEndSettlement(settlementId).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改日结结算单"; title.value = t('medication.dayEnd.editTitle');
}); });
}; };
@@ -452,13 +454,13 @@ const submitForm = () => {
if (valid) { if (valid) {
if (form.value.id != null) { if (form.value.id != null) {
updateDayEndSettlement(form.value).then(response => { updateDayEndSettlement(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess(t('medication.dayEnd.editSuccess'));
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addDayEndSettlement(form.value).then(response => { addDayEndSettlement(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess(t('medication.dayEnd.addSuccess'));
open.value = false; open.value = false;
getList(); getList();
}); });
@@ -470,11 +472,11 @@ const submitForm = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = (row) => { const handleDelete = (row) => {
const settlementIds = row.id || ids.value; const settlementIds = row.id || ids.value;
proxy.$modal.confirm('是否确认删除日结结算单编号为"' + settlementIds + '"的数据项?').then(function() { proxy.$modal.confirm(t('medication.dayEnd.confirmDelete', { id: settlementIds })).then(function() {
return delDayEndSettlement(settlementIds); return delDayEndSettlement(settlementIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess(t('medication.dayEnd.deleteSuccess'));
}).catch(() => {}); }).catch(() => {});
}; };
@@ -488,15 +490,15 @@ const handleExport = () => {
/** 打印按钮操作 */ /** 打印按钮操作 */
const handlePrint = () => { const handlePrint = () => {
// TODO: 实现打印功能 // TODO: 实现打印功能
proxy.$modal.msgSuccess("打印功能待实现"); proxy.$modal.msgSuccess(t('medication.dayEnd.printNotImplemented'));
}; };
/** 查看按钮操作 */ /** 查看按钮操作 */
const handleView = (row) => { const handleView = (row) => {
// TODO: 实现查看功能 // TODO: 实现查看功能
proxy.$modal.msgSuccess("查看功能待实现"); proxy.$modal.msgSuccess(t('medication.dayEnd.viewNotImplemented'));
}; };
/** 初始化数据 */ /** 初始化数据 */
getList(); getList();
</script> </script>

View File

@@ -5,7 +5,7 @@
<el-select <el-select
v-model="searchParams.locationId" v-model="searchParams.locationId"
class="table-header-search" class="table-header-search"
placeholder="请选择库房" :placeholder="$t('medication.pharmacy.selectWarehouse')"
> >
<el-option <el-option
v-for="item in locationOptions" v-for="item in locationOptions"
@@ -17,7 +17,7 @@
<el-date-picker <el-date-picker
v-model="searchParams.startTime" v-model="searchParams.startTime"
type="date" type="date"
placeholder="选择开始时间" :placeholder="$t('medication.pharmacy.selectStartTime')"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="margin-right: 15px" style="margin-right: 15px"
/> />
@@ -26,7 +26,7 @@
v-model="searchParams.endTime" v-model="searchParams.endTime"
class="table-header-search" class="table-header-search"
type="date" type="date"
placeholder="选择结束时间" :placeholder="$t('medication.pharmacy.selectEndTime')"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
/> />
<el-button <el-button
@@ -34,13 +34,13 @@
type="primary" type="primary"
@click="handleSearch" @click="handleSearch"
> >
查询 {{ $t('medication.pharmacy.search') }}
</el-button> </el-button>
<el-button <el-button
class="table-header-button" class="table-header-button"
@click="resetForm" @click="resetForm"
> >
重置 {{ $t('medication.pharmacy.reset') }}
</el-button> </el-button>
</div> </div>
@@ -54,19 +54,19 @@
> >
<vxe-column <vxe-column
field="locationId_dictText" field="locationId_dictText"
title="库房" :title="$t('medication.pharmacy.warehouse')"
min-width="150" min-width="150"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
field="initialAmount" field="initialAmount"
title="期初金额" :title="$t('medication.pharmacy.initialAmount')"
min-width="160" min-width="160"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="finalAmount" field="finalAmount"
title="期末金额" :title="$t('medication.pharmacy.finalAmount')"
min-width="160" min-width="160"
align="right" align="right"
> >
@@ -81,19 +81,19 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="expectFinalAmount" field="expectFinalAmount"
title="预期期末金额" :title="$t('medication.pharmacy.expectedFinalAmount')"
min-width="160" min-width="160"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="offsetAmount" field="offsetAmount"
title="偏移量" :title="$t('medication.pharmacy.offsetAmount')"
min-width="100" min-width="100"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="purchaseInAmount" field="purchaseInAmount"
title="采购入库金额" :title="$t('medication.pharmacy.purchaseInAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -108,13 +108,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="purchaseInNumber" field="purchaseInNumber"
title="采购入库单据数" :title="$t('medication.pharmacy.purchaseInDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="purchaseReturnAmount" field="purchaseReturnAmount"
title="采购出库金额" :title="$t('medication.pharmacy.purchaseOutAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -129,13 +129,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="purchaseReturnNumber" field="purchaseReturnNumber"
title="采购出库单据数" :title="$t('medication.pharmacy.purchaseOutDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="applyOutAmount" field="applyOutAmount"
title="领用出库金额" :title="$t('medication.pharmacy.requisitionOutAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -150,13 +150,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="applyOutNumber" field="applyOutNumber"
title="领用出库单据数" :title="$t('medication.pharmacy.requisitionOutDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="applyReturnAmount" field="applyReturnAmount"
title="领用退货金额" :title="$t('medication.pharmacy.requisitionReturnAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -171,13 +171,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="applyReturnNumber" field="applyReturnNumber"
title="领用退货单据数" :title="$t('medication.pharmacy.requisitionReturnDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="transferInAmount" field="transferInAmount"
title="调拨入库金额" :title="$t('medication.pharmacy.transferInAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -192,13 +192,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="transferInNumber" field="transferInNumber"
title="调拨入库单据数" :title="$t('medication.pharmacy.transferInDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="transferOutAmount" field="transferOutAmount"
title="调拨出库金额" :title="$t('medication.pharmacy.transferOutAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -213,13 +213,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="transferOutNumber" field="transferOutNumber"
title="调拨出库单据数" :title="$t('medication.pharmacy.transferOutDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="checkProfitLossAmount" field="checkProfitLossAmount"
title="盘点盈亏金额" :title="$t('medication.pharmacy.stocktakeAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -234,13 +234,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="checkProfitLossNumber" field="checkProfitLossNumber"
title="盘点盈亏单据数" :title="$t('medication.pharmacy.stocktakeDocs')"
min-width="120" min-width="120"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="lossAmount" field="lossAmount"
title="报损金额" :title="$t('medication.pharmacy.lossAmount')"
min-width="100" min-width="100"
align="right" align="right"
> >
@@ -255,13 +255,13 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
field="lossNumber" field="lossNumber"
title="报损单据数" :title="$t('medication.pharmacy.lossDocs')"
min-width="100" min-width="100"
align="right" align="right"
/> />
<vxe-column <vxe-column
field="drugIssueAmount" field="drugIssueAmount"
title="药品发放金额" :title="$t('medication.pharmacy.drugIssueAmount')"
min-width="120" min-width="120"
align="right" align="right"
> >
@@ -282,40 +282,29 @@
<script setup> <script setup>
import {onMounted, reactive, ref} from 'vue'; import {onMounted, reactive, ref} from 'vue';
import {ElMessage} from 'element-plus'; import {ElMessage} from 'element-plus';
// 导入路由钩子
import {useRouter} from 'vue-router'; import {useRouter} from 'vue-router';
// 假设API模块存在实际项目中需要根据实际情况导入
import {getList, getPharmacyList} from './components/api.js'; import {getList, getPharmacyList} from './components/api.js';
import {useI18n} from "vue-i18n";
// 创建路由实例 const {t} = useI18n();
const router = useRouter(); const router = useRouter();
// 搜索参数
const searchParams = reactive({ const searchParams = reactive({
locationId: '', locationId: '',
startTime: '', startTime: '',
endTime: '' endTime: ''
}); });
// 搜索表单引用
const searchFormRef = ref(null); const searchFormRef = ref(null);
// 库房选项
const locationOptions = ref([]); const locationOptions = ref([]);
// 对账数据
const reconciliationData = ref([]); const reconciliationData = ref([]);
// 加载状态
const loading = ref(false); const loading = ref(false);
// 格式化金额
const formatMoney = (value) => { const formatMoney = (value) => {
if (value === null || value === undefined) return '0.00'; if (value === null || value === undefined) return '0.00';
return Number(value).toFixed(2); return Number(value).toFixed(2);
}; };
// 格式化日期为YYYY-MM-DD
const formatDate = (date) => { const formatDate = (date) => {
const year = date.getFullYear(); const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0');
@@ -323,23 +312,18 @@ const formatDate = (date) => {
return `${year}-${month}-${day}`; return `${year}-${month}-${day}`;
}; };
// 设置默认日期范围(今日之前一个月)
const setDefaultDateRange = () => { const setDefaultDateRange = () => {
const today = new Date(); const today = new Date();
// 结束时间为昨天
const endDate = new Date(today); const endDate = new Date(today);
endDate.setDate(today.getDate() - 1); endDate.setDate(today.getDate() - 1);
// 开始时间为一个月前的今天
const startDate = new Date(today); const startDate = new Date(today);
startDate.setMonth(today.getMonth() - 1); startDate.setMonth(today.getMonth() - 1);
// 处理月份溢出如1月减1个月变为12月
if (startDate.getMonth() === 11 && today.getMonth() === 0) { if (startDate.getMonth() === 11 && today.getMonth() === 0) {
startDate.setFullYear(today.getFullYear() - 1); startDate.setFullYear(today.getFullYear() - 1);
} }
// 确保日期有效性(处理不同月份天数差异)
const lastDayOfMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0).getDate(); const lastDayOfMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0).getDate();
if (startDate.getDate() > lastDayOfMonth) { if (startDate.getDate() > lastDayOfMonth) {
startDate.setDate(lastDayOfMonth); startDate.setDate(lastDayOfMonth);
@@ -349,26 +333,21 @@ const setDefaultDateRange = () => {
searchParams.endTime = formatDate(endDate); searchParams.endTime = formatDate(endDate);
}; };
// 查询数据
const handleSearch = async () => { const handleSearch = async () => {
try { try {
loading.value = true; loading.value = true;
// 构建查询参数并拼接时间
const params = { const params = {
locationId: searchParams.locationId locationId: searchParams.locationId
}; };
// 处理开始时间,拼接 00:00:00
if (searchParams.startTime) { if (searchParams.startTime) {
params.startTime = searchParams.startTime + ' 00:00:00'; params.startTime = searchParams.startTime + ' 00:00:00';
} }
// 处理结束时间,拼接 00:00:00
if (searchParams.endTime) { if (searchParams.endTime) {
params.endTime = searchParams.endTime + ' 00:00:00'; params.endTime = searchParams.endTime + ' 00:00:00';
} }
// 调用API获取数据实际项目中替换为真实API调用
const response = await getList(params); const response = await getList(params);
loading.value = false; loading.value = false;
console.log('查询结果:', response) console.log('查询结果:', response)
@@ -376,81 +355,72 @@ const handleSearch = async () => {
reconciliationData.value.push(response.data.data) reconciliationData.value.push(response.data.data)
} catch (error) { } catch (error) {
ElMessage.error('获取对账数据失败: ' + (error.message || '未知错误')); ElMessage.error(t('medication.pharmacy.getReconciliationFailed') + ': ' + (error.message || t('medication.pharmacy.unknownError')));
console.error('Failed to get reconciliation data:', error); console.error('Failed to get reconciliation data:', error);
} finally { } finally {
loading.value = false; loading.value = false;
} }
}; };
// 重置表单
const resetForm = () => { const resetForm = () => {
searchFormRef.value?.resetFields(); searchFormRef.value?.resetFields();
// 重置后重新设置默认日期范围
setDefaultDateRange(); setDefaultDateRange();
}; };
// 获取库房列表
const getLocationList = async () => { const getLocationList = async () => {
try { try {
// 调用API获取库房数据实际项目中替换为真实API调用
const response = await getPharmacyList(); const response = await getPharmacyList();
locationOptions.value = response.data.locationListOptions || []; locationOptions.value = response.data.locationListOptions || [];
// 默认选择第一个库房
if (locationOptions.value.length > 0) { if (locationOptions.value.length > 0) {
searchParams.locationId = locationOptions.value[0].value; searchParams.locationId = locationOptions.value[0].value;
} }
handleSearch() handleSearch()
} catch (error) { } catch (error) {
ElMessage.error('获取库房数据失败: ' + (error.message || '未知错误')); ElMessage.error(t('medication.pharmacy.getWarehouseFailed') + ': ' + (error.message || t('medication.pharmacy.unknownError')));
console.error('Failed to get location list:', error); console.error('Failed to get location list:', error);
} }
}; };
// 跳转到对应页面的函数
const skipToPage = (records, index) => { const skipToPage = (records, index) => {
// 获取当前选中的库房ID和日期范围
const { startTime, endTime } = searchParams; const { startTime, endTime } = searchParams;
console.log(records.row) console.log(records.row)
const { locationId } = records.row; const { locationId } = records.row;
// 根据index跳转到不同页面
let path = ''; let path = '';
switch (index) { switch (index) {
case 1: case 1:
path = '/aa/4/chkstockPartDetails'; // 库存 path = '/aa/4/chkstockPartDetails';
break; break;
case 2: case 2:
path = '/aa/4/purchaseDocumentDetsils'; // 采购入库页 path = '/aa/4/purchaseDocumentDetsils';
break; break;
case 3: case 3:
path = '/aa/4/purchaseReturnDetsils'; // 采购退货页 path = '/aa/4/purchaseReturnDetsils';
break; break;
case 4: case 4:
path = '/aa/4/requisitionDetails'; // 领用出库页 path = '/aa/4/requisitionDetails';
break; break;
case 5: case 5:
path = '/aa/4/returnOrutboundDetails'; // 领用退库页 path = '/aa/4/returnOrutboundDetails';
break; break;
case 6: case 6:
case 10: case 10:
path = '/aa/4/transferManagentDetails'; // 调拨页 path = '/aa/4/transferManagentDetails';
break; break;
case 7: case 7:
path = '/aa/4/chkstockPartDetails'; // 盘点页 path = '/aa/4/chkstockPartDetails';
break; break;
case 8: case 8:
path = '/aa/4/lossReportingDetails'; // 报损页 path = '/aa/4/lossReportingDetails';
break; break;
case 9: case 9:
path = '/aa/3/medicationDetails'; // 药品发放 path = '/aa/3/medicationDetails';
break; break;
default: default:
ElMessage.warning('无效的页面索引'); ElMessage.warning(t('medication.pharmacy.invalidPageIndex'));
return; return;
} }
// 跳转到对应页面并传递参数
if(index === 10) { if(index === 10) {
router.push({ router.push({
path: path, path: path,
@@ -483,9 +453,7 @@ const skipToPage = (records, index) => {
} }
// 组件初始化
onMounted(() => { onMounted(() => {
// 设置默认日期范围
setDefaultDateRange(); setDefaultDateRange();
getLocationList(); getLocationList();
}); });

View File

@@ -8,19 +8,19 @@
label-width="90px" label-width="90px"
> >
<el-form-item <el-form-item
label="单据号:" :label="$t('medication.purchase.documentNo')"
prop="busNo" prop="busNo"
> >
<el-input <el-input
v-model="queryParams.searchKey" v-model="queryParams.searchKey"
placeholder="单据号:" :placeholder="$t('medication.purchase.documentNo')"
clearable clearable
style="width: 220px" style="width: 220px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="审批状态:" :label="$t('medication.purchase.approvalStatus')"
prop="statusEnum" prop="statusEnum"
> >
<el-select <el-select
@@ -40,7 +40,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="单据类型:" :label="$t('medication.purchase.documentType')"
prop="typeEnum" prop="typeEnum"
> >
<el-select <el-select
@@ -59,7 +59,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="供应商:" :label="$t('medication.purchase.supplier')"
prop="supplierId" prop="supplierId"
> >
<el-select <el-select
@@ -78,7 +78,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="经手人:" :label="$t('medication.purchase.handler')"
prop="practitionerId" prop="practitionerId"
> >
<el-select <el-select
@@ -96,14 +96,14 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="查询时间:"> <el-form-item :label="$t('medication.purchase.queryTime')">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
type="daterange" type="daterange"
range-separator="-" range-separator="-"
start-placeholder="开始日期" :start-placeholder="$t('medication.purchase.startDate')"
end-placeholder="结束日期" :end-placeholder="$t('medication.purchase.endDate')"
style="width: 300px" style="width: 300px"
/> />
</el-form-item> </el-form-item>
@@ -121,7 +121,7 @@
icon="Plus" icon="Plus"
@click="openAddInventoryReceiptDialog" @click="openAddInventoryReceiptDialog"
> >
采购入库 {{ $t('medication.purchase.purchaseInbound') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -133,7 +133,7 @@
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
> >
删除 {{ $t('medication.purchase.delete') }}
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -144,7 +144,7 @@
icon="Search" icon="Search"
@click="handleQuery" @click="handleQuery"
> >
查询 {{ $t('medication.purchase.search') }}
</el-button> </el-button>
</el-col> </el-col>
<!-- v-hasPermi="['system:user:export']" --> <!-- v-hasPermi="['system:user:export']" -->
@@ -155,7 +155,7 @@
icon="CircleClose" icon="CircleClose"
@click="handleClear" @click="handleClear"
> >
重置 {{ $t('medication.purchase.reset') }}
</el-button> </el-button>
</el-col> </el-col>
</el-row> </el-row>
@@ -173,58 +173,58 @@
/> />
<vxe-column <vxe-column
key="supplyBusNo" key="supplyBusNo"
title="单据号" :title="$t('medication.purchase.documentNo')"
align="center" align="center"
field="supplyBusNo" field="supplyBusNo"
width="200" width="200"
/> />
<vxe-column <vxe-column
key="returnStatus_text" key="returnStatus_text"
title="退库状态" :title="$t('medication.purchase.returnStatus')"
align="center" align="center"
field="returnStatus_text" field="returnStatus_text"
/> />
<vxe-column <vxe-column
key="statusEnum_enumText" key="statusEnum_enumText"
title="审批状态" :title="$t('medication.purchase.approvalStatus')"
align="center" align="center"
field="statusEnum_enumText" field="statusEnum_enumText"
/> />
<vxe-column <vxe-column
key="typeEnum_enumText" key="typeEnum_enumText"
title="单据类型" :title="$t('medication.purchase.documentType')"
align="center" align="center"
field="typeEnum_enumText" field="typeEnum_enumText"
/> />
<vxe-column <vxe-column
key="supplierId_dictText" key="supplierId_dictText"
title="供应商" :title="$t('medication.purchase.supplier')"
align="center" align="center"
field="supplierId_dictText" field="supplierId_dictText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="practitionerId_dictText" key="practitionerId_dictText"
title="经手人" :title="$t('medication.purchase.handler')"
align="center" align="center"
field="practitionerId_dictText" field="practitionerId_dictText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="applicantId_dictText" key="applicantId_dictText"
title="制单人" :title="$t('medication.purchase.creator')"
align="center" align="center"
field="applicantId_dictText" field="applicantId_dictText"
/> />
<vxe-column <vxe-column
key="approverId_dictText" key="approverId_dictText"
title="审核人" :title="$t('medication.purchase.approver')"
align="center" align="center"
field="approverId_dictText" field="approverId_dictText"
/> />
<vxe-column <vxe-column
key="createTime" key="createTime"
title="制单日期" :title="$t('medication.purchase.createTime')"
align="center" align="center"
field="createTime" field="createTime"
width="180" width="180"
@@ -235,7 +235,7 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
key="approvalTime" key="approvalTime"
title="审核日期 " :title="$t('medication.purchase.approvalTime')"
align="center" align="center"
field="approvalTime" field="approvalTime"
width="180" width="180"
@@ -245,7 +245,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="操作" :title="$t('medication.purchase.operation')"
align="center" align="center"
width="230" width="230"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -258,7 +258,7 @@
icon="View" icon="View"
@click.stop="handleUpdate(scope.row, 'view')" @click.stop="handleUpdate(scope.row, 'view')"
> >
详情 {{ $t('medication.purchase.detail') }}
</el-button> </el-button>
<el-button <el-button
link link
@@ -271,7 +271,7 @@
" "
@click.stop="handleUpdate(scope.row)" @click.stop="handleUpdate(scope.row)"
> >
编辑 {{ $t('medication.purchase.edit') }}
</el-button> </el-button>
<!-- v-hasPermi="['system:user:edit']" --> <!-- v-hasPermi="['system:user:edit']" -->
<el-button <el-button
@@ -281,7 +281,7 @@
icon="Edit" icon="Edit"
@click.stop="handleUpdateTK(scope.row)" @click.stop="handleUpdateTK(scope.row)"
> >
退库 {{ $t('medication.purchase.returnGoods') }}
</el-button> </el-button>
<!-- v-hasPermi="['system:user:remove']" --> <!-- v-hasPermi="['system:user:remove']" -->
<el-button <el-button
@@ -291,7 +291,7 @@
icon="View" icon="View"
@click.stop="handleSubmitApproval(scope.row)" @click.stop="handleSubmitApproval(scope.row)"
> >
提交审批 {{ $t('medication.purchase.submitApproval') }}
</el-button> </el-button>
<!-- v-hasPermi="['system:user:remove']" --> <!-- v-hasPermi="['system:user:remove']" -->
<el-button <el-button
@@ -301,7 +301,7 @@
icon="View" icon="View"
@click.stop="handleWithdrawApproval(scope.row)" @click.stop="handleWithdrawApproval(scope.row)"
> >
撤销审批 {{ $t('medication.purchase.withdrawApproval') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -328,52 +328,52 @@
/> />
<vxe-column <vxe-column
key="supplyBusNo" key="supplyBusNo"
title="单据号" :title="$t('medication.purchase.documentNo')"
align="center" align="center"
field="supplyBusNo" field="supplyBusNo"
width="200" width="200"
/> />
<vxe-column <vxe-column
key="statusEnum_enumText" key="statusEnum_enumText"
title="审批状态" :title="$t('medication.purchase.approvalStatus')"
align="center" align="center"
field="statusEnum_enumText" field="statusEnum_enumText"
/> />
<vxe-column <vxe-column
key="typeEnum_enumText" key="typeEnum_enumText"
title="单据类型" :title="$t('medication.purchase.documentType')"
align="center" align="center"
field="typeEnum_enumText" field="typeEnum_enumText"
/> />
<vxe-column <vxe-column
key="supplierId_dictText" key="supplierId_dictText"
title="供应商" :title="$t('medication.purchase.supplier')"
align="center" align="center"
field="supplierId_dictText" field="supplierId_dictText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="practitionerId_dictText" key="practitionerId_dictText"
title="经手人" :title="$t('medication.purchase.handler')"
align="center" align="center"
field="practitionerId_dictText" field="practitionerId_dictText"
show-overflow="title" show-overflow="title"
/> />
<vxe-column <vxe-column
key="applicantId_dictText" key="applicantId_dictText"
title="制单人" :title="$t('medication.purchase.creator')"
align="center" align="center"
field="applicantId_dictText" field="applicantId_dictText"
/> />
<vxe-column <vxe-column
key="approverId_dictText" key="approverId_dictText"
title="审核人" :title="$t('medication.purchase.approver')"
align="center" align="center"
field="approverId_dictText" field="approverId_dictText"
/> />
<vxe-column <vxe-column
key="createTime" key="createTime"
title="制单日期" :title="$t('medication.purchase.createTime')"
align="center" align="center"
field="createTime" field="createTime"
width="180" width="180"
@@ -384,7 +384,7 @@
</vxe-column> </vxe-column>
<vxe-column <vxe-column
key="approvalTime" key="approvalTime"
title="审核日期 " :title="$t('medication.purchase.approvalTime')"
align="center" align="center"
field="approvalTime" field="approvalTime"
width="180" width="180"
@@ -394,7 +394,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column <vxe-column
title="操作" :title="$t('medication.purchase.operation')"
align="center" align="center"
width="230" width="230"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
@@ -407,7 +407,7 @@
icon="View" icon="View"
@click.stop="handleUpdateReturn(scope.row, 'view')" @click.stop="handleUpdateReturn(scope.row, 'view')"
> >
详情 {{ $t('medication.purchase.detail') }}
</el-button> </el-button>
<el-button <el-button
link link
@@ -420,7 +420,7 @@
" "
@click.stop="handleUpdateReturn(scope.row)" @click.stop="handleUpdateReturn(scope.row)"
> >
编辑 {{ $t('medication.purchase.edit') }}
</el-button> </el-button>
<!-- v-hasPermi="['system:user:remove']" --> <!-- v-hasPermi="['system:user:remove']" -->
<el-button <el-button
@@ -430,7 +430,7 @@
icon="View" icon="View"
@click.stop="handleSubmitApprovalReturn(scope.row)" @click.stop="handleSubmitApprovalReturn(scope.row)"
> >
提交审批 {{ $t('medication.purchase.submitApproval') }}
</el-button> </el-button>
<!-- v-hasPermi="['system:user:remove']" --> <!-- v-hasPermi="['system:user:remove']" -->
<el-button <el-button
@@ -440,7 +440,7 @@
icon="View" icon="View"
@click.stop="handleWithdrawApprovalReturn(scope.row)" @click.stop="handleWithdrawApprovalReturn(scope.row)"
> >
撤销审批 {{ $t('medication.purchase.withdrawApproval') }}
</el-button> </el-button>
</template> </template>
</vxe-column> </vxe-column>
@@ -473,7 +473,9 @@ import {
import {useStore} from '@/store/store'; import {useStore} from '@/store/store';
import inventoryReceiptDialog from './components/inventoryReceiptDialog'; import inventoryReceiptDialog from './components/inventoryReceiptDialog';
import {ref} from 'vue'; import {ref} from 'vue';
import {useI18n} from "vue-i18n";
const {t} = useI18n();
const router = useRouter(); const router = useRouter();
const store = useStore(); const store = useStore();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@@ -544,7 +546,7 @@ function getList() {
loading.value = false; loading.value = false;
purchaseinventoryList.value = res.data.records; purchaseinventoryList.value = res.data.records;
purchaseinventoryList.value.map((k) => { purchaseinventoryList.value.map((k) => {
k.returnStatus_text = k.returnStatus == 1 ? '已退库' : ''; k.returnStatus_text = k.returnStatus == 1 ? t('medication.purchase.returned') : '';
}); });
total.value = res.data.total; total.value = res.data.total;
}); });
@@ -576,29 +578,13 @@ function openAddInventoryReceiptDialog() {
router.push({ router.push({
path: 'purchaseDocument', path: 'purchaseDocument',
}); });
// getPurchaseinventoryTypeList();
// nextTick(() => {
// proxy.$refs["inventoryReceiptRef"].show();
// });
} }
function handleUpdateTK(row) { function handleUpdateTK(row) {
// store.clearCurrentReturnData();
editRow.value = row; editRow.value = row;
router.push({ router.push({
path: 'returnedPurchase', path: 'returnedPurchase',
query: { originalSupplyBusNo: editRow.value.supplyBusNo }, query: { originalSupplyBusNo: editRow.value.supplyBusNo },
}); });
// getpurchaseInventoryDetail(row.supplyBusNo).then((response) => {
// currentData.value = response.data;
// // nextTick(() => {
// // proxy.$refs['inventoryReceiptRef'].edit();
// // });
// store.setCurrentData({ editRow: row, item: currentData.value });
// router.push({
// path: 'purchaseDocument',
// });
// getList();
// });
} }
/** 退库修改按钮操作 */ /** 退库修改按钮操作 */
function handleUpdateReturn(row, view) { function handleUpdateReturn(row, view) {
@@ -618,45 +604,31 @@ function handleUpdateReturn(row, view) {
/** 退库提交审核按钮 */ /** 退库提交审核按钮 */
function handleSubmitApprovalReturn(row) { function handleSubmitApprovalReturn(row) {
submitApprovalReturn(row.supplyBusNo).then((response) => { submitApprovalReturn(row.supplyBusNo).then((response) => {
proxy.$modal.msgSuccess('提交审批成功'); proxy.$modal.msgSuccess(t('medication.purchase.submitApprovalSuccess'));
// open.value = false;
handleRowClick(editRowTK.value); handleRowClick(editRowTK.value);
// loadingReturn.value = false
}); });
} }
/** 退库撤回审批按钮 */ /** 退库撤回审批按钮 */
function handleWithdrawApprovalReturn(row) { function handleWithdrawApprovalReturn(row) {
withdrawApprovalReturn(row.supplyBusNo).then((response) => { withdrawApprovalReturn(row.supplyBusNo).then((response) => {
proxy.$modal.msgSuccess('撤销审批成功'); proxy.$modal.msgSuccess(t('medication.purchase.withdrawApprovalSuccess'));
// open.value = false;
handleRowClick(editRowTK.value); handleRowClick(editRowTK.value);
// loadingReturn.value = false
}); });
} }
/** 退库修改按钮操作 */ /** 退库修改按钮操作 */
function handleUpdate(row, view) { function handleUpdate(row, view) {
if (row.typeEnum == 5) { if (row.typeEnum == 5) {
//采购退货
// editRow.value = row;
// getpurchaseInventoryDetail(row.supplyBusNo).then((response) => {
// currentData.value = response.data;
// store.setCurrentData({ editRow: row, item: currentData.value });
router.push({ router.push({
path: 'returnedPurchase', path: 'returnedPurchase',
query: { supplyBusNo: row.supplyBusNo }, query: { supplyBusNo: row.supplyBusNo },
}); });
// getList();
// })
} else { } else {
// 采购入库 // 采购入库
editRow.value = row; editRow.value = row;
getpurchaseInventoryDetail(row.supplyBusNo).then((response) => { getpurchaseInventoryDetail(row.supplyBusNo).then((response) => {
console.log('返回的数据,response:', response.data) console.log('返回的数据,response:', response.data)
currentData.value = response.data; currentData.value = response.data;
// nextTick(() => {
// proxy.$refs['inventoryReceiptRef'].edit();
// });
store.setCurrentData({ editRow: row, item: currentData.value }); store.setCurrentData({ editRow: row, item: currentData.value });
if (view) { if (view) {
// 详情 // 详情
@@ -676,7 +648,7 @@ function handleUpdate(row, view) {
/** 提交审核按钮 */ /** 提交审核按钮 */
function handleSubmitApproval(row) { function handleSubmitApproval(row) {
submitApproval(row.supplyBusNo).then((response) => { submitApproval(row.supplyBusNo).then((response) => {
proxy.$modal.msgSuccess('提交审批成功'); proxy.$modal.msgSuccess(t('medication.purchase.submitApprovalSuccess'));
open.value = false; open.value = false;
getList(); getList();
}); });
@@ -685,7 +657,7 @@ function handleSubmitApproval(row) {
/** 撤回审批按钮 */ /** 撤回审批按钮 */
function handleWithdrawApproval(row) { function handleWithdrawApproval(row) {
withdrawApproval(row.supplyBusNo).then((response) => { withdrawApproval(row.supplyBusNo).then((response) => {
proxy.$modal.msgSuccess('撤销审批成功'); proxy.$modal.msgSuccess(t('medication.purchase.withdrawApprovalSuccess'));
open.value = false; open.value = false;
getList(); getList();
}); });
@@ -714,19 +686,19 @@ function handleDelete(row) {
// 检查选中记录中是否有已审批的数据 // 检查选中记录中是否有已审批的数据
const approvedRows = selectedRows.value.filter((item) => item.statusEnum); const approvedRows = selectedRows.value.filter((item) => item.statusEnum);
if (approvedRows.length > 0) { if (approvedRows.length > 0) {
proxy.$modal.msgWarning('已审批的记录不能删除'); proxy.$modal.msgWarning(t('medication.purchase.approvedCannotDelete'));
return; return;
} }
proxy.$modal proxy.$modal
.confirm('是否确认删除以上数据?') .confirm(t('medication.purchase.confirmDeleteData'))
.then(function () { .then(function () {
// 调用后端接口,根据单据号删除 // 调用后端接口,根据单据号删除
return delPurchaseinventoryByBusNo(busNoList); return delPurchaseinventoryByBusNo(busNoList);
}) })
.then(() => { .then(() => {
getList(); getList();
proxy.$modal.msgSuccess('删除成功'); proxy.$modal.msgSuccess(t('medication.purchase.deleteSuccess'));
}) })
.catch(() => {}); .catch(() => {});
} }
@@ -739,7 +711,6 @@ function handleRowClick(row) {
generatedReturnDetail(row.supplyBusNo).then((response) => { generatedReturnDetail(row.supplyBusNo).then((response) => {
purchaseinventoryReturnList.value = response.data; purchaseinventoryReturnList.value = response.data;
purchaseinventoryReturnList.value.map((k) => { purchaseinventoryReturnList.value.map((k) => {
// k.returnStatus_text = k.returnStatus==1?'已退库':''
k.originalSupplyBusNo = k.originalSupplyBusNo ? k.originalSupplyBusNo : row.supplyBusNo; k.originalSupplyBusNo = k.originalSupplyBusNo ? k.originalSupplyBusNo : row.supplyBusNo;
}); });
}); });

View File

@@ -3,12 +3,12 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>BI决策报表</span> <span>{{ $t('report.biDashboard.title') }}</span>
<div> <div>
<el-select v-model="reportType" placeholder="报表类型" style="margin-right:10px;width:140px" @change="loadDashboard"> <el-select v-model="reportType" :placeholder="$t('report.biDashboard.reportType')" style="margin-right:10px;width:140px" @change="loadDashboard">
<el-option v-for="item in reportTypes" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in reportTypes" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
<el-button type="primary" :loading="loading" @click="handleGenerate">生成报表</el-button> <el-button type="primary" :loading="loading" @click="handleGenerate">{{ $t('report.biDashboard.generateReport') }}</el-button>
</div> </div>
</div> </div>
</template> </template>
@@ -27,31 +27,31 @@
<el-card v-if="report" shadow="never" class="mt16"> <el-card v-if="report" shadow="never" class="mt16">
<template #header> <template #header>
<span>报表数据 {{ report.reportType }}</span> <span>{{ $t('report.biDashboard.reportData') }} {{ report.reportType }}</span>
</template> </template>
<el-table :data="report.records || []" border stripe size="small" max-height="400"> <el-table :data="report.records || []" border stripe size="small" max-height="400">
<el-table-column prop="statDate" label="日期" width="110" align="center" /> <el-table-column prop="statDate" :label="$t('report.biDashboard.date')" width="110" align="center" />
<el-table-column prop="departmentName" label="科室" width="140" show-overflow-tooltip /> <el-table-column prop="departmentName" :label="$t('report.biDashboard.department')" width="140" show-overflow-tooltip />
<el-table-column label="收入(万)" width="110" align="right"> <el-table-column :label="$t('report.biDashboard.revenue')" width="110" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="成本(万)" width="110" align="right"> <el-table-column :label="$t('report.biDashboard.cost')" width="110" align="right">
<template #default="{ row }">{{ formatMoney(row.cost) }}</template> <template #default="{ row }">{{ formatMoney(row.cost) }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="patientCount" label="患者数" width="90" align="center" /> <el-table-column prop="patientCount" :label="$t('report.biDashboard.patientCount')" width="90" align="center" />
</el-table> </el-table>
</el-card> </el-card>
<el-row v-if="report && report.charts" :gutter="16" class="mt16"> <el-row v-if="report && report.charts" :gutter="16" class="mt16">
<el-col :span="12" v-if="report.charts.revenueChart && report.charts.revenueChart.length"> <el-col :span="12" v-if="report.charts.revenueChart && report.charts.revenueChart.length">
<el-card shadow="never"> <el-card shadow="never">
<template #header><span>月度收支趋势</span></template> <template #header><span>{{ $t('report.biDashboard.monthlyTrend') }}</span></template>
<el-table :data="report.charts.revenueChart" border size="small"> <el-table :data="report.charts.revenueChart" border size="small">
<el-table-column prop="month" label="月份" width="100" align="center" /> <el-table-column prop="month" :label="$t('report.biDashboard.month')" width="100" align="center" />
<el-table-column label="收入(万)" align="right"> <el-table-column :label="$t('report.biDashboard.revenue')" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="成本(万)" align="right"> <el-table-column :label="$t('report.biDashboard.cost')" align="right">
<template #default="{ row }">{{ formatMoney(row.cost) }}</template> <template #default="{ row }">{{ formatMoney(row.cost) }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -59,10 +59,10 @@
</el-col> </el-col>
<el-col :span="12" v-if="report.charts.departmentChart && report.charts.departmentChart.length"> <el-col :span="12" v-if="report.charts.departmentChart && report.charts.departmentChart.length">
<el-card shadow="never"> <el-card shadow="never">
<template #header><span>科室收入分布</span></template> <template #header><span>{{ $t('report.biDashboard.departmentRevenue') }}</span></template>
<el-table :data="report.charts.departmentChart" border size="small"> <el-table :data="report.charts.departmentChart" border size="small">
<el-table-column prop="department" label="科室" width="160" show-overflow-tooltip /> <el-table-column prop="department" :label="$t('report.biDashboard.department')" width="160" show-overflow-tooltip />
<el-table-column label="收入(万)" align="right"> <el-table-column :label="$t('report.biDashboard.revenue')" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -74,9 +74,12 @@
<script setup name="BiDashboard" lang="ts"> <script setup name="BiDashboard" lang="ts">
import { ref, computed, onMounted } from 'vue' import { ref, computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { generateBiReport, getBiDashboard } from '@/api/reportmanage/bi' import { generateBiReport, getBiDashboard } from '@/api/reportmanage/bi'
const { t } = useI18n()
const loading = ref(false) const loading = ref(false)
const reportType = ref('overview') const reportType = ref('overview')
const dashboard = ref(null) const dashboard = ref(null)
@@ -87,12 +90,12 @@ const summaryCards = computed(() => {
if (!dashboard.value) return [] if (!dashboard.value) return []
const d = dashboard.value const d = dashboard.value
return [ return [
{ label: '总收入(万)', value: formatMoney(d.totalRevenue), color: '#409eff' }, { label: t('report.biDashboard.totalRevenue'), value: formatMoney(d.totalRevenue), color: '#409eff' },
{ label: '总成本(万)', value: formatMoney(d.totalCost), color: '#67c23a' }, { label: t('report.biDashboard.totalCost'), value: formatMoney(d.totalCost), color: '#67c23a' },
{ label: '总利润(万)', value: formatMoney(d.totalProfit), color: '#e6a23c' }, { label: t('report.biDashboard.totalProfit'), value: formatMoney(d.totalProfit), color: '#e6a23c' },
{ label: '总患者数', value: d.totalPatients || 0, color: '#f56c6c' }, { label: t('report.biDashboard.totalPatients'), value: d.totalPatients || 0, color: '#f56c6c' },
{ label: '数据记录数', value: d.totalRecords || 0, color: '#909399' }, { label: t('report.biDashboard.totalRecords'), value: d.totalRecords || 0, color: '#909399' },
{ label: 'CMI值', value: d.latestCmiValue || '-', color: '#409eff' } { label: t('report.biDashboard.cmiValue'), value: d.latestCmiValue || '-', color: '#409eff' }
] ]
}) })
@@ -113,10 +116,10 @@ function handleGenerate() {
loading.value = true loading.value = true
generateBiReport({ type: reportType.value }).then(res => { generateBiReport({ type: reportType.value }).then(res => {
report.value = res.data report.value = res.data
ElMessage.success('报表生成完成') ElMessage.success(t('report.biDashboard.generateSuccess'))
}).catch(() => { }).catch(() => {
report.value = null report.value = null
ElMessage.error('生成失败') ElMessage.error(t('report.biDashboard.generateFailed'))
}).finally(() => { loading.value = false }) }).finally(() => { loading.value = false })
} }

View File

@@ -3,40 +3,40 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>经营分析报告</span> <span>{{ $t('report.analytics.title') }}</span>
<div> <div>
<el-button type="success" :loading="exportLoading" @click="handleExport">导出Excel</el-button> <el-button type="success" :loading="exportLoading" @click="handleExport">{{ $t('report.analytics.exportExcel') }}</el-button>
</div> </div>
</div> </div>
</template> </template>
<el-form :model="queryParams" inline> <el-form :model="queryParams" inline>
<el-form-item label="科室"> <el-form-item :label="$t('report.analytics.department')">
<el-input v-model="queryParams.departmentName" placeholder="科室名称" clearable style="width:160px" /> <el-input v-model="queryParams.departmentName" :placeholder="$t('report.analytics.departmentName')" clearable style="width:160px" />
</el-form-item> </el-form-item>
<el-form-item label="开始日期"> <el-form-item :label="$t('report.analytics.startDate')">
<el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" placeholder="开始日期" style="width:160px" /> <el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('report.analytics.startDate')" style="width:160px" />
</el-form-item> </el-form-item>
<el-form-item label="结束日期"> <el-form-item :label="$t('report.analytics.endDate')">
<el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" placeholder="结束日期" style="width:160px" /> <el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('report.analytics.endDate')" style="width:160px" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" :loading="loading" @click="handleQuery">查询</el-button> <el-button type="primary" :loading="loading" @click="handleQuery">{{ $t('report.analytics.search') }}</el-button>
<el-button @click="handleReset">重置</el-button> <el-button @click="handleReset">{{ $t('report.analytics.reset') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<el-card v-if="report" shadow="never" class="mt16"> <el-card v-if="report" shadow="never" class="mt16">
<template #header> <template #header>
<span>汇总数据</span> <span>{{ $t('report.analytics.summaryData') }}</span>
</template> </template>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="4"> <el-col :span="4">
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#409eff">{{ report.totalRecords || 0 }}</div> <div style="font-size:20px;font-weight:bold;color:#409eff">{{ report.totalRecords || 0 }}</div>
<div style="font-size:12px;color:#999">总记录数</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.totalRecords') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -44,7 +44,7 @@
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#409eff">{{ formatMoney(report.totalRevenue) }}</div> <div style="font-size:20px;font-weight:bold;color:#409eff">{{ formatMoney(report.totalRevenue) }}</div>
<div style="font-size:12px;color:#999">总收入()</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.totalRevenue') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -52,7 +52,7 @@
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#67c23a">{{ formatMoney(report.totalCost) }}</div> <div style="font-size:20px;font-weight:bold;color:#67c23a">{{ formatMoney(report.totalCost) }}</div>
<div style="font-size:12px;color:#999">总成本()</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.totalCost') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -60,7 +60,7 @@
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#e6a23c">{{ formatMoney(report.totalProfit) }}</div> <div style="font-size:20px;font-weight:bold;color:#e6a23c">{{ formatMoney(report.totalProfit) }}</div>
<div style="font-size:12px;color:#999">总利润()</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.totalProfit') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -68,7 +68,7 @@
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#f56c6c">{{ report.totalPatients || 0 }}</div> <div style="font-size:20px;font-weight:bold;color:#f56c6c">{{ report.totalPatients || 0 }}</div>
<div style="font-size:12px;color:#999">总患者数</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.totalPatients') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -76,7 +76,7 @@
<el-card shadow="hover" :body-style="{padding:'12px'}"> <el-card shadow="hover" :body-style="{padding:'12px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#909399">{{ report.profitRate || 0 }}%</div> <div style="font-size:20px;font-weight:bold;color:#909399">{{ report.profitRate || 0 }}%</div>
<div style="font-size:12px;color:#999">利润率</div> <div style="font-size:12px;color:#999">{{ $t('report.analytics.profitRate') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -85,25 +85,25 @@
<el-card v-if="report && report.records && report.records.length" shadow="never" class="mt16"> <el-card v-if="report && report.records && report.records.length" shadow="never" class="mt16">
<template #header> <template #header>
<span>明细数据</span> <span>{{ $t('report.analytics.detailData') }}</span>
</template> </template>
<el-table :data="report.records" border stripe> <el-table :data="report.records" border stripe>
<el-table-column prop="statDate" label="日期" width="120" align="center" /> <el-table-column prop="statDate" :label="$t('report.analytics.date')" width="120" align="center" />
<el-table-column prop="departmentName" label="科室" width="140" align="center" show-overflow-tooltip /> <el-table-column prop="departmentName" :label="$t('report.analytics.department')" width="140" align="center" show-overflow-tooltip />
<el-table-column label="收入(万元)" width="120" align="right"> <el-table-column :label="$t('report.analytics.revenue')" width="120" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="成本(万元)" width="120" align="right"> <el-table-column :label="$t('report.analytics.cost')" width="120" align="right">
<template #default="{ row }">{{ formatMoney(row.cost) }}</template> <template #default="{ row }">{{ formatMoney(row.cost) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="利润(万元)" width="120" align="right"> <el-table-column :label="$t('report.analytics.profit')" width="120" align="right">
<template #default="{ row }">{{ formatMoney(row.profit) }}</template> <template #default="{ row }">{{ formatMoney(row.profit) }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="patientCount" label="患者数" width="90" align="center" /> <el-table-column prop="patientCount" :label="$t('report.analytics.patientCount')" width="90" align="center" />
<el-table-column prop="bedCount" label="床位数" width="90" align="center" /> <el-table-column prop="bedCount" :label="$t('report.analytics.bedCount')" width="90" align="center" />
<el-table-column prop="bedOccupancyRate" label="床位率(%)" width="100" align="center" /> <el-table-column prop="bedOccupancyRate" :label="$t('report.analytics.bedOccupancyRate')" width="100" align="center" />
<el-table-column prop="avgStayDays" label="平均住院日" width="100" align="center" /> <el-table-column prop="avgStayDays" :label="$t('report.analytics.avgStayDays')" width="100" align="center" />
<el-table-column label="平均费用(万)" width="110" align="right"> <el-table-column :label="$t('report.analytics.avgCost')" width="110" align="right">
<template #default="{ row }">{{ formatMoney(row.avgCost) }}</template> <template #default="{ row }">{{ formatMoney(row.avgCost) }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -113,9 +113,12 @@
<script setup name="BusinessAnalytics" lang="ts"> <script setup name="BusinessAnalytics" lang="ts">
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { generateReport, exportToExcel } from '@/api/reportmanage' import { generateReport, exportToExcel } from '@/api/reportmanage'
const { t } = useI18n()
const loading = ref(false) const loading = ref(false)
const exportLoading = ref(false) const exportLoading = ref(false)
const report = ref(null) const report = ref(null)
@@ -137,7 +140,7 @@ function handleQuery() {
report.value = res.data report.value = res.data
}).catch(() => { }).catch(() => {
report.value = null report.value = null
ElMessage.error('查询失败') ElMessage.error(t('report.analytics.queryFailed'))
}).finally(() => { }).finally(() => {
loading.value = false loading.value = false
}) })
@@ -154,10 +157,10 @@ function handleExport() {
exportLoading.value = true exportLoading.value = true
exportToExcel(queryParams).then(res => { exportToExcel(queryParams).then(res => {
if (res.data && res.data.headers) { if (res.data && res.data.headers) {
ElMessage.success('导出数据共 ' + res.data.totalRows + ' 条,请查看返回数据') ElMessage.success(t('report.analytics.exportSuccess', { count: res.data.totalRows }))
} }
}).catch(() => { }).catch(() => {
ElMessage.error('导出失败') ElMessage.error(t('report.analytics.exportFailed'))
}).finally(() => { }).finally(() => {
exportLoading.value = false exportLoading.value = false
}) })

View File

@@ -3,14 +3,14 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>可视化仪表盘</span> <span>{{ $t('report.dashboard.title') }}</span>
<div> <div>
<el-select v-model="dashboardType" placeholder="仪表盘类型" clearable style="margin-right:10px;width:160px" @change="loadData"> <el-select v-model="dashboardType" :placeholder="$t('report.dashboard.dashboardType')" clearable style="margin-right:10px;width:160px" @change="loadData">
<el-option label="运营总览" value="overview" /> <el-option :label="$t('report.dashboard.overview')" value="overview" />
<el-option label="财务分析" value="finance" /> <el-option :label="$t('report.dashboard.finance')" value="finance" />
<el-option label="患者统计" value="patient" /> <el-option :label="$t('report.dashboard.patient')" value="patient" />
</el-select> </el-select>
<el-button type="primary" :loading="loading" @click="loadData">刷新</el-button> <el-button type="primary" :loading="loading" @click="loadData">{{ $t('report.dashboard.refresh') }}</el-button>
</div> </div>
</div> </div>
</template> </template>
@@ -20,7 +20,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#409eff">{{ formatMoney(dashData.totalRevenue) }}</div> <div style="font-size:24px;font-weight:bold;color:#409eff">{{ formatMoney(dashData.totalRevenue) }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">总收入()</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.totalRevenue') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -28,7 +28,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#67c23a">{{ formatMoney(dashData.totalProfit) }}</div> <div style="font-size:24px;font-weight:bold;color:#67c23a">{{ formatMoney(dashData.totalProfit) }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">总利润()</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.totalProfit') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -36,7 +36,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#e6a23c">{{ dashData.totalPatients || 0 }}</div> <div style="font-size:24px;font-weight:bold;color:#e6a23c">{{ dashData.totalPatients || 0 }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">总患者数</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.totalPatients') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -44,7 +44,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#f56c6c">{{ dashData.totalDrgCases || 0 }}</div> <div style="font-size:24px;font-weight:bold;color:#f56c6c">{{ dashData.totalDrgCases || 0 }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">DRG病例数</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.drgCases') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -55,7 +55,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#409eff">{{ formatMoney(dashData.totalCost) }}</div> <div style="font-size:20px;font-weight:bold;color:#409eff">{{ formatMoney(dashData.totalCost) }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">总成本()</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.totalCost') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -63,7 +63,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#67c23a">{{ dashData.latestCmiValue || '-' }}</div> <div style="font-size:20px;font-weight:bold;color:#67c23a">{{ dashData.latestCmiValue || '-' }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">最新CMI值</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.latestCmi') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -71,7 +71,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#e6a23c">{{ dashData.latestCostControlRate || '-' }}%</div> <div style="font-size:20px;font-weight:bold;color:#e6a23c">{{ dashData.latestCostControlRate || '-' }}%</div>
<div style="font-size:13px;color:#999;margin-top:4px">成本控制率</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.costControlRate') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -79,7 +79,7 @@
<el-card shadow="hover" :body-style="{padding:'16px'}"> <el-card shadow="hover" :body-style="{padding:'16px'}">
<div style="text-align:center"> <div style="text-align:center">
<div style="font-size:20px;font-weight:bold;color:#909399">{{ dashData.totalRecords || 0 }}</div> <div style="font-size:20px;font-weight:bold;color:#909399">{{ dashData.totalRecords || 0 }}</div>
<div style="font-size:13px;color:#999;margin-top:4px">数据记录数</div> <div style="font-size:13px;color:#999;margin-top:4px">{{ $t('report.dashboard.totalRecords') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -88,19 +88,19 @@
<el-card v-if="charts" shadow="never" class="mt16"> <el-card v-if="charts" shadow="never" class="mt16">
<template #header> <template #header>
<span>图表数据</span> <span>{{ $t('report.dashboard.chartData') }}</span>
</template> </template>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<template #header><span>月度收支趋势</span></template> <template #header><span>{{ $t('report.dashboard.monthlyTrend') }}</span></template>
<el-table :data="charts.revenueChart || []" border size="small"> <el-table :data="charts.revenueChart || []" border size="small">
<el-table-column prop="month" label="月份" width="100" align="center" /> <el-table-column prop="month" :label="$t('report.dashboard.month')" width="100" align="center" />
<el-table-column label="收入(万)" align="right"> <el-table-column :label="$t('report.dashboard.revenue')" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
<el-table-column label="成本(万)" align="right"> <el-table-column :label="$t('report.dashboard.cost')" align="right">
<template #default="{ row }">{{ formatMoney(row.cost) }}</template> <template #default="{ row }">{{ formatMoney(row.cost) }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -108,10 +108,10 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-card shadow="never"> <el-card shadow="never">
<template #header><span>科室收入分布</span></template> <template #header><span>{{ $t('report.dashboard.departmentRevenue') }}</span></template>
<el-table :data="charts.departmentChart || []" border size="small"> <el-table :data="charts.departmentChart || []" border size="small">
<el-table-column prop="department" label="科室" width="160" show-overflow-tooltip /> <el-table-column prop="department" :label="$t('report.dashboard.department')" width="160" show-overflow-tooltip />
<el-table-column label="收入(万)" align="right"> <el-table-column :label="$t('report.dashboard.revenue')" align="right">
<template #default="{ row }">{{ formatMoney(row.revenue) }}</template> <template #default="{ row }">{{ formatMoney(row.revenue) }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -122,12 +122,12 @@
<el-row :gutter="16" class="mt16"> <el-row :gutter="16" class="mt16">
<el-col :span="24"> <el-col :span="24">
<el-card shadow="never"> <el-card shadow="never">
<template #header><span>DRG绩效趋势</span></template> <template #header><span>{{ $t('report.dashboard.drgTrend') }}</span></template>
<el-table :data="charts.cmiChart || []" border size="small"> <el-table :data="charts.cmiChart || []" border size="small">
<el-table-column prop="month" label="月份" width="120" align="center" /> <el-table-column prop="month" :label="$t('report.dashboard.month')" width="120" align="center" />
<el-table-column prop="cmiValue" label="CMI值" width="100" align="center" /> <el-table-column prop="cmiValue" :label="$t('report.dashboard.cmiValue')" width="100" align="center" />
<el-table-column prop="costControlRate" label="成本控制率(%)" width="120" align="center" /> <el-table-column prop="costControlRate" :label="$t('report.dashboard.costControlRateCol')" width="120" align="center" />
<el-table-column prop="totalCases" label="病例数" width="100" align="center" /> <el-table-column prop="totalCases" :label="$t('report.dashboard.caseCount')" width="100" align="center" />
</el-table> </el-table>
</el-card> </el-card>
</el-col> </el-col>

View File

@@ -1,29 +1,29 @@
<template> <template>
<div class="report-dimension-container"> <div class="report-dimension-container">
<div class="page-header"> <div class="page-header">
<span class="tab-title">多维度报表</span> <span class="tab-title">{{ $t('report.dimension.title') }}</span>
</div> </div>
<el-card shadow="never" style="margin-bottom: 16px"> <el-card shadow="never" style="margin-bottom: 16px">
<template #header> <template #header>
<span>查询条件</span> <span>{{ $t('report.dimension.queryConditions') }}</span>
</template> </template>
<el-form :model="queryParams" inline> <el-form :model="queryParams" inline>
<el-form-item label="统计维度"> <el-form-item :label="$t('report.dimension.dimension')">
<el-select v-model="queryParams.dimension" style="width: 140px"> <el-select v-model="queryParams.dimension" style="width: 140px">
<el-option label="按质控状态" value="status" /> <el-option :label="$t('report.dimension.byStatus')" value="status" />
<el-option label="按DRG分组" value="drg" /> <el-option :label="$t('report.dimension.byDrg')" value="drg" />
<el-option label="按主要诊断" value="diagnosis" /> <el-option :label="$t('report.dimension.byDiagnosis')" value="diagnosis" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="开始日期"> <el-form-item :label="$t('report.dimension.startDate')">
<el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" placeholder="开始日期" /> <el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('report.dimension.startDate')" />
</el-form-item> </el-form-item>
<el-form-item label="结束日期"> <el-form-item :label="$t('report.dimension.endDate')">
<el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" placeholder="结束日期" /> <el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" :placeholder="$t('report.dimension.endDate')" />
</el-form-item> </el-form-item>
<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('report.dimension.search') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -33,7 +33,7 @@
<el-card shadow="never"> <el-card shadow="never">
<div class="stat-card"> <div class="stat-card">
<div class="stat-value" style="color: #409eff">{{ reportData.totalCount || 0 }}</div> <div class="stat-value" style="color: #409eff">{{ reportData.totalCount || 0 }}</div>
<div class="stat-label">总病案数</div> <div class="stat-label">{{ $t('report.dimension.totalCases') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -41,7 +41,7 @@
<el-card shadow="never"> <el-card shadow="never">
<div class="stat-card"> <div class="stat-card">
<div class="stat-value" style="color: #e6a23c">{{ formatCost(reportData.totalCost) }}</div> <div class="stat-value" style="color: #e6a23c">{{ formatCost(reportData.totalCost) }}</div>
<div class="stat-label">总费用</div> <div class="stat-label">{{ $t('report.dimension.totalCost') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -49,7 +49,7 @@
<el-card shadow="never"> <el-card shadow="never">
<div class="stat-card"> <div class="stat-card">
<div class="stat-value" style="color: #67c23a">{{ formatCost(reportData.avgCost) }}</div> <div class="stat-value" style="color: #67c23a">{{ formatCost(reportData.avgCost) }}</div>
<div class="stat-label">平均费用</div> <div class="stat-label">{{ $t('report.dimension.avgCost') }}</div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@@ -57,19 +57,19 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<span>{{ dimensionLabel }}明细</span> <span>{{ dimensionLabel }}{{ $t('report.dimension.detail') }}</span>
</template> </template>
<el-table :data="reportData.data || []" v-loading="loading" border stripe style="width: 100%"> <el-table :data="reportData.data || []" v-loading="loading" border stripe style="width: 100%">
<el-table-column prop="dimension" :label="dimensionLabel" min-width="160" /> <el-table-column prop="dimension" :label="dimensionLabel" min-width="160" />
<el-table-column prop="count" label="病案数" width="100" /> <el-table-column prop="count" :label="$t('report.dimension.caseCount')" width="100" />
<el-table-column prop="totalCost" label="总费用" width="140"> <el-table-column prop="totalCost" :label="$t('report.dimension.totalCost')" width="140">
<template #default="{ row }">{{ formatCost(row.totalCost) }}</template> <template #default="{ row }">{{ formatCost(row.totalCost) }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="avgCost" label="平均费用" width="140"> <el-table-column prop="avgCost" :label="$t('report.dimension.avgCost')" width="140">
<template #default="{ row }">{{ formatCost(row.avgCost) }}</template> <template #default="{ row }">{{ formatCost(row.avgCost) }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="avgLosDays" label="平均住院日" width="120"> <el-table-column prop="avgLosDays" :label="$t('report.dimension.avgLosDays')" width="120">
<template #default="{ row }">{{ row.avgLosDays }}</template> <template #default="{ row }">{{ row.avgLosDays }}{{ $t('report.dimension.dayUnit') }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-card> </el-card>
@@ -78,9 +78,12 @@
<script setup> <script setup>
import { ref, reactive, computed, onMounted } from 'vue' import { ref, reactive, computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { getReportByDimension } from '@/api/reportmanage/dimension' import { getReportByDimension } from '@/api/reportmanage/dimension'
const { t } = useI18n()
const loading = ref(false) const loading = ref(false)
const queryParams = reactive({ const queryParams = reactive({
dimension: 'status', dimension: 'status',
@@ -89,8 +92,8 @@ const queryParams = reactive({
}) })
const reportData = ref({}) const reportData = ref({})
const DIMENSION_LABEL = { status: '质控状态', drg: 'DRG分组', diagnosis: '主要诊断' } const DIMENSION_KEY = { status: 'byStatus', drg: 'byDrg', diagnosis: 'byDiagnosis' }
const dimensionLabel = computed(() => DIMENSION_LABEL[queryParams.dimension] || '维度') const dimensionLabel = computed(() => t('report.dimension.' + (DIMENSION_KEY[queryParams.dimension] || 'dimension')))
const formatCost = (val) => { const formatCost = (val) => {
if (!val || val === '0') return '¥0' if (!val || val === '0') return '¥0'
@@ -106,7 +109,7 @@ const loadData = async () => {
const res = await getReportByDimension(params) const res = await getReportByDimension(params)
reportData.value = res.data || {} reportData.value = res.data || {}
} catch (e) { } catch (e) {
ElMessage.error('加载失败: ' + (e.message || '未知错误')) ElMessage.error(t('report.dimension.loadFailed') + ': ' + (e.message || t('report.dimension.unknownError')))
} finally { } finally {
loading.value = false loading.value = false
} }