From 0c0d812ff92bcb3656363d798a54ec64f55dbdad Mon Sep 17 00:00:00 2001 From: whm <2022265251@qq.com> Date: Sat, 6 Dec 2025 11:41:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?2025-12-06=20=E5=8F=91=E7=89=88=EF=BC=8C?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E5=8F=91=E7=89=88=E5=86=85=E5=AE=B9=E8=A7=81?= =?UTF-8?q?=E5=8F=91=E7=89=88=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openhis-server-new/core-admin/pom.xml | 6 +- openhis-server-new/core-common/pom.xml | 5 +- .../core/common/annotation/ExcelExtra.java | 38 + .../java/com/core}/common/enums/DelFlag.java | 17 +- .../com/core/common/enums/DeleteFlag.java | 26 - .../core/common/enums/TenantOptionDict.java | 132 +- .../com/core/common/utils/NewExcelUtil.java | 1837 ++++++++++++++ openhis-server-new/core-flowable/pom.xml | 1 + .../framework/config/MybatisPlusConfig.java | 2 +- .../core/framework/config/SecurityConfig.java | 79 +- .../web/service/SysLoginService.java | 4 +- .../com/core/generator/util/GenUtils.java | 3 + .../src/main/resources/generator.yml | 2 +- .../mapper/generator/GenTableMapper.xml | 11 +- openhis-server-new/core-system/pom.xml | 8 +- .../service/impl/SysTenantServiceImpl.java | 8 +- .../openhis-application/pom.xml | 25 +- .../com/openhis/quartz/task/AutoRollTask.java | 50 + .../quartz/task/InventoryBackupTask.java | 183 ++ .../quartz/task/StocktakingBatchTask.java | 54 - .../IInstrumentManageAppService.java | 33 + .../ILaboratoryManageAppService.java | 21 + .../ILisConfigManageAppService.java | 34 + .../IObservationManageAppService.java | 29 + .../ISampleCollectAppManageAppService.java | 20 + .../appservice/ISpecimenManageAppService.java | 33 + .../impl/InstrumentManageAppServiceImpl.java | 107 + .../impl/LaboratoryManageAppService.java | 58 + .../impl/LisConfigManageAppServiceImpl.java | 188 ++ .../impl/ObservationManageAppServiceImpl.java | 122 + .../impl/SampleCollectManageAppService.java | 105 + .../impl/SpecimenManageAppServiceImpl.java | 110 + .../controller/InstrumentController.java | 78 + .../controller/LaboratoryController.java | 40 + .../controller/LisConfigController.java | 67 + .../controller/ObservationDefController.java | 77 + .../controller/SampleCollectController.java | 40 + .../controller/SpecimenDefController.java | 76 + .../Inspection/dto/InstrumentManageDto.java | 108 + .../dto/InstrumentManageInitDto.java | 56 + .../Inspection/dto/InstrumentSelParam.java | 22 + .../dto/InstrumentStatusRequest.java | 16 + .../Inspection/dto/LisConfigManageDto.java | 31 + .../dto/LisConfigManageInitDto.java | 29 + .../dto/ObservationDefManageDto.java | 50 + .../dto/ObservationDefManageInitDto.java | 53 + .../dto/ObservationDefSelParam.java | 22 + .../dto/ObservationDefStatusRequest.java | 16 + .../Inspection/dto/ReportResultManageDto.java | 37 + .../dto/SampleCollectManageDto.java | 46 + .../dto/SampleCollectStatusRequest.java | 16 + .../Inspection/dto/SpecimenDefManageDto.java | 62 + .../dto/SpecimenDefManageInitDto.java} | 30 +- .../Inspection/dto/SpecimenDefSelParam.java | 22 + .../dto/SpecimenDefStatusRequest.java | 16 + .../web/Inspection/mapper/GroupRecMapper.java | 11 + .../Inspection/mapper/LisReportMapper.java | 26 + .../mapper/SampleCollectMapper.java | 23 + .../impl/LocationAppServiceImpl.java | 2 +- .../impl/PractitionerAppServiceImpl.java | 3 +- .../basedatamanage/dto/OrgLocQueryDto.java | 5 + .../mapper/PractitionerAppAppMapper.java | 7 + .../dto/HealthcareServiceFormData.java | 5 + .../IInpatientChargeAppService.java | 25 +- .../IOutpatientChargeAppService.java | 8 + .../impl/InpatientChargeAppServiceImpl.java | 68 +- .../impl/OutpatientChargeAppServiceImpl.java | 66 + .../impl/OutpatientPricingAppServiceImpl.java | 2 +- .../impl/OutpatientRefundAppServiceImpl.java | 288 ++- .../OutpatientRegistrationAppServiceImpl.java | 4 +- .../controller/InpatientChargeController.java | 29 +- .../OutpatientChargeController.java | 12 +- .../dto/EncounterPatientPageDto.java | 5 +- .../dto/EncounterPatientPageParam.java | 5 + .../dto/EncounterPatientPrescriptionDto.java | 24 +- .../chargemanage/dto/OutpatientInitDto.java | 16 + .../dto/PractitionerMetadata.java | 3 + .../web/chargemanage/dto/RefundItemDto.java | 5 +- .../mapper/InpatientChargeAppMapper.java | 8 +- .../mapper/OutpatientChargeAppMapper.java | 29 + .../web/common/appservice/ICommonService.java | 15 + .../appservice/impl/CommonServiceImpl.java | 283 +++ .../controller/CommonAppController.java | 20 + .../common/dto/AdviceItemPrintInfoDto.java | 5 + .../web/common/dto/AdvicePrintInfoDto.java | 1 + .../web/common/dto/PerformRecordDto.java | 6 +- .../web/common/mapper/CommonAppMapper.java | 23 + .../impl/DeviceManageAppServiceImpl.java | 4 +- .../impl/MedicationManageAppServiceImpl.java | 4 +- .../SupplierManagementAppServiceImpl.java | 2 +- .../dto/ActivityChildJsonDto.java | 10 + .../datadictionary/dto/DeviceManageDto.java | 6 +- .../datadictionary/dto/DeviceManageUpDto.java | 4 +- .../DepartmentIssuanceOrderServiceImpl.java | 10 +- .../IDoctorStationAdviceAppService.java | 33 +- .../IDoctorStationAllergyIntolAppService.java | 52 - ...DoctorStationChineseMedicalAppService.java | 9 + .../IDoctorStationDiagnosisAppService.java | 17 + .../DoctorStationAdviceAppServiceImpl.java | 304 ++- ...ctorStationAllergyIntolAppServiceImpl.java | 195 -- ...orStationChineseMedicalAppServiceImpl.java | 90 +- .../DoctorStationDiagnosisAppServiceImpl.java | 118 +- .../impl/DoctorStationMainAppServiceImpl.java | 6 +- .../DoctorStationAdviceController.java | 71 +- .../DoctorStationAllergyIntolController.java | 81 - ...DoctorStationChineseMedicalController.java | 11 + .../DoctorStationDiagnosisController.java | 23 + .../web/doctorstation/dto/AdviceBaseDto.java | 7 +- .../web/doctorstation/dto/AdviceSaveDto.java | 4 + .../dto/ProofAndTestHistoryDto.java | 27 + .../dto/ProofAndTestResultDto.java | 28 + .../web/doctorstation/dto/RequestBaseDto.java | 4 + .../dto/SaveDiagnosisChildParam.java | 10 + .../mapper/DoctorStationAdviceAppMapper.java | 22 + .../mapper/DoctorStationMainAppMapper.java | 6 +- .../web/doctorstation/utils/AdviceUtils.java | 139 +- .../appservice/IDocDefinitionAppService.java | 9 +- .../appservice/IDocRecordAppService.java | 71 +- .../appservice/IDocStatisticsAppService.java | 24 +- .../impl/DocDefinitionAppServiceImpl.java | 96 +- .../impl/DocRecordAppServiceImpl.java | 611 ++++- .../impl/DocStatisticsAppServiceImpl.java | 73 +- ...DocStatisticsDefinitionAppServiceImpl.java | 81 +- .../controller/DocDefinitionController.java | 32 +- .../controller/DocRecordController.java | 119 +- .../web/document/dto/DocRecordDto.java | 4 + .../dto/DocStatisticsDefinitionDto.java | 4 + .../web/document/dto/DocStatisticsDto.java | 4 + .../web/document/dto/TrendChartsBig.java | 31 + .../web/document/dto/TrendChartsOutput.java | 53 + .../web/document/dto/TrendChartsSmall.java | 61 + .../document/util/ConvertToDocStatistics.java | 250 +- .../document/util/OperationDayCalculator.java | 99 + .../IAdvancePaymentManageAppService.java | 2 +- .../IInHospitalRegisterAppService.java | 17 + .../AdvancePaymentManageAppServiceImpl.java | 14 +- .../InHospitalRegisterAppServiceImpl.java | 131 +- .../AdvancePaymentManageController.java | 3 +- .../InHospitalRegisterController.java | 23 +- .../dto/AdvancePaymentInAndOutDto.java | 3 + .../dto/InHospitalInfoDto.java | 8 + .../dto/InHospitalRegisterQueryDto.java | 18 + .../mapper/AdvancePaymentManageAppMapper.java | 2 + .../mapper/InHospitalRegisterAppMapper.java | 15 +- .../appservice/IATDManageAppService.java | 40 +- .../IEncounterAutoRollAppService.java | 79 + .../IMedicineSummaryAppService.java | 9 - .../appservice/INurseBillingAppService.java | 30 +- .../IOrgDeviceStockTakeAppService.java | 14 +- .../impl/ATDManageAppServiceImpl.java | 338 ++- .../impl/AdviceProcessAppServiceImpl.java | 467 ++-- .../impl/EncounterAutoRollAppServiceImpl.java | 354 +++ .../impl/MedicineSummaryAppServiceImpl.java | 62 - .../impl/NurseBillingAppService.java | 867 ++++--- .../OrgDeviceStockTakeAppServiceImpl.java | 293 ++- .../controller/ATDManageController.java | 52 +- .../EncounterAutoRollAppController.java | 92 + .../controller/NurseBillingController.java | 74 +- .../OrgDeviceStockTakeController.java | 38 +- .../dto/AdmissionPatientInfoDto.java | 30 +- .../dto/AdmissionPatientPageDto.java | 16 + .../dto/AdviceExecuteDetailParam.java | 2 +- .../dto/AdviceExecuteParam.java | 10 + .../dto/AutoRollBasicServiceDto.java | 71 + .../dto/AutoRollNursingDto.java | 71 + .../dto/AutoRollSourceDto.java | 35 + .../dto/EncounterAccountDto.java | 34 + .../dto/EncounterAutoRollQueryDto.java} | 45 +- .../dto/EncounterAutoRollSaveDto.java | 33 + .../dto/InBedPatientInfoDto.java | 52 + .../dto/InpatientAdviceDto.java | 14 + .../dto/MedicineSummaryInfoDto.java | 12 + .../dto/OrgDeviceSummaryParam.java | 10 +- .../dto/PendingMedicationDto.java | 107 + .../mapper/ATDManageAppMapper.java | 78 +- .../mapper/AdviceProcessAppMapper.java | 7 +- .../mapper/EncounterAutoRollAppMapper.java | 71 + .../mapper/NurseBillingAppMapper.java | 42 + .../mapper/OrgDeviceStockTakeAppMapper.java | 4 +- .../inpatientmanage/dto/PatientHomeDto.java | 7 - .../IInventorySettlementAppService.java | 31 + .../appservice/ILossReportFormAppService.java | 18 + .../appservice/IProductDetailAppService.java | 50 +- .../IProductStocktakingAppService.java | 29 +- .../IProductTransferAppService.java | 26 +- .../IPurchaseInventoryAppService.java | 11 +- .../appservice/IPurchaseReturnAppService.java | 20 +- .../IReceiptApprovalAppService.java | 11 + .../IRequisitionIssueAppService.java | 19 +- .../appservice/IReturnIssueAppService.java | 21 +- .../IInventoryAdjustPriceServiceImpl.java | 2 +- .../IInventorySettlementAppServiceImpl.java | 410 ++++ .../impl/LossReportFormAppServiceImpl.java | 87 +- .../impl/ProductDetailAppServiceImpl.java | 317 ++- .../ProductStocktakingAppServiceImpl.java | 60 +- .../impl/ProductTransferAppServiceImpl.java | 98 +- .../impl/PurchaseInventoryAppServiceImpl.java | 29 +- .../impl/PurchaseReturnAppServiceImpl.java | 111 +- .../impl/ReceiptApprovalAppServiceImpl.java | 221 +- .../impl/RequisitionIssueAppServiceImpl.java | 76 +- .../impl/ReturnIssueAppServiceImpl.java | 93 +- .../impl/TraceNoAppServiceImpl.java | 100 +- .../InventorySettlementController.java | 54 + .../controller/LossReportFormController.java | 12 + .../controller/ProductDetailController.java | 41 +- .../ProductStocktakingController.java | 57 +- .../controller/ProductTransferController.java | 72 +- .../PurchaseInventoryController.java | 45 +- .../controller/PurchaseReturnController.java | 67 +- .../controller/ReceiptApprovalController.java | 20 + .../RequisitionIssueController.java | 57 +- .../controller/ReturnIssueController.java | 70 +- .../dto/InventoryBusinessInfoDto.java | 90 + .../dto/InventoryDetailsPageDto.java | 4 +- .../dto/InventoryReceiptDetailDto.java | 258 ++ .../dto/InventorySettlementDto.java | 164 ++ .../dto/InventorySettlementSearchParam.java | 33 + .../inventorymanage/dto/IssueDetailDto.java | 26 +- .../dto/LossReceiptDetailDto.java | 193 ++ .../dto/ProductDetailPageDto.java | 10 +- .../dto/ProductDetailSearchParam.java | 11 +- .../dto/ProductTransferDetailDto.java | 176 +- .../dto/ProductTransferDto.java | 4 + .../dto/ProductTransferPageDto.java | 10 + .../dto/PurchaseReturnDetailDto.java | 187 +- .../dto/ReceiptApprovalSearchParam.java | 2 +- .../inventorymanage/dto/ReceiptDetailDto.java | 178 +- .../inventorymanage/dto/ReceiptPageDto.java | 26 +- .../dto/SupplyItemDetailDto.java | 8 + .../mapper/InventoryAdjustPriceMapper.java | 3 +- .../mapper/InventorySettlementAppMapper.java | 78 + .../mapper/LossReportFormMapper.java | 11 + .../mapper/ProductDetailAppMapper.java | 24 +- .../mapper/ProductStocktakingMapper.java | 14 +- .../mapper/PurchaseReturnMapper.java | 10 +- ...fRatioApplicationRecordAppServiceImpl.java | 8 +- .../impl/GfRatioManageAppServiceImpl.java | 4 +- .../impl/GfStudentListAppServiceImpl.java | 14 +- .../IOutpatientSkinTestAppService.java | 45 + .../IOutpatientSkinTestRecordService.java | 54 - .../OutpatientSkinTestAppServiceImpl.java | 158 ++ .../OutpatientSkinTestRecordServiceImpl.java | 301 --- .../OutpatientTreatmentAppServiceImpl.java | 213 +- .../OutpatientSkinTestAppController.java | 68 + .../OutpatientSkinTestRecordController.java | 90 - .../OutpatientTreatmentController.java | 2 +- .../dto/AllergyIntoInitDto.java | 7 +- .../dto/OutpatientSkinTestRecordDto.java | 98 - .../OutpatientSkinTestRecordSearchParam.java | 20 - .../dto/OutpatientTreatmentInfoDto.java | 4 +- .../dto/SkinTestMedLotNumberDto.java | 34 + .../dto/SkinTestQueryDto.java} | 111 +- .../outpatientmanage/dto/SkinTestSaveDto.java | 68 + .../mapper/OutpatientInfusionAppMapper.java | 11 - .../mapper/OutpatientSkinTestAppMapper.java | 36 + .../IPatientInformationService.java | 15 +- .../impl/PatientInformationServiceImpl.java | 11 +- .../appservice/IChargeBillService.java | 21 + .../appservice/IPaymentRecService.java | 7 +- .../appservice/ThreePartPayService.java | 59 + .../impl/EleInvoiceServiceImpl.java | 79 +- .../impl/IChargeBillServiceImpl.java | 475 +++- .../impl/PaymentRecServiceImpl.java | 253 +- .../impl/ThreePartPayServiceImpl.java | 415 +++- .../ThreePartSimpleFieldMappingService.java | 7 +- .../controller/ChargeBillController.java | 26 + .../PaymentReconciliationController.java | 13 +- .../controller/ThreePartPayController.java | 72 +- .../paymentmanage/dto/ChargeItemDetailVO.java | 4 +- .../dto/EleInvoicePatientInfoDto.java | 1 + .../dto/ThreePartCallBackVo.java | 24 + .../paymentmanage/mapper/PaymentMapper.java | 11 + .../util/ReverseMappingProperties.java | 2 +- .../OrdersGroupPackageAppServiceImpl.java | 6 +- .../ISummaryDispenseMedicineAppService.java | 114 +- .../IWesternMedicineDispenseAppService.java | 3 + .../MedicalDeviceDispenseAppServiceImpl.java | 322 +-- .../impl/MedicationDetailsAppServiceImpl.java | 199 +- .../impl/ReturnMedicineAppServiceImpl.java | 290 ++- ...SummaryDispenseMedicineAppServiceImpl.java | 871 +------ ...WesternMedicineDispenseAppServiceImpl.java | 316 +-- .../MedicalDeviceDispenseController.java | 3 +- .../MedicationDetailsController.java | 16 +- .../PendingMedicationDetailsController.java | 3 +- .../SummaryDispenseMedicineController.java | 186 +- .../WesternMedicineDispenseController.java | 4 +- .../dto/DispenseInventoryDto.java | 6 +- .../pharmacymanage/dto/DispenseItemDto.java | 8 + .../pharmacymanage/dto/FromSearchParam.java | 12 - .../dto/FromSummarySearchParam.java | 16 - .../dto/InventoryDetailDto.java | 59 + .../dto/ItemDispenseOrderDto.java | 99 +- .../dto/MedDetailedAccountPageDto.java | 41 +- .../dto/MedicineSummaryDto.java | 38 +- .../dto/UnDispenseInventoryDto.java | 9 + .../mapper/ReturnMedicineMapper.java | 11 +- .../mapper/SummaryDispenseMedicineMapper.java | 31 +- .../mapper/WesternMedicineDispenseMapper.java | 15 +- .../impl/AdviceManageAppServiceImpl.java | 235 +- .../impl/SpecialAdviceAppServiceImpl.java | 12 +- .../dto/LeaveHospitalParam.java | 12 + .../dto/RegPatientMainInfoDto.java | 1 + .../mapper/AdviceManageAppMapper.java | 2 +- .../appservice/IChargeReportAppService.java | 20 +- .../IMedicationInboundReportAppService.java | 25 + .../appservice/IReportAppService.java | 102 +- .../appservice/ITransferReportAppService.java | 1 - .../impl/ChargeReportAppServiceImpl.java | 202 +- ...MedicationInboundReportAppServiceImpl.java | 116 + .../appservice/impl/ReportAppServiceImpl.java | 312 ++- .../controller/ChargeReportController.java | 31 +- .../MedicationInboundReportController.java | 58 + .../controller/ReportController.java | 220 +- .../web/reportmanage/dto/ChargeReportDto.java | 33 + .../reportmanage/dto/ChargeReportPageDto.java | 23 +- .../dto/ChargeReportSearchParam.java | 13 +- .../dto/MedicationInboundReportDto.java | 65 + .../dto/ReportBasicInformationDetailsDto.java | 8 +- .../dto/ReportDetailsSearchParam.java | 23 + .../dto/ReportDiseaseDetailsDto.java | 55 + .../ReportMedicationInboundDetailsDto.java | 55 + .../dto/ReportMedicationSaleDetailsDto.java | 70 + .../dto/ReportMedicationUsageDto.java | 7 + .../dto/ReportOutpatientMetricsDto.java | 37 + .../dto/ReportPatientDetailsDto.java | 2 + .../dto/ReportPatientDetailsSearchParam.java | 35 + ...ReportPatientMasterDetailsSearchParam.java | 28 + .../dto/ReportPhysicianWorkloadInitDto.java | 67 + .../dto/ReportPhysicianWorkloadPageDto.java | 54 + .../ReportPhysicianWorkloadSearchParam.java | 39 + .../mapper/ChargeReportMapper.java | 39 +- .../mapper/MedicationInboundReportMapper.java | 29 + .../web/reportmanage/mapper/ReportMapper.java | 61 + .../appservice/ITencentAppService.java | 31 + .../impl/TencentAppServiceImpl.java | 108 + .../controller/TencentController.java | 60 + .../dto/CurrentDayEncounterTencentDto.java | 142 ++ .../tencentJH/dto/PatientInfoTencentDto.java | 126 + .../tencentJH/mapper/TencentAppMapper.java | 67 + .../tencentJH/utils/httpUtil/HttpClient.java | 56 + .../tencentJH/utils/httpUtil/HttpReques.java | 55 + .../utils/httpUtil/HttpRequesGet.java | 44 + .../utils/httpUtil/HttpRequesPost.java | 103 + .../utils/httpUtil/HttpRequestGetJson.java | 51 + .../utils/httpUtil/HttpsClientUtil.java | 45 + .../tencentJH/utils/httpUtil/SSLClient.java | 51 + .../utils/httpUtil/WebClientDevWrapper.java | 49 + .../web/ybmanage/controller/YbController.java | 232 +- .../controller/YbInpatientController.java | 217 ++ .../ybmanage/dto/EncounterDiagnosisDto.java | 72 + .../web/ybmanage/dto/PerinfoParamDto.java | 11 + .../dto/VeriPrescriptionDetailInfoDto.java | 2 + .../dto/Yb2401InputInpatientParamDto.java | 48 + .../dto/Yb2403InputInpatientParamDto.java | 45 + .../dto/YbInHospitalRegisterQueryDto.java | 95 + .../openhis/web/ybmanage/mapper/YbMapper.java | 26 + .../web/ybmanage/service/IYbService.java | 138 ++ .../service/impl/YbElepBaseServiceImpl.java | 5 +- .../ybmanage/service/impl/YbServiceImpl.java | 1503 +++++++++++- .../ybmanage/util/CsvHelperZipProcessor.java | 146 ++ .../ybmanage/util/YbEleParamBuilderUtil.java | 2 +- .../src/main/resources/application-local.yml | 4 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/http.yml | 2 +- .../src/main/resources/logback.xml | 10 +- .../InventorySettlementAppMapper.xml | 93 + .../Inventorymanage/LossReportFormMapper.xml | 406 +-- .../ProductDetailAppMapper.xml | 102 +- .../ProductStocktakingMapper.xml | 362 ++- .../Inventorymanage/ProductTransferMapper.xml | 42 +- .../PurchaseInventoryMapper.xml | 54 +- .../Inventorymanage/PurchaseReturnMapper.xml | 410 ++-- .../Inventorymanage/ReceiptApprovalMapper.xml | 137 +- .../RequisitionIssueMapper.xml | 8 +- .../Inventorymanage/ReturnIssueMapper.xml | 8 +- .../basedatamanage/PractitionerAppMapper.xml | 4 + .../chargemanage/InpatientChargeAppMapper.xml | 21 +- .../OutpatientChargeAppMapper.xml | 94 +- .../OutpatientRefundAppMapper.xml | 33 - .../OutpatientRegistrationAppMapper.xml | 6 +- .../mapper/common/CommonAppMapper.xml | 383 +-- .../DoctorStationAdviceAppMapper.xml | 52 +- .../DoctorStationMainAppMapper.xml | 9 +- .../document/DocDefinitionAppMapper.xml | 2 +- .../AdvancePaymentManageAppMapper.xml | 161 +- .../InHospitalRegisterAppMapper.xml | 88 +- .../ATDManageAppMapper.xml | 646 ++++- .../AdviceProcessAppMapper.xml | 156 +- .../EncounterAutoRollAppMapper.xml | 104 + .../MedicineSummaryAppMapper.xml | 2 + .../NurseBillingAppMapper.xml | 297 +++ .../OrgDeviceStockTakeAppMapper.xml | 8 +- .../inpatientmanage/PatientHomeAppMapper.xml | 4 - .../mapper/inspection/GroupRecMapper.xml | 9 + .../mapper/inspection/LisReportMapper.xml | 140 ++ .../mapper/inspection/SampleCollectMapper.xml | 108 + .../OutpatientInfusionAppMapper.xml | 354 +-- .../OutpatientSkinTestAppMapper.xml | 46 + .../OutpatientTreatmentAppMapper.xml | 159 +- .../mapper/paymentmanage/EleInvoiceMapper.xml | 6 +- .../mapper/paymentmanage/PaymentMapper.xml | 16 +- .../MedicationDetailsMapper.xml | 2 +- .../pharmacymanage/ReturnMedicineMapper.xml | 156 +- .../SummaryDispenseMedicineMapper.xml | 180 -- .../WesternMedicineDispenseMapper.xml | 122 +- .../AdviceManageAppMapper.xml | 22 +- .../reportmanage/ChargeReportMapper.xml | 373 +-- .../MedicationInboundReportMapper.xml | 46 + .../mapper/reportmanage/ReportMapper.xml | 191 ++ .../mapper/tencentJH/TencentAppMapper.xml | 184 ++ .../mapper/ybmanage/YbElepMapper.xml | 8 +- .../resources/mapper/ybmanage/YbMapper.xml | 72 + .../main/resources/properties/yb.properties | 2 +- .../common/constant/CommonConstants.java | 176 +- .../common/enums/ActivityDefCategory.java | 48 +- .../openhis/common/enums/AssignSeqEnum.java | 22 +- .../com/openhis/common/enums/CatalogType.java | 18 +- .../openhis/common/enums/ClinicalStatus.java | 7 +- .../com/openhis/common/enums/Criticality.java | 2 + .../openhis/common/enums/DispenseStatus.java | 8 +- .../common/enums/DocDefinitionEnum.java | 25 + .../openhis/common/enums/DocStatusEnum.java | 4 +- .../common/enums/EncounterZyStatus.java | 4 +- .../common/enums/InstrumentCategory.java | 53 + ...iceCategory.java => InstrumentStatus.java} | 32 +- .../common/enums/NursingOrdersClass.java | 4 +- .../openhis/common/enums/ObservationType.java | 67 + .../common/enums/ProcedureCategory.java | 3 +- .../openhis/common/enums/ReportCodeEnum.java | 18 + .../com/openhis/common/enums/Severity.java | 2 + ...tionStatus.java => SpecCollectStatus.java} | 32 +- .../openhis/common/enums/SpecimenType.java | 44 + .../common/enums/TemperatureChartEnum.java | 32 + .../openhis/common/enums/TraceNoStatus.java | 4 +- .../enums/ybenums/YbEncounterZyStatus.java | 37 + .../common/enums/ybenums/YbMdcsType.java | 66 + .../common/enums/ybenums/YbPayment.java | 26 +- .../openhis/common/utils/HisQueryUtils.java | 3 + .../com/openhis/common/utils/PageUtils.java | 56 + openhis-server-new/openhis-domain/pom.xml | 27 +- .../administration/domain/ChargeItem.java | 12 + .../openhis/administration/domain/Device.java | 6 +- .../domain/DeviceDefinition.java | 5 +- .../administration/domain/Instrument.java | 113 + .../domain/ObservationDefinition.java | 55 + .../domain/OrganizationLocation.java | 5 + .../domain/SpecimenDefinition.java | 75 + .../mapper/InstrumentMapper.java | 17 + .../mapper/ObservationDefinitionMapper.java | 17 + .../mapper/SpecimenDefinitionMapper.java | 17 + .../service/IChargeItemService.java | 15 + .../service/IInstrumentService.java | 14 + .../service/IInvoiceService.java | 8 + .../service/ILocationService.java | 8 + .../IObservationDefinitionService.java | 14 + .../service/IPatientIdentifierService.java | 4 +- .../service/ISpecimenDefinitionService.java | 16 + .../impl/ChargeItemDefDetailServiceImpl.java | 2 +- .../impl/ChargeItemDefinitionServiceImpl.java | 6 +- .../service/impl/ChargeItemServiceImpl.java | 15 +- .../impl/EncounterLocationServiceImpl.java | 8 +- .../impl/EncounterParticipantServiceImpl.java | 2 +- .../service/impl/InstrumentServiceImpl.java | 19 + .../service/impl/InvoiceServiceImpl.java | 6 + .../service/impl/LocationServiceImpl.java | 11 +- .../ObservationDefinitionServiceImpl.java | 19 + .../service/impl/OrganizationServiceImpl.java | 3 +- .../impl/PatientIdentifierServiceImpl.java | 7 +- .../impl/PatientStudentServiceImpl.java | 2 +- .../service/impl/PractitionerServiceImpl.java | 2 +- .../impl/SpecimenDefinitionServiceImpl.java | 23 + .../service/impl/SupplierServiceImpl.java | 2 +- .../clinical/domain/AllergyIntolerance.java | 17 +- .../service/IAllergyIntoleranceService.java | 16 - .../clinical/service/IProcedureService.java | 5 +- .../impl/AllergyIntoleranceServiceImpl.java | 56 - .../impl/ConditionDefinitionServiceImpl.java | 2 +- .../service/impl/ConditionServiceImpl.java | 2 +- .../service/impl/ProcedureServiceImpl.java | 13 +- .../domain/DocInventoryItemStatic.java | 38 +- .../openhis/document/domain/DocRecord.java | 4 + .../document/domain/DocStatistics.java | 6 +- .../domain/DocStatisticsDefinition.java | 4 + .../document/mapper/DocStatisticsMapper.java | 18 +- .../IDocInventoryItemStaticService.java | 15 +- .../DocInventoryItemStaticServiceImpl.java | 26 +- .../domain/ThreePartPayCallBack.java | 79 +- .../mapper/PaymentRecDetailMapper.java | 2 +- .../service/IPaymentRecDetailService.java | 2 +- .../service/ThreePartPayCallBackService.java | 2 + .../service/impl/ContractServiceImpl.java | 6 +- .../impl/PaymentRecDetailServiceImpl.java | 4 +- .../PaymentReconciliationServiceImpl.java | 2 +- .../impl/ThreePartPayCallBackServiceImpl.java | 15 +- .../lab/domain/ActivityDefDeviceDef.java | 61 + .../lab/domain/ActivityDefObservationDef.java | 55 + .../lab/domain/ActivityDefSpecimenDef.java | 59 + .../com/openhis/lab/domain/Observation.java | 60 + .../java/com/openhis/lab/domain/Specimen.java | 68 + .../mapper/ActivityDefDeviceDefMapper.java | 17 + .../ActivityDefObservationDefMapper.java | 17 + .../mapper/ActivityDefSpecimenDefMapper.java | 17 + .../openhis/lab/mapper/ObservationMapper.java | 17 + .../openhis/lab/mapper/SpecimenMapper.java | 18 + .../service/IActivityDefDeviceDefService.java | 14 + .../IActivityDefObservationDefService.java | 14 + .../IActivityDefSpecimenDefService.java | 14 + .../lab/service/IObservationService.java | 14 + .../openhis/lab/service/ISpecimenService.java | 14 + .../impl/ActivityDefDeviceDefServiceImpl.java | 19 + .../ActivityDefObservationDefServiceImpl.java | 19 + .../ActivityDefSpecimenDefServiceImpl.java | 19 + .../service/impl/ObservationServiceImpl.java | 19 + .../lab/service/impl/SpecimenServiceImpl.java | 19 + .../impl/MedicationDispenseServiceImpl.java | 2 +- .../impl/MedicationRequestServiceImpl.java | 2 +- .../service/impl/MedicationServiceImpl.java | 6 +- .../nenu/service/impl/GfRatioServiceImpl.java | 5 +- .../template/domain/EncounterAutoRoll.java | 58 + .../mapper/EncounterAutoRollMapper.java | 18 + .../service/IEncounterAutoRollService.java | 15 + .../impl/EncounterAutoRollServiceImpl.java | 21 + .../service/IActivityDefinitionService.java | 22 + .../service/IDeviceDispenseService.java | 9 + .../service/IServiceRequestService.java | 8 + .../impl/ActivityDefinitionServiceImpl.java | 26 +- .../impl/DeviceDispenseServiceImpl.java | 14 +- .../impl/DeviceRequestServiceImpl.java | 2 +- .../impl/InventoryItemServiceImpl.java | 12 +- .../impl/ServiceRequestServiceImpl.java | 13 +- .../impl/SupplyDeliveryServiceImpl.java | 4 +- .../impl/SupplyRequestAutoServiceImpl.java | 13 - .../impl/SupplyRequestServiceImpl.java | 2 +- .../openhis/yb/domain/InpatientFeeDetail.java | 2 +- .../com/openhis/yb/domain/InpatientReg.java | 5 + .../java/com/openhis/yb/dto/BaseInfo.java | 2 + .../java/com/openhis/yb/dto/FileResult.java | 7 + .../yb/dto/MedicalInventory3511Param.java | 7 +- .../yb/dto/MedicalInventory3512Output.java | 74 + .../yb/dto/MedicalInventory3512Param.java | 59 + .../yb/dto/MedicalInventory3513Output.java | 158 ++ .../yb/dto/MedicalInventory3513Param.java | 86 + .../com/openhis/yb/dto/PatientInfoDto.java | 19 + .../openhis/yb}/dto/Yb2302InpatientParam.java | 4 +- .../yb/dto/Yb2401InputInpatientDiseInfo.java | 4 + .../com/openhis/yb/dto/Yb2402InputParam.java | 4 +- .../openhis/yb/dto/Yb2404InputInpatient.java | 6 + .../com/openhis/yb/dto/Yb2601InputParam.java | 20 + .../com/openhis/yb/dto/Yb4101AInputData.java | 46 + .../openhis/yb/dto/Yb4101AInputIteminfo.java | 61 + .../openhis/yb/dto/Yb4101AInputOprninfo.java | 7 + .../com/openhis/yb/dto/Yb4101InputData.java | 46 + .../openhis/yb/dto/Yb4101InputDiseinfo.java | 21 + .../openhis/yb/dto/Yb4101InputIcuinfo.java | 22 + .../openhis/yb/dto/Yb4101InputIteminfo.java | 24 + .../openhis/yb/dto/Yb4101InputOprninfo.java | 37 + .../yb/dto/Yb4101InputOpspdiseinfo.java | 22 + .../openhis/yb/dto/Yb4101InputPayinfo.java | 17 + .../openhis/yb/dto/Yb4101InputSetlinfo.java | 256 ++ .../openhis/yb/dto/Yb4102InputStastInfo.java | 23 + .../com/openhis/yb/dto/Yb4104InputDto.java | 49 + .../yb/dto/Yb4401InputBaseInfoDto.java | 695 ++++++ .../yb/dto/Yb4401InputDiseInfoDto.java | 113 + .../com/openhis/yb/dto/Yb4401InputDto.java | 27 + .../openhis/yb/dto/Yb4401InputIcuInfoDto.java | 74 + .../yb/dto/Yb4401InputOprnInfoDto.java | 215 ++ .../yb/mapper/InpatientPreSettleMapper.java | 10 + .../openhis/yb/mapper/InpatientRegMapper.java | 3 + .../service/IInpatientDischargeService.java | 3 +- .../service/IInpatientFeeDetailService.java | 8 + .../service/IInpatientPreSettleService.java | 11 + .../yb/service/IInpatientRegService.java | 14 + .../yb/service/IInpatientSettleService.java | 10 + .../java/com/openhis/yb/service/YbDao.java | 108 +- .../com/openhis/yb/service/YbHttpUtils.java | 314 ++- .../com/openhis/yb/service/YbManager.java | 81 +- .../impl/ClinicUnSettleServiceImpl.java | 2 +- .../impl/InpatientDischargeServiceImpl.java | 15 +- .../impl/InpatientFeeDetailServiceImpl.java | 7 + .../impl/InpatientPreSettleServiceImpl.java | 21 + .../service/impl/InpatientRegServiceImpl.java | 13 +- .../impl/InpatientSettleServiceImpl.java | 20 +- .../openhis/yb/util/YbParamBuilderUtil.java | 8 +- .../ybcatalog/domain/CatalogDrugInfo.java | 98 + .../domain/CatalogMedicalConsumables.java | 72 + .../domain/CatalogMedicalHerbInfo.java | 40 + .../domain/CatalogMedicalService.java | 21 + .../CatalogSpecialInsuranceDisease.java | 20 + .../CatalogSurgeryStandardDirectory.java | 31 + .../domain/CatalogWesternDisease.java | 23 + .../domain/CatalogZyDiseaseDiagnosis.java | 13 + .../ybcatalog/domain/CatalogZySyndrome.java | 21 + .../mapper/CatalogSpecialDiseaseMapper.java | 3 +- .../CatalogSpecialInsuranceDiseaseMapper.java | 10 + .../service/ICatalogDrugInfoService.java | 3 + .../ICatalogMedicalConsumablesService.java | 3 +- .../ICatalogMedicalHerbInfoService.java | 3 +- .../ICatalogMedicalServiceService.java | 3 +- .../ICatalogSpecialDiseaseService.java | 6 +- ...CatalogSpecialInsuranceDiseaseService.java | 9 + ...atalogSurgeryStandardDirectoryService.java | 3 +- .../ICatalogWesternDiseaseService.java | 3 +- .../ICatalogZyDiseaseDiagnosisService.java | 3 +- .../service/ICatalogZySyndromeService.java | 3 +- .../impl/CatalogDrugInfoServiceImpl.java | 5 + .../CatalogMedicalConsumablesServiceImpl.java | 7 +- .../CatalogMedicalHerbInfoServiceImpl.java | 7 +- .../CatalogMedicalServiceServiceImpl.java | 7 +- .../CatalogSpecialDiseaseServiceImpl.java | 10 +- ...logSpecialInsuranceDiseaseServiceImpl.java | 17 + ...ogSurgeryStandardDirectoryServiceImpl.java | 7 +- .../CatalogWesternDiseaseServiceImpl.java | 7 +- .../CatalogZyDiseaseDiagnosisServiceImpl.java | 7 +- .../impl/CatalogZySyndromeServiceImpl.java | 7 +- .../administration/InstrumentMapper.xml | 7 + .../ObservationDefinitionMapper.xml | 7 + .../SpecimenDefinitionMapper.xml | 7 + .../mapper/document/DocStatisticsMapper.xml | 16 + .../financial/PaymentRecDetailMapper.xml | 3 +- .../mapper/lab/ActivityDefDeviceDefMapper.xml | 7 + .../lab/ActivityDefObservationDefMapper.xml | 7 + .../lab/ActivityDefSpecimenDefMapper.xml | 7 + .../mapper/lab/ObservationMapper.xml | 7 + .../resources/mapper/lab/SpecimenMapper.xml | 7 + .../template/EncounterAutoRollMapper.xml | 7 + .../mapper/yb/InpatientDischargeMapper.xml | 8 + .../mapper/yb/InpatientFeeDetailMapper.xml | 7 + .../mapper/yb/InpatientPreSettleMapper.xml | 7 + .../InpatientRegInfoUpdateRecordeMapper.xml | 7 + .../mapper/yb/InpatientRegMapper.xml | 51 + .../mapper/yb/InpatientSettleMapper.xml | 7 + .../openhis-einvoiceapp/pom.xml | 117 - openhis-server-new/openhis-miniapp/pom.xml | 12 +- .../main/java/com/openhis/OpenHisMiniApp.java | 26 + .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-druid.yml | 61 + .../src/main/resources/application.yml | 149 ++ .../src/main/resources/banner.txt | 10 + .../main/resources/i18n/messages.properties | 46 + .../src/main/resources/logback.xml | 93 + .../main/resources/mybatis/mybatis-config.xml | 21 + openhis-server-new/pom.xml | 220 +- openhis-ui-vue3/HospitalRecordForm.vue | 116 - openhis-ui-vue3/index.html | 2 +- openhis-ui-vue3/package-lock.json | 416 ++-- openhis-ui-vue3/package.json | 3 + .../temperatureSheet/ViewConfig.js | 65 +- .../nurseStation/temperatureSheet/config.js | 324 +-- .../temperatureSheet/dataProcess.js | 40 +- .../nurseStation/temperatureSheet/datas.js | 1095 +++++---- .../nurseStation/temperatureSheet/drawfn.js | 485 ++-- .../nurseStation/temperatureSheet/index.js | 100 +- .../nurseStation/temperatureSheet/line.js | 1522 ++++++------ .../nurseStation/temperatureSheet/template.js | 332 +-- .../nurseStation/temperatureSheet/utils.js | 248 +- openhis-ui-vue3/src/api/public.js | 45 +- openhis-ui-vue3/src/assets/styles/index.scss | 2 +- .../Auto/printBills/exeOrderSheet.vue | 2 +- .../Auto/printBills/injectOrderSheet.vue | 2 +- .../Auto/printBills/triageTicket.vue | 58 +- .../src/components/Print/AdvancePayment.json | 338 +++ .../Print/ChineseMedicinePrescription.json | 1321 ++++++++++ .../Print/DailyOutpatientSettlement.json | 1692 +++++++++++++ .../src/components/Print/Disposal copy.json | 454 ++++ .../src/components/Print/Disposal.json | 454 ++++ .../Print/DocChineseMedicinePrescription.json | 1320 ++++++++++ .../Print/HQOutpatientMedicalRecord.json | 701 ++++++ .../Print/MedicinePrescription.json | 599 +++++ .../src/components/Print/OperativeRecord.json | 407 +++ .../components/Print/OutpatientBilling.json | 732 ++++++ .../Print/OutpatientInfusion bk.json | 239 ++ .../Print/OutpatientInfusion copy.json | 245 ++ .../components/Print/OutpatientInfusion.json | 290 +++ .../Print/OutpatientMedicalRecord.json | 734 ++++++ .../Print/OutpatientRegistration.json | 716 ++++++ .../src/components/Print/Pharmacy copy 2.json | 1174 +++++++++ .../src/components/Print/Pharmacy copy.json | 1176 +++++++++ .../src/components/Print/Pharmacy.json | 1175 +++++++++ .../src/components/Print/Prescription.json | 632 +++++ .../src/components/Print/README.md | 14 + .../src/directive/common/arrowNavigate.js | 90 + openhis-ui-vue3/src/directive/index.js | 2 + openhis-ui-vue3/src/main.js | 127 +- openhis-ui-vue3/src/router/index.js | 5 + .../DischargeDiagnosisCertificate.vue | 422 ++++ .../src/template/FallBedFallAssessment.vue | 72 +- .../src/template/HospitalRecordForm.vue | 536 +++- .../src/template/ProgressNoteform.vue | 393 +++ openhis-ui-vue3/src/template/img/logo.png | Bin 0 -> 21258 bytes openhis-ui-vue3/src/template/imgs/logo.png | Bin 0 -> 21258 bytes .../src/template/inHospitalCaseForm.vue | 351 +++ .../src/template/inHospitalSurgicalRecord.vue | 296 ++- .../src/template/inHosptialCommunicate.vue | 223 +- .../src/template/nursingRecordSheet.vue | 2 +- .../src/template/outpatientMedicalRecord.vue | 17 +- .../template/outpatientMedicalRecord1.1.vue | 455 ++++ .../src/template/surgicalPatientHandover.vue | 2 +- openhis-ui-vue3/src/utils/his.js | 29 + openhis-ui-vue3/src/utils/printUtils.js | 37 +- .../caseTemplatesStatistics/index.vue | 4 + .../basicmanage/pharmacyDepartment/index.vue | 57 +- .../warehouseLocation/components/api.js | 3 +- .../basicmanage/warehouseLocation/index.vue | 3 +- .../basicservices/registrationfee/index.vue | 5 + .../device/components/deviceDialog.vue | 2 +- .../src/views/catalog/device/index.vue | 22 +- .../components/diagnosisTreatmentDialog.vue | 38 +- .../catalog/diagnosistreatment/index.vue | 1 + .../medicine/components/medicineDialog.vue | 9 +- .../src/views/catalog/medicine/index.vue | 9 + .../charge/cliniccharge/components/api.js | 23 +- .../cliniccharge/components/chargeDialog.vue | 566 +++-- .../cliniccharge/components/template.json | 2 +- .../src/views/charge/cliniccharge/index.vue | 209 +- .../clinicrefund/components/refundDialog.vue | 15 +- .../src/views/charge/clinicrefund/index.vue | 10 - .../components/chargeDialog.vue | 406 ++- .../components/outpatientregistration.js | 176 +- .../components/refundDialog.vue | 254 +- .../charge/outpatientregistration/index.vue | 27 +- .../charge/threePayRecord/components/api.js | 39 + .../src/views/charge/threePayRecord/index.vue | 119 + .../dayEnd/component/template.json | 610 ++--- .../views/clinicmanagement/dayEnd/index.vue | 4 +- .../clinicmanagement/dayEnd/indexccu.vue | 65 +- .../disposal/components/api.js | 12 + .../disposal/components/disposalTemplate.json | 23 +- .../components/performRecordDialog.vue | 2 +- .../components/prescriptionTemplate.json | 4 +- .../views/clinicmanagement/disposal/index.vue | 188 +- .../components/ePrescribingDetailDialog.vue | 14 +- .../component/prescription.vue | 4 +- .../clinicmanagement/returnDrug/index.vue | 242 +- .../skinrecord/component/api.js | 87 +- .../clinicmanagement/skinrecord/index.vue | 985 ++++---- .../src/views/doctorstation/components/api.js | 325 ++- .../diagnosis/addDiagnosisDialog.vue | 189 +- .../components/diagnosis/diagnosis.vue | 262 +- .../components/emr/emrtemplate.vue | 44 +- .../components/eprescriptiondialog.vue | 10 +- .../components/hospitalizationDialog.vue | 32 +- .../components/hospitalizationEmr/api.js | 70 +- .../hospitalizationEmr/components/history.vue | 60 +- .../components/template.vue | 86 +- .../components/hospitalizationEmr/index.vue | 460 +++- .../prescription/prescriptionInfo.vue | 2 +- .../prescription/prescriptionlist.vue | 888 ++++--- .../prescription/refundListDialog.vue | 8 - .../components/prescription/skinTestInfo.vue | 195 ++ .../doctorstation/components/reportQuery.vue | 243 ++ .../components/store/medicalpage.js | 257 ++ .../components/tcm/tcmAdvice.vue | 109 +- .../src/views/doctorstation/index.vue | 94 +- .../components/templateJson.json | 4 +- .../components/MedicationDetails.vue | 1142 +++++++++ .../components/MedicationSummary.vue | 241 ++ .../components/ReturnDrug.vue | 481 ++++ .../components/api.js | 221 +- .../inpatientMedicationDispensing/index.vue | 212 +- .../components/medicalRecordFirst.vue | 973 ++++---- .../components/medicalRecordFirstPrint.json | 4 +- .../components/medicalRecordSecond.vue | 746 +++--- .../components/medicalRecordThird.vue | 926 +++---- .../components/chargeDialog.vue | 206 +- .../advanceDeposit/components/patientList.vue | 25 +- .../components/refundDialog.vue | 5 +- .../charge/advanceDeposit/index.vue | 24 +- .../charge/feeSettlement/components/api.js | 172 +- .../feeSettlement/components/chargeDialog.vue | 502 ++-- .../feeSettlement/components/template.json | 433 ++++ .../charge/feeSettlement/index.vue | 585 +++-- .../register/components/accomplishList.vue | 22 +- .../charge/register/components/api.js | 101 +- .../charge/register/components/awaitList.vue | 1 + .../register/components/patientInfo.vue | 336 ++- .../register/components/patientInfoForm.vue | 4 +- .../register/components/patientRegister.vue | 270 +- .../register/components/registerForm.vue | 198 +- .../inpatientRecord/index.vue | 2 +- .../inpatientDoctor/home/components/api.js | 107 +- .../home/components/applicationShow/api.js | 52 +- .../bloodTtransfusionAapplication.vue | 324 ++- .../applicationShow/examineApplication.vue | 312 ++- .../applicationShow/nursingStatus.vue | 22 +- .../applicationShow/reportQuery.vue | 238 ++ .../applicationShow/surgeryApplication.vue | 293 ++- .../applicationShow/testApplication.vue | 292 ++- .../diagnosis/addDiagnosisDialog.vue | 35 +- .../home/components/diagnosis/diagnosis.vue | 217 +- .../components/order/applicationForm/api.js | 53 +- .../applicationForm/bloodTransfusion.vue | 128 +- .../order/applicationForm/laboratoryTests.vue | 136 +- .../applicationForm/leaveHospitalDialog.vue | 77 +- .../applicationForm/medicalExaminations.vue | 149 +- .../order/applicationForm/surgery.vue | 204 +- .../home/components/order/index.vue | 1470 ++++++----- .../home/components/patientList.vue | 4 +- .../src/views/inpatientDoctor/home/emr/api.js | 46 +- .../home/emr/components/history.vue | 112 +- .../home/emr/components/template.vue | 96 +- .../home/emr/components/templateEdit.vue | 2 +- .../views/inpatientDoctor/home/emr/index.vue | 562 ++++- .../src/views/inpatientDoctor/home/index.js | 32 +- .../src/views/inpatientDoctor/home/index.vue | 40 +- .../inpatientDoctor/home/store/patient.js | 15 +- .../InpatientBilling/components/FeeDialog.vue | 746 +++--- .../components/OrderBilling.vue | 4 +- .../InpatientBilling/components/api.js | 58 +- .../components/billingList.vue | 1063 ++++++-- .../components/depositQuery.vue | 2 +- .../components/feeDetailQuery.vue | 2 +- .../inpatientNurse/InpatientBilling/index.vue | 6 +- .../inpatientNurse/components/NurseNavBar.vue | 136 + .../views/inpatientNurse/components/api.js | 23 + .../inpatientNurse/components/patientList.vue | 305 +++ .../components/store/patient.js | 12 + .../inpatientNurse/constants/navigation.js | 45 + .../components/prescriptionList.vue | 108 +- .../components/summaryMedicineList.vue | 2 +- .../inpatientNurse/drugDistribution/index.vue | 117 +- .../inpatientNurse/inOut/components/api.js | 90 +- .../inOut/components/bedAllocation.vue | 484 ++-- .../inpatientNurse/inOut/components/index.ts | 4 +- .../inOut/components/transferInDialog.vue | 470 ++-- .../inOut/components/transferOut.vue | 1116 +++++++++ .../src/views/inpatientNurse/inOut/index.vue | 12 +- .../inpatientNurseStation/index.js | 41 + .../inpatientNurseStation/index.vue | 126 + .../components/prescriptionList.vue | 232 +- .../medicalOrderExecution/index.vue | 2 +- .../components/prescriptionList.vue | 6 +- .../medicalOrderProofread/index.vue | 6 +- .../nursingstatistics/api/index.js | 9 + .../nursingstatistics/criticalrecord.vue | 796 ++++++ .../nursingstatistics/operationrecord.vue | 648 +++++ .../inpatientNurse/rollFee/components/api.js | 177 ++ .../views/inpatientNurse/rollFee/index.vue | 618 +++++ .../views/inpatientNurse/tprChart/index.vue | 62 +- .../views/inpatientNurse/tprsheet/api/api.js | 34 + .../tprsheet/compoents/addAttr.vue | 1199 +++++++++ .../tprsheet/compoents/details.vue | 746 ++++++ .../views/inpatientNurse/tprsheet/index.vue | 62 + .../inspection/groupRec/components/collect.js | 24 + .../src/views/inspection/groupRec/index.vue | 269 ++ .../instrument/components/instrument.js | 82 + .../components/instrumentDialog.vue | 402 +++ .../src/views/inspection/instrument/index.vue | 505 ++++ .../lisconfig/components/lisConfig.js | 36 + .../src/views/inspection/lisconfig/index.vue | 503 ++++ .../observation/components/observation.js | 66 + .../components/observationDialog.vue | 231 ++ .../views/inspection/observation/index.vue | 370 +++ .../inspection/report/components/report.js | 22 + .../src/views/inspection/report/index.vue | 216 ++ .../sampleCollection/components/collect.js | 24 + .../inspection/sampleCollection/index.vue | 268 ++ .../sampleType/components/specimen.js | 77 + .../sampleType/components/specimenDialog.vue | 285 +++ .../src/views/inspection/sampleType/index.vue | 414 ++++ .../billapproval/index.vue | 40 +- .../chkstockBatch/components/medicineList.vue | 2 +- .../chkstock/chkstockBatch/index.vue | 40 +- .../chkstockPart/components/medicineList.vue | 2 +- .../chkstockPart/components/template.json | 74 +- .../chkstock/chkstockPart/index.vue | 2122 +++------------- .../chkstockPartDeptDevice/components/api.js | 110 +- .../components/medicineList.vue | 2 +- .../chkstock/chkstockPartDeptDevice/index.vue | 214 +- .../components/medicineList.vue | 2 +- .../chkstock/chkstockRecord/index.vue | 807 +++--- .../components/chkstockDetailsDialog.vue | 267 ++ .../chkstock/components/medicineList.vue | 8 +- .../components/lossReporting.vue | 2 +- .../lossReporting/index.vue | 40 +- .../components/catalogFields.js | 340 +++ .../components/medicine.js | 17 + .../medicalInsuranceCatalogUpdate/index.vue | 358 +++ .../components/medicineList.vue | 2 +- .../components/templateJson.json | 10 +- .../purchaseDocument/index.vue | 27 +- .../components/inventoryReceiptDialog.vue | 14 +- .../components/medicineList.vue | 2 +- .../requisitionManagement/components/list.vue | 2 +- .../requisitionManagement/index.vue | 34 +- .../returningInventory/index.vue | 35 +- .../components/transferManagement.vue | 2 +- .../returnedPurchase/index.vue | 713 +++--- .../basicInformationDetails.vue | 182 +- .../statisticalManagement/diseaseDetails.vue | 230 ++ .../statisticalManagement/index.vue | 251 +- .../medicationInboundDetails.vue | 224 ++ .../medicationSaleDetails.vue | 274 +++ .../medicationStockOutDetails.vue | 134 +- .../medicationUsageDetails.vue | 113 +- .../outPatientCharge.vue | 568 +++-- .../outpatientDepartmentMetrics.vue | 451 ++++ .../statisticalManagement/patientDetails.vue | 133 +- .../patientMasterDetails.vue | 4 +- .../statisticalManagent.js | 886 +++---- .../transferManagentDetails.vue | 1 + .../storeReconciliation/components/api.js | 24 + .../storeReconciliation/index.vue | 372 +++ .../transferManagent/batchTransfer/index.vue | 2178 ++++++----------- .../transferManagent/components/template.json | 310 +++ .../components/transferDetailsDialog.vue | 264 ++ .../components/transferManagement.vue | 2 +- .../transferManagent/index.vue | 1607 +++++------- .../transferManagentList/index.vue | 182 +- .../profitLossOrder/components/orderTable.vue | 46 +- .../purchaseOrder/components/orderTable.vue | 28 +- .../returnOrder/components/orderTable.vue | 44 +- .../components/orderTable.vue | 51 +- .../stockInOrder/components/orderTable.vue | 60 +- .../stockOutOrder/components/orderTable.vue | 44 +- .../components/orderTable.vue | 49 +- .../dispensingOrder/components/api.js | 65 + .../components/medicineList.vue | 79 + .../dispensingOrder/components/orderTable.vue | 1350 ++++++++++ .../dispensingOrder/index.vue | 997 ++++++++ .../profitLossOrder/components/api.js | 83 + .../components/medicineList.vue | 88 + .../components/orderDialog.vue | 343 +++ .../profitLossOrder/components/orderTable.vue | 1673 +++++++++++++ .../profitLossOrder/index.vue | 1081 ++++++++ .../requisitionOrder/components/api.js | 65 + .../components/medicineList.vue | 79 + .../components/orderTable.vue | 1352 ++++++++++ .../requisitionOrder/index.vue | 997 ++++++++ .../returnToDispensaryOrder/components/api.js | 65 + .../components/medicineList.vue | 79 + .../components/orderTable.vue | 1346 ++++++++++ .../returnToDispensaryOrder/index.vue | 997 ++++++++ .../stockInOrder/components/api.js | 65 + .../stockInOrder/components/medicineList.vue | 79 + .../stockInOrder/components/orderTable.vue | 1346 ++++++++++ .../pharmacymanagement/stockInOrder/index.vue | 997 ++++++++ .../stocktakingOrder/components/api.js | 83 + .../components/medicineList.vue | 88 + .../components/orderDialog.vue | 343 +++ .../components/orderTable.vue | 1721 +++++++++++++ .../stocktakingOrder/index.vue | 1071 ++++++++ .../transferInOrder/components/api.js | 65 + .../components/medicineList.vue | 79 + .../transferInOrder/components/orderTable.vue | 1425 +++++++++++ .../transferInOrder/index.vue | 997 ++++++++ .../transferOutOrder/components/api.js | 65 + .../components/medicineList.vue | 79 + .../components/orderTable.vue | 1425 +++++++++++ .../transferOutOrder/index.vue | 997 ++++++++ .../westernmedicine/components/api.js | 82 +- .../components/disposalTemplate.json | 4 +- .../components/templateJson.json | 4 +- .../westernmedicine/index.vue | 399 ++- .../components/AdmissionDiagnosis.vue | 232 ++ .../components/DischargeDiagnosis.vue | 232 ++ .../inhospital/register/components/api.js | 194 +- .../register/components/registerEdit.vue | 537 ++++ .../register/components/registerForm.vue | 844 +++---- .../inhospital/register/index.vue | 293 ++- ...\347\211\210\346\227\245\345\277\227.docx" | Bin 0 -> 162 bytes ...\350\203\275\350\257\264\346\230\216.docx" | Bin 0 -> 394781 bytes ...\347\211\210\345\206\205\345\256\271.docx" | Bin 0 -> 18582 bytes ...5\345\272\223\350\204\232\346\234\254.sql" | 15 +- ...c_statistics ADD COLUMN definition_id.sql" | 3 + ....doc_statistics ADD COLUMN time_point.sql" | 4 + ...5 add_table doc_inventory_item_static.sql" | 30 + ...215 add_table tmp_encounter_auto_roll.sql" | 35 + ...LIC.doc_record ADD COLUMN print_count.sql" | 8 + ...alter_table doc_statistics_definition.sql" | 6 + ...2511191403 alter_table doc_statistics.sql" | 5 + ...alter_table doc_inventory_item_static.sql" | 5 + ...201214 alter_table wor_inventory_item.sql" | 5 + ...6 alter_table tmp_encounter_auto_roll.sql" | 8 + ...2511211515 alter_table doc_statistics.sql" | 5 + ...2511211815 alter_table doc_statistics.sql" | 4 + ...6 alter_table cli_allergy_intolerance.sql" | 11 + ...alter_table adm_organization_location.sql" | 5 + .../202511281422 inset_sys_menu.sql" | 5 + ...2512020818 add_column_adm_charge_item.sql" | 10 + ...dd_table fin_three_part_pay_call_back.sql" | 110 + ...0\345\242\236\346\212\245\350\241\250.sql" | 18 + .../\346\263\250\351\207\212.sql" | 187 ++ 982 files changed, 110109 insertions(+), 24729 deletions(-) create mode 100644 openhis-server-new/core-common/src/main/java/com/core/common/annotation/ExcelExtra.java rename openhis-server-new/{openhis-common/src/main/java/com/openhis => core-common/src/main/java/com/core}/common/enums/DelFlag.java (77%) delete mode 100644 openhis-server-new/core-common/src/main/java/com/core/common/enums/DeleteFlag.java create mode 100644 openhis-server-new/core-common/src/main/java/com/core/common/utils/NewExcelUtil.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/quartz/task/AutoRollTask.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/quartz/task/InventoryBackupTask.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/quartz/task/StocktakingBatchTask.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/IInstrumentManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/ILaboratoryManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/ILisConfigManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/IObservationManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/ISampleCollectAppManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/ISpecimenManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/InstrumentManageAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/LaboratoryManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/LisConfigManageAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/ObservationManageAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/SampleCollectManageAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/appservice/impl/SpecimenManageAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/InstrumentController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/LaboratoryController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/LisConfigController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/ObservationDefController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/SampleCollectController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/controller/SpecimenDefController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/InstrumentManageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/InstrumentManageInitDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/InstrumentSelParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/InstrumentStatusRequest.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/LisConfigManageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/LisConfigManageInitDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/ObservationDefManageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/ObservationDefManageInitDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/ObservationDefSelParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/ObservationDefStatusRequest.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/ReportResultManageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/SampleCollectManageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/SampleCollectStatusRequest.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/SpecimenDefManageDto.java rename openhis-server-new/openhis-application/src/main/java/com/openhis/web/{outpatientmanage/dto/OutpatientSkinTestInitDto.java => Inspection/dto/SpecimenDefManageInitDto.java} (43%) create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/SpecimenDefSelParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/dto/SpecimenDefStatusRequest.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/mapper/GroupRecMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/mapper/LisReportMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/Inspection/mapper/SampleCollectMapper.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/IDoctorStationAllergyIntolAppService.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAllergyIntolAppServiceImpl.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/controller/DoctorStationAllergyIntolController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/dto/ProofAndTestHistoryDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/dto/ProofAndTestResultDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/document/dto/TrendChartsBig.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/document/dto/TrendChartsOutput.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/document/dto/TrendChartsSmall.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/document/util/OperationDayCalculator.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/IEncounterAutoRollAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/EncounterAutoRollAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/controller/EncounterAutoRollAppController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/AutoRollBasicServiceDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/AutoRollNursingDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/AutoRollSourceDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/EncounterAccountDto.java rename openhis-server-new/openhis-application/src/main/java/com/openhis/web/{pharmacymanage/dto/FromSummaryDto.java => inhospitalnursestation/dto/EncounterAutoRollQueryDto.java} (40%) create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/EncounterAutoRollSaveDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/InBedPatientInfoDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/dto/PendingMedicationDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/mapper/EncounterAutoRollAppMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/appservice/IInventorySettlementAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/appservice/impl/IInventorySettlementAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/controller/InventorySettlementController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/dto/InventoryBusinessInfoDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/dto/InventoryReceiptDetailDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/dto/InventorySettlementDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/dto/InventorySettlementSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/dto/LossReceiptDetailDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/mapper/InventorySettlementAppMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/appservice/IOutpatientSkinTestAppService.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/appservice/IOutpatientSkinTestRecordService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/appservice/impl/OutpatientSkinTestAppServiceImpl.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/appservice/impl/OutpatientSkinTestRecordServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/controller/OutpatientSkinTestAppController.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/controller/OutpatientSkinTestRecordController.java rename openhis-server-new/openhis-application/src/main/java/com/openhis/web/{doctorstation => outpatientmanage}/dto/AllergyIntoInitDto.java (86%) delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/dto/OutpatientSkinTestRecordDto.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/dto/OutpatientSkinTestRecordSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/dto/SkinTestMedLotNumberDto.java rename openhis-server-new/openhis-application/src/main/java/com/openhis/web/{doctorstation/dto/AllergyIntoInfoDto.java => outpatientmanage/dto/SkinTestQueryDto.java} (41%) create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/dto/SkinTestSaveDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatientmanage/mapper/OutpatientSkinTestAppMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/paymentmanage/dto/ThreePartCallBackVo.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/pharmacymanage/dto/FromSearchParam.java delete mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/pharmacymanage/dto/FromSummarySearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/pharmacymanage/dto/InventoryDetailDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/appservice/IMedicationInboundReportAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/appservice/impl/MedicationInboundReportAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/controller/MedicationInboundReportController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ChargeReportDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/MedicationInboundReportDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportDetailsSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportDiseaseDetailsDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportMedicationInboundDetailsDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportMedicationSaleDetailsDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportOutpatientMetricsDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportPatientDetailsSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportPatientMasterDetailsSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportPhysicianWorkloadInitDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportPhysicianWorkloadPageDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/dto/ReportPhysicianWorkloadSearchParam.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/mapper/MedicationInboundReportMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/reportmanage/mapper/ReportMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/appservice/ITencentAppService.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/appservice/impl/TencentAppServiceImpl.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/controller/TencentController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/dto/CurrentDayEncounterTencentDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/dto/PatientInfoTencentDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/mapper/TencentAppMapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpClient.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpReques.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpRequesGet.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpRequesPost.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpRequestGetJson.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/HttpsClientUtil.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/SSLClient.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/tencentJH/utils/httpUtil/WebClientDevWrapper.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/controller/YbInpatientController.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/dto/EncounterDiagnosisDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/dto/PerinfoParamDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/dto/Yb2401InputInpatientParamDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/dto/Yb2403InputInpatientParamDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/dto/YbInHospitalRegisterQueryDto.java create mode 100644 openhis-server-new/openhis-application/src/main/java/com/openhis/web/ybmanage/util/CsvHelperZipProcessor.java create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/InventorySettlementAppMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/EncounterAutoRollAppMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/inspection/GroupRecMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/inspection/LisReportMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/inspection/SampleCollectMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientSkinTestAppMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/MedicationInboundReportMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ReportMapper.xml create mode 100644 openhis-server-new/openhis-application/src/main/resources/mapper/tencentJH/TencentAppMapper.xml create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocDefinitionEnum.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentCategory.java rename openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/{DeviceCategory.java => InstrumentStatus.java} (48%) create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ObservationType.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ReportCodeEnum.java rename openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/{VerificationStatus.java => SpecCollectStatus.java} (52%) create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecimenType.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TemperatureChartEnum.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbEncounterZyStatus.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbMdcsType.java create mode 100644 openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/PageUtils.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Instrument.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ObservationDefinition.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/SpecimenDefinition.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/InstrumentMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/ObservationDefinitionMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/SpecimenDefinitionMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInstrumentService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IObservationDefinitionService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ISpecimenDefinitionService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/InstrumentServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ObservationDefinitionServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SpecimenDefinitionServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefDeviceDef.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefObservationDef.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefSpecimenDef.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Observation.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Specimen.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefDeviceDefMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefObservationDefMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefSpecimenDefMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ObservationMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefDeviceDefService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefObservationDefService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefSpecimenDefService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IObservationService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/ISpecimenService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefDeviceDefServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefObservationDefServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefSpecimenDefServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ObservationServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/SpecimenServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/EncounterAutoRoll.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/template/mapper/EncounterAutoRollMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/IEncounterAutoRollService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/impl/EncounterAutoRollServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/MedicalInventory3512Output.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/MedicalInventory3512Param.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/MedicalInventory3513Output.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/MedicalInventory3513Param.java rename openhis-server-new/{openhis-application/src/main/java/com/openhis/web/ybmanage => openhis-domain/src/main/java/com/openhis/yb}/dto/Yb2302InpatientParam.java (91%) create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2601InputParam.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputData.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputIteminfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputData.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputDiseinfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIcuinfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIteminfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOprninfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOpspdiseinfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputPayinfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputSetlinfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4102InputStastInfo.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4104InputDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputBaseInfoDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDiseInfoDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputIcuInfoDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputOprnInfoDto.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientPreSettleMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientPreSettleService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientPreSettleServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialInsuranceDiseaseMapper.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialInsuranceDiseaseService.java create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialInsuranceDiseaseServiceImpl.java create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/administration/InstrumentMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ObservationDefinitionMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/administration/SpecimenDefinitionMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefDeviceDefMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefObservationDefMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefSpecimenDefMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ObservationMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/template/EncounterAutoRollMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientDischargeMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientFeeDetailMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientPreSettleMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegInfoUpdateRecordeMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegMapper.xml create mode 100644 openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientSettleMapper.xml delete mode 100644 openhis-server-new/openhis-einvoiceapp/pom.xml create mode 100644 openhis-server-new/openhis-miniapp/src/main/java/com/openhis/OpenHisMiniApp.java create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/META-INF/spring-devtools.properties create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/application-druid.yml create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/application.yml create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/banner.txt create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/i18n/messages.properties create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/logback.xml create mode 100644 openhis-server-new/openhis-miniapp/src/main/resources/mybatis/mybatis-config.xml delete mode 100644 openhis-ui-vue3/HospitalRecordForm.vue create mode 100644 openhis-ui-vue3/src/components/Print/AdvancePayment.json create mode 100644 openhis-ui-vue3/src/components/Print/ChineseMedicinePrescription.json create mode 100644 openhis-ui-vue3/src/components/Print/DailyOutpatientSettlement.json create mode 100644 openhis-ui-vue3/src/components/Print/Disposal copy.json create mode 100644 openhis-ui-vue3/src/components/Print/Disposal.json create mode 100644 openhis-ui-vue3/src/components/Print/DocChineseMedicinePrescription.json create mode 100644 openhis-ui-vue3/src/components/Print/HQOutpatientMedicalRecord.json create mode 100644 openhis-ui-vue3/src/components/Print/MedicinePrescription.json create mode 100644 openhis-ui-vue3/src/components/Print/OperativeRecord.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientBilling.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientInfusion bk.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientInfusion copy.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientInfusion.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientMedicalRecord.json create mode 100644 openhis-ui-vue3/src/components/Print/OutpatientRegistration.json create mode 100644 openhis-ui-vue3/src/components/Print/Pharmacy copy 2.json create mode 100644 openhis-ui-vue3/src/components/Print/Pharmacy copy.json create mode 100644 openhis-ui-vue3/src/components/Print/Pharmacy.json create mode 100644 openhis-ui-vue3/src/components/Print/Prescription.json create mode 100644 openhis-ui-vue3/src/components/Print/README.md create mode 100644 openhis-ui-vue3/src/directive/common/arrowNavigate.js create mode 100644 openhis-ui-vue3/src/template/DischargeDiagnosisCertificate.vue create mode 100644 openhis-ui-vue3/src/template/ProgressNoteform.vue create mode 100644 openhis-ui-vue3/src/template/img/logo.png create mode 100644 openhis-ui-vue3/src/template/imgs/logo.png create mode 100644 openhis-ui-vue3/src/template/inHospitalCaseForm.vue create mode 100644 openhis-ui-vue3/src/template/outpatientMedicalRecord1.1.vue create mode 100644 openhis-ui-vue3/src/views/charge/threePayRecord/components/api.js create mode 100644 openhis-ui-vue3/src/views/charge/threePayRecord/index.vue create mode 100644 openhis-ui-vue3/src/views/doctorstation/components/prescription/skinTestInfo.vue create mode 100644 openhis-ui-vue3/src/views/doctorstation/components/reportQuery.vue create mode 100644 openhis-ui-vue3/src/views/doctorstation/components/store/medicalpage.js create mode 100644 openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationDetails.vue create mode 100644 openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationSummary.vue create mode 100644 openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/ReturnDrug.vue create mode 100644 openhis-ui-vue3/src/views/inHospitalManagement/charge/feeSettlement/components/template.json create mode 100644 openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/reportQuery.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/components/NurseNavBar.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/components/api.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/components/patientList.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/components/store/patient.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/constants/navigation.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferOut.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/inpatientNurseStation/index.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/inpatientNurseStation/index.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/api/index.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/criticalrecord.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/operationrecord.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/rollFee/components/api.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/rollFee/index.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/tprsheet/api/api.js create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/addAttr.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/details.vue create mode 100644 openhis-ui-vue3/src/views/inpatientNurse/tprsheet/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/groupRec/components/collect.js create mode 100644 openhis-ui-vue3/src/views/inspection/groupRec/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/instrument/components/instrument.js create mode 100644 openhis-ui-vue3/src/views/inspection/instrument/components/instrumentDialog.vue create mode 100644 openhis-ui-vue3/src/views/inspection/instrument/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/lisconfig/components/lisConfig.js create mode 100644 openhis-ui-vue3/src/views/inspection/lisconfig/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/observation/components/observation.js create mode 100644 openhis-ui-vue3/src/views/inspection/observation/components/observationDialog.vue create mode 100644 openhis-ui-vue3/src/views/inspection/observation/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/report/components/report.js create mode 100644 openhis-ui-vue3/src/views/inspection/report/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/sampleCollection/components/collect.js create mode 100644 openhis-ui-vue3/src/views/inspection/sampleCollection/index.vue create mode 100644 openhis-ui-vue3/src/views/inspection/sampleType/components/specimen.js create mode 100644 openhis-ui-vue3/src/views/inspection/sampleType/components/specimenDialog.vue create mode 100644 openhis-ui-vue3/src/views/inspection/sampleType/index.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/medicalInsuranceCatalogUpdate/components/catalogFields.js create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/medicalInsuranceCatalogUpdate/components/medicine.js create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/medicalInsuranceCatalogUpdate/index.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/diseaseDetails.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationInboundDetails.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationSaleDetails.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/outpatientDepartmentMetrics.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/storeReconciliation/components/api.js create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/storeReconciliation/index.vue create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/template.json create mode 100644 openhis-ui-vue3/src/views/medicationmanagement/transferManagent/components/transferDetailsDialog.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/dispensingOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/dispensingOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/dispensingOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/dispensingOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/profitLossOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/profitLossOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/profitLossOrder/components/orderDialog.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/profitLossOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/profitLossOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/requisitionOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/requisitionOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/requisitionOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/requisitionOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/returnToDispensaryOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/returnToDispensaryOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/returnToDispensaryOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/returnToDispensaryOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stockInOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stockInOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stockInOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stockInOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stocktakingOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stocktakingOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stocktakingOrder/components/orderDialog.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stocktakingOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/stocktakingOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferInOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferInOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferInOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferInOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferOutOrder/components/api.js create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferOutOrder/components/medicineList.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferOutOrder/components/orderTable.vue create mode 100644 openhis-ui-vue3/src/views/pharmacymanagement/transferOutOrder/index.vue create mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/AdmissionDiagnosis.vue create mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/DischargeDiagnosis.vue create mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerEdit.vue create mode 100644 "\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/~$\345\217\221\347\211\210\346\227\245\345\277\227.docx" create mode 100644 "\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/\344\275\217\351\231\242\346\212\244\345\243\253\345\210\222\344\273\267\345\212\237\350\203\275\350\257\264\346\230\216.docx" create mode 100644 "\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/\345\217\221\347\211\210\345\206\205\345\256\271.docx" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-19 ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-21 ALTER TABLE public.doc_statistics ADD COLUMN time_point.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511131215 add_table doc_inventory_item_static.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511171215 add_table tmp_encounter_auto_roll.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191103 ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191303 alter_table doc_statistics_definition.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191403 alter_table doc_statistics.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201011 alter_table doc_inventory_item_static.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201214 alter_table wor_inventory_item.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201516 alter_table tmp_encounter_auto_roll.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211515 alter_table doc_statistics.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211815 alter_table doc_statistics.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511221516 alter_table cli_allergy_intolerance.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511271311 alter_table adm_organization_location.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511281422 inset_sys_menu.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512020818 add_column_adm_charge_item.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512041212 add_table fin_three_part_pay_call_back.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\226\260\345\242\236\346\212\245\350\241\250.sql" create mode 100644 "\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\263\250\351\207\212.sql" diff --git a/openhis-server-new/core-admin/pom.xml b/openhis-server-new/core-admin/pom.xml index 8fc2c124..227e9fe0 100644 --- a/openhis-server-new/core-admin/pom.xml +++ b/openhis-server-new/core-admin/pom.xml @@ -36,11 +36,13 @@ io.swagger swagger-models + 1.6.2 + - com.mysql - mysql-connector-j + mysql + mysql-connector-java diff --git a/openhis-server-new/core-common/pom.xml b/openhis-server-new/core-common/pom.xml index b73c4296..fb177962 100644 --- a/openhis-server-new/core-common/pom.xml +++ b/openhis-server-new/core-common/pom.xml @@ -77,10 +77,6 @@ com.alibaba.fastjson2 fastjson2 - - com.alibaba - fastjson - @@ -140,6 +136,7 @@ com.belerweb pinyin4j + 2.5.1 diff --git a/openhis-server-new/core-common/src/main/java/com/core/common/annotation/ExcelExtra.java b/openhis-server-new/core-common/src/main/java/com/core/common/annotation/ExcelExtra.java new file mode 100644 index 00000000..9431c01f --- /dev/null +++ b/openhis-server-new/core-common/src/main/java/com/core/common/annotation/ExcelExtra.java @@ -0,0 +1,38 @@ +package com.core.common.annotation; + +import java.lang.annotation.*; + +/** + * Excel额外表头信息注解 + * + * @author swb + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ExcelExtra { + /** + * 表头名称 + */ + String name(); + + /** + * 日期格式,如:yyyy-MM-dd HH:mm:ss + */ + String dateFormat() default ""; + + /** + * 排序(越小越靠前) + */ + int sort() default 0; + + /** + * 默认值 + */ + String defaultValue() default ""; + + /** + * 是否导出 + */ + boolean isExport() default true; +} \ No newline at end of file diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DelFlag.java b/openhis-server-new/core-common/src/main/java/com/core/common/enums/DelFlag.java similarity index 77% rename from openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DelFlag.java rename to openhis-server-new/core-common/src/main/java/com/core/common/enums/DelFlag.java index 0e8b0f4f..f59c8060 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DelFlag.java +++ b/openhis-server-new/core-common/src/main/java/com/core/common/enums/DelFlag.java @@ -1,10 +1,13 @@ -package com.openhis.common.enums; +package com.core.common.enums; + +import lombok.Getter; /** * 删除标识 * * @author system */ +@Getter public enum DelFlag { /** * 未删除 @@ -25,18 +28,6 @@ public enum DelFlag { this.info = info; } - public String getCode() { - return code; - } - - public String getInfo() { - return info; - } - - public Integer getValue() { - return value; - } - public static DelFlag getByValue(Integer value) { if (value == null) { return null; diff --git a/openhis-server-new/core-common/src/main/java/com/core/common/enums/DeleteFlag.java b/openhis-server-new/core-common/src/main/java/com/core/common/enums/DeleteFlag.java deleted file mode 100644 index 1668d536..00000000 --- a/openhis-server-new/core-common/src/main/java/com/core/common/enums/DeleteFlag.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.core.common.enums; - -/** - * 删除标志 - * - * @author system - */ -public enum DeleteFlag { - NOT_DELETED("0", "未删除"), DELETED("1", "已删除"); - - private final String code; - private final String info; - - DeleteFlag(String code, String info) { - this.code = code; - this.info = info; - } - - public String getCode() { - return code; - } - - public String getInfo() { - return info; - } -} diff --git a/openhis-server-new/core-common/src/main/java/com/core/common/enums/TenantOptionDict.java b/openhis-server-new/core-common/src/main/java/com/core/common/enums/TenantOptionDict.java index a03a2d0f..5ac09b28 100644 --- a/openhis-server-new/core-common/src/main/java/com/core/common/enums/TenantOptionDict.java +++ b/openhis-server-new/core-common/src/main/java/com/core/common/enums/TenantOptionDict.java @@ -160,7 +160,7 @@ public enum TenantOptionDict { /** * 电子发票开关 */ - INVOICE_SWITCH("invoiceSwitch", "电子发票开关 (0:关闭 1:开启)", 56), + INVOICE_SWITCH("invoiceSwitch", "电子发票开关", 56), /** * 医嘱定价来源 @@ -170,41 +170,153 @@ public enum TenantOptionDict { /** * 三方支付(签到) */ - THREE_PART_SIGN_URL("threePartSignUrl", "三方支付GET请求", 58), + THREE_PART_SIGN_URL("threePartSignUrl", "三方支付【签到】请求路径", 58), + /** + * 三方支付(签到) + */ + THREE_PART_SIGN_STATIC_PARAM("threePartSignStaticParam", "三方支付【签到】固定参数", 59), + /** + * 三方支付(签到) + */ + THREE_PART_SIGN_ACTIVE_PARAM("threePartSignActiveParam", "三方支付【签到】可变参数", 60), + /** + * 三方支付(签到) + */ + THREE_PART_SIGN_MAPPING_METHOD("threePartSignMappingMethod", "三方支付【签到】请求方式", 61), + /** + * 三方支付(消费) + */ + THREE_PART_PAY_URL("threePartPayUrl", "三方支付【消费】请求路径", 62), + /** + * 三方支付(消费) + */ + THREE_PART_PAY_STATIC_PARAM("threePartPayStaticParam", "三方支付【消费】固定参数", 63), + /** + * 三方支付(消费) + */ + THREE_PART_PAY_ACTIVE_PARAM("threePartPayActiveParam", "三方支付【消费】可变参数", 64), /** * 三方支付(消费) */ - THREE_PART_PAY_URL("threePartPayUrl", "三方支付GET请求", 59), + THREE_PART_PAY_MAPPING_METHOD("threePartPayMappingMethod", "三方支付【消费】请求方式", 65), /** * 三方支付(退费) */ - THREE_PART_RETURN_URL("threePartReturnUrl", "三方支付GET请求", 60), + THREE_PART_RETURN_URL("threePartReturnUrl", "三方支付【退费】请求路径", 66), + /** + * 三方支付(退费) + */ + THREE_PART_RETURN_STATIC_PARAM("threePartReturnStaticParam", "三方支付【退费】固定参数", 67), + /** + * 三方支付(退费) + */ + THREE_PART_RETURN_ACTIVE_PARAM("threePartReturnActiveParam", "三方支付【退费】可变参数", 68), + /** + * 三方支付(退费) + */ + THREE_PART_RETURN_MAPPING_METHOD("threePartReturnMappingMethod", "三方支付【退费】请求方式", 69), /** * 三方支付(隔天退费) */ - THREE_PART_NEXT_DAY_RETURN_URL("threePartNextDayReturnUrl", "三方支付GET请求", 61), + THREE_PART_NEXT_DAY_RETURN_URL("threePartNextDayReturnUrl", "三方支付【隔天退费】请求路径", 70), + /** + * 三方支付(隔天退费) + */ + THREE_PART_NEXT_DAY_RETURN_STATIC_PARAM("threePartNextDayReturnStaticParam", "三方支付【隔天退费】固定参数", 71), + /** + * 三方支付(隔天退费) + */ + THREE_PART_NEXT_DAY_RETURN_ACTIVE_PARAM("threePartNextDayReturnActiveParam", "三方支付【隔天退费】可变参数", 72), + /** + * 三方支付(隔天退费) + */ + THREE_PART_NEXT_DAY_RETURN_MAPPING_METHOD("threePartNextDayReturnMappingMethod", "三方支付【隔天退费】请求方式", 73), /** * 三方支付路径(支付结果查询) */ - THREE_PART_PAY_QUERY_URL("threePartPayQueryUrl", "三方支付GET请求", 62), + THREE_PART_PAY_QUERY_URL("threePartPayQueryUrl", "三方支付【支付结果查询】请求路径", 74), + /** + * 三方支付(支付结果查询) + */ + THREE_PART_PAY_QUERY_STATIC_PARAM("threePartPayQueryStaticParam", "三方支付【支付结果查询】固定参数", 75), + /** + * 三方支付(支付结果查询) + */ + THREE_PART_PAY_QUERY_ACTIVE_PARAM("threePartPayQueryActiveParam", "三方支付【支付结果查询】可变参数", 76), + /** + * 三方支付(支付结果查询) + */ + THREE_PART_PAY_QUERY_MAPPING_METHOD("threePartPayQueryMappingMethod", "三方支付【支付结果查询】请求方式", 77), /** * 三方支付路径(退费结果查询) */ - THREE_PART_RETURN_QUERY_URL("threePartReturnQueryUrl", "三方支付GET请求", 63), + THREE_PART_RETURN_QUERY_URL("threePartReturnQueryUrl", "三方支付【退费结果查询】请求路径", 78), + /** + * 三方支付(退费结果查询) + */ + THREE_PART_RETURN_QUERY_STATIC_PARAM("threePartReturnQueryStaticParam", "三方支付【退费结果查询】固定参数", 79), + /** + * 三方支付(退费结果查询) + */ + THREE_PART_RETURN_QUERY_ACTIVE_PARAM("threePartReturnQueryActiveParam", "三方支付【退费结果查询】可变参数", 80), + /** + * 三方支付(退费结果查询) + */ + THREE_PART_RETURN_QUERY_MAPPING_METHOD("threePartReturnQueryMappingMethod", "三方支付【退费结果查询】请求方式", 81), /** * 三方支付路径(隔天退费结果查询) */ - THREE_PART_NEXT_DAY_RETURN_QUERY_URL("threePartNextDayReturnQueryUrl", "三方支付GET请求", 64), + THREE_PART_NEXT_DAY_RETURN_QUERY_URL("threePartNextDayReturnQueryUrl", "三方支付【隔天退费结果查询】请求路径", 82), + /** + * 三方支付(隔天退费结果查询) + */ + THREE_PART_NEXT_DAY_RETURN_QUERY_STATIC_PARAM("threePartNextDayReturnQueryStaticParam", "三方支付【隔天退费结果查询】固定参数", 83), + /** + * 三方支付(隔天退费结果查询) + */ + THREE_PART_NEXT_DAY_RETURN_QUERY_ACTIVE_PARAM("threePartNextDayReturnQueryActiveParam", "三方支付【隔天退费结果查询】可变参数", 84), + /** + * 三方支付(隔天退费结果查询) + */ + THREE_PART_NEXT_DAY_RETURN_QUERY_MAPPING_METHOD("threePartNextDayReturnQueryMappingMethod", "三方支付【隔天退费结果查询】请求方式", + 85), + + /** + * 三方支付(签出) + */ + THREE_PART_SIGN_OUT_URL("threePartSignOutUrl", "三方支付【签出】请求路径", 86), + /** + * 三方支付(签出) + */ + THREE_PART_SIGN_OUT_STATIC_PARAM("threePartSignOutStaticParam", "三方支付【签出】固定参数", 87), + /** + * 三方支付(签出) + */ + THREE_PART_SIGN_OUT_ACTIVE_PARAM("threePartSignOutActiveParam", "三方支付【签出】可变参数", 88), + /** + * 三方支付(签出) + */ + THREE_PART_SIGN_OUT_MAPPING_METHOD("threePartSignOutMappingMethod", "三方支付【签出】请求方式", 89), + + /** + * 三方支付(签出) + */ + YB_INPATIENT_SETTLEMENT_UP_URL("ybInpatientSetlUp", "选填4101或4101A", 90), + + /** + * PACS查看报告地址 + */ + PACS_REPORT_URL("pacsReportUrl", "PACS查看报告地址", 91), /** - * 三方支付参数 + * LIS查看报告地址 */ - THREE_PART_PARAM("threePartParam", "三方支付GET请求", 65); + LIS_REPORT_URL("lisReportUrl", "LIS查看报告地址", 92); private final String code; private final String name; diff --git a/openhis-server-new/core-common/src/main/java/com/core/common/utils/NewExcelUtil.java b/openhis-server-new/core-common/src/main/java/com/core/common/utils/NewExcelUtil.java new file mode 100644 index 00000000..b41f18a0 --- /dev/null +++ b/openhis-server-new/core-common/src/main/java/com/core/common/utils/NewExcelUtil.java @@ -0,0 +1,1837 @@ +package com.core.common.utils; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.ss.util.RegionUtil; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.core.common.annotation.Excel; +import com.core.common.annotation.Excel.ColumnType; +import com.core.common.annotation.Excel.Type; +import com.core.common.annotation.ExcelExtra; +import com.core.common.annotation.Excels; +import com.core.common.config.CoreConfig; +import com.core.common.core.domain.AjaxResult; +import com.core.common.core.text.Convert; +import com.core.common.exception.UtilException; +import com.core.common.utils.file.FileTypeUtils; +import com.core.common.utils.file.FileUtils; +import com.core.common.utils.file.ImageUtils; +import com.core.common.utils.poi.ExcelHandlerAdapter; +import com.core.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author system + */ +public class NewExcelUtil { + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + public static final String[] FORMULA_STR = {"=", "-", "+", "@"}; + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + private static final Logger log = LoggerFactory.getLogger(NewExcelUtil.class); + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + /** + * 实体对象 + */ + public Class clazz; + /** + * 需要显示列属性 + */ + public String[] includeFields; + /** + * 需要排除列属性 + */ + public String[] excludeFields; + /** + * 工作表名称 + */ + private String sheetName; + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + /** + * 工作薄对象 + */ + private Workbook wb; + /** + * 工作表对象 + */ + private Sheet sheet; + /** + * 样式列表 + */ + private Map styles; + /** + * 导入导出数据列表 + */ + private List list; + /** + * 注解列表 + */ + private List fields; + /** + * 当前行号 + */ + private int rownum; + /** + * 标题 + */ + private String title; + /** + * 最大高度 + */ + private short maxHeight; + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + /** + * 对象的子列表方法 + */ + private Method subMethod; + /** + * 对象的子列表属性 + */ + private List subFields; + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 构造方法 + * + * @param clazz 实体类类型 + */ + public NewExcelUtil(Class clazz) { + this.clazz = clazz; + } + + /** + * 获取画布 + * + * @param sheet 工作表 + * @return 绘图对象 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) { + if (sheet.getDrawingPatriarch() == null) { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { + HSSFClientAnchor anchor = (HSSFClientAnchor)shape.getAnchor(); + if (shape instanceof HSSFPicture) { + HSSFPicture pic = (HSSFPicture)shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } else { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) { + if (dr instanceof XSSFDrawing) { + XSSFDrawing drawing = (XSSFDrawing)dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) { + if (shape instanceof XSSFPicture) { + XSSFPicture pic = (XSSFPicture)shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 仅在Excel中显示列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + */ + public void showColumn(String... fields) { + this.includeFields = fields; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + */ + public void hideColumn(String... fields) { + this.excludeFields = fields; + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() { + if (StringUtils.isNotEmpty(title)) { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion( + new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() { + if (isSubList()) { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) { + Excel attr = (Excel)objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle( + styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) { + List list = null; + try { + list = importExcel(is, 0); + } catch (Exception e) { + log.error("导入Excel异常{}", e.getMessage()); + throw new UtilException(e.getMessage()); + } finally { + IOUtils.closeQuietly(is); + } + return list; + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) { + pictures = getSheetPictures07((XSSFSheet)sheet, (XSSFWorkbook)wb); + } else { + pictures = getSheetPictures03((HSSFSheet)sheet, (HSSFWorkbook)wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } else { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) { + Excel attr = (Excel)objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field)entry.getValue()[0]; + Excel attr = (Excel)entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) { + val = StringUtils.substringBefore(s, ".0"); + } else { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) { + val = parseDateToStr(dateFormat, val); + } else { + val = Convert.toStr(val); + } + } + } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) + && StringUtils.isNumeric(Convert.toStr(val))) { + val = Convert.toInt(val); + } else if ((Long.TYPE == fieldType || Long.class == fieldType) + && StringUtils.isNumeric(Convert.toStr(val))) { + val = Convert.toLong(val); + } else if (Double.TYPE == fieldType || Double.class == fieldType) { + val = Convert.toDouble(val); + } else if (Float.TYPE == fieldType || Float.class == fieldType) { + val = Convert.toFloat(val); + } else if (BigDecimal.class == fieldType) { + val = Convert.toBigDecimal(val); + } else if (Date.class == fieldType) { + if (val instanceof String) { + val = DateUtils.parseDate(val); + } else if (val instanceof Double) { + val = DateUtil.getJavaDate((Double)val); + } + } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) { + propertyName = field.getName() + "." + attr.targetAttr(); + } + if (StringUtils.isNotEmpty(attr.readConverterExp())) { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } else if (StringUtils.isNotEmpty(attr.dictType())) { + if (!sysDictMap.containsKey(attr.dictType() + val)) { + String dictValue = + reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + sysDictMap.put(attr.dictType() + val, dictValue); + } + val = sysDictMap.get(attr.dictType() + val); + } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { + val = dataFormatHandlerAdapter(val, attr, null); + } else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) { + val = ""; + } else { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response HTTP响应对象 + */ + public void exportExcel(HttpServletResponse response) { + try { + writeSheet(); + wb.write(response.getOutputStream()); + } catch (Exception e) { + log.error("导出Excel异常{}", e.getMessage()); + } finally { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() { + OutputStream out = null; + try { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } catch (Exception e) { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } finally { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @param styles 样式列表 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) { + Map headerStyles = new HashMap(); + for (Object[] os : fields) { + Excel excel = (Excel)os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short)10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + // 设置表格头单元格文本形式 + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) { + Map styles = new HashMap(); + for (Object[] os : fields) { + Field field = (Field)os[0]; + Excel excel = (Excel)os[1]; + if (Collection.class.isAssignableFrom(field.getType())) { + ParameterizedType pt = (ParameterizedType)field.getGenericType(); + Class subClass = (Class)pt.getActualTypeArguments()[0]; + List subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + for (Field subField : subFields) { + Excel subExcel = subField.getAnnotation(Excel.class); + annotationDataStyles(styles, subField, subExcel); + } + } else { + annotationDataStyles(styles, field, excel); + } + } + return styles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param styles 自定义样式列表 + * @param field 属性列信息 + * @param excel 注解信息 + */ + public void annotationDataStyles(Map styles, Field field, Excel excel) { + String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), + excel.cellType()); + if (!styles.containsKey(key)) { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short)10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + if (ColumnType.TEXT == excel.cellType()) { + DataFormat dataFormat = wb.createDataFormat(); + style.setDataFormat(dataFormat.getFormat("@")); + } + styles.put(key, style); + } + } + + /** + * 创建单元格 + * + * @param attr Excel注解 + * @param row 行对象 + * @param column 列索引 + * @return 单元格对象 + */ + public Cell createHeadCell(Excel attr, Row row, int column) { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); // 使用 header 样式 + if (isSubList()) { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), + attr.color(), attr.backgroundColor(), attr.cellType()))); + if (attr.needMerge()) { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) { + if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType()) { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } else if (ColumnType.NUMERIC == attr.cellType()) { + if (StringUtils.isNotNull(value)) { + cell.setCellValue( + StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } else if (ColumnType.IMAGE == attr.cellType()) { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short)cell.getColumnIndex(), + cell.getRow().getRowNum(), (short)(cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取图片类型,设置图片插入类型 + * + * @param value 图片字节数组 + * @return 图片类型 + */ + public int getImageType(byte[] value) { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) { + return Workbook.PICTURE_TYPE_JPEG; + } else if ("PNG".equalsIgnoreCase(type)) { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + * + * @param attr Excel注解 + * @param row 行对象 + * @param column 列索引 + */ + public void setDataValidation(Excel attr, Row row, int column) { + if (attr.name().indexOf("注:") >= 0) { + sheet.setColumnWidth(column, 6000); + } else { + // 设置列宽 + sheet.setColumnWidth(column, (int)((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0 || attr.comboReadDict()) { + String[] comboArray = attr.combo(); + if (attr.comboReadDict()) { + if (!sysDictMap.containsKey("combo_" + attr.dictType())) { + String labels = DictUtils.getDictLabels(attr.dictType()); + sysDictMap.put("combo_" + attr.dictType(), labels); + } + String val = sysDictMap.get("combo_" + attr.dictType()); + comboArray = StringUtils.split(val, DictUtils.SEPARATOR); + } + if (comboArray.length > 15 || StringUtils.join(comboArray).length() > 255) { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, comboArray, attr.prompt(), 1, 100, column, column); + } else { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, comboArray, attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + * + * @param attr Excel注解 + * @param row 行对象 + * @param vo 数据对象 + * @param field 字段 + * @param column 列索引 + * @return 单元格对象 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { + Cell cell = null; + try { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) { + CellRangeAddress cellAddress = + new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get("data")); // 使用 data 样式 + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { + if (!sysDictMap.containsKey(dictType + value)) { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } else if (value instanceof BigDecimal && -1 != attr.scale()) { + cell.setCellValue((((BigDecimal)value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { + cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); + } else { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } catch (Exception e) { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = + textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, + int endRow, int firstCol, int endCol) { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @param cell 单元格对象 + * @return 格式化后的数据值 + */ + public String dataFormatHandlerAdapter(Object value, Excel excel, Cell cell) { + try { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", + new Class[] {Object.class, String[].class, Cell.class, Workbook.class}); + value = formatMethod.invoke(instance, value, excel.args(), cell, this.wb); + } catch (Exception e) { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + * + * @param index 列索引 + * @param text 文本值 + * @param entity Excel注解 + */ + private void addStatisticsData(Integer index, String text, Excel entity) { + if (entity != null && entity.isStatistics()) { + Double temp = 0D; + if (!statistics.containsKey(index)) { + statistics.put(index, temp); + } + try { + temp = Double.valueOf(text); + } catch (NumberFormatException e) { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() { + if (statistics.size() > 0) { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + * + * @param filename 文件名 + * @return 编码后的文件名 + */ + public String encodingFilename(String filename) { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + * @return 绝对路径 + */ + public String getAbsoluteFile(String filename) { + String downloadPath = CoreConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) { + String target = excel.targetAttr(); + if (target.contains(".")) { + String[] targets = target.split("[.]"); + for (String name : targets) { + o = getValue(o, name); + } + } else { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o 对象 + * @param name 属性名 + * @return value 属性值 + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel)objects[1]).sort())) + .collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 添加字段信息 + * + * @param fields 字段列表 + * @param field 字段对象 + */ + public void addField(List fields, Field field) { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + field.setAccessible(true); + fields.add(new Object[] {field, attr}); + } + if (Collection.class.isAssignableFrom(field.getType())) { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType)field.getGenericType(); + Class subClass = (Class)pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) { + if (StringUtils.isNotEmpty(includeFields)) { + if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) { + field.setAccessible(true); + fields.add(new Object[] {field, attr}); + } + } else { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) { + field.setAccessible(true); + fields.add(new Object[] {field, attr}); + } + } + } + } + } + + /** + * 根据注解获取最大行高 + * + * @return 行高 + */ + public short getRowHeight() { + double maxHeight = 0; + for (Object[] os : this.fields) { + Excel excel = (Excel)os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short)(maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) { + if (row == null) { + return row; + } + Object val = ""; + try { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) { + val = DateUtil.getJavaDate((Double)val); // POI Excel 日期格式转换 + } else { + if ((Double)val % 1 != 0) { + val = new BigDecimal(val.toString()); + } else { + val = new DecimalFormat("0").format(val); + } + } + } else if (cell.getCellType() == CellType.STRING) { + val = cell.getStringCellValue(); + } else if (cell.getCellType() == CellType.BOOLEAN) { + val = cell.getBooleanCellValue(); + } else if (cell.getCellType() == CellType.ERROR) { + val = cell.getErrorCellValue(); + } + + } + } catch (Exception e) { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return 是否为空行 + */ + private boolean isRowEmpty(Row row) { + if (row == null) { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) { + return false; + } + } + return true; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) { + if (val == null) { + return ""; + } + String str; + if (val instanceof Date) { + str = DateUtils.parseDateToStr(dateFormat, (Date)val); + } else if (val instanceof LocalDateTime) { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime)val)); + } else if (val instanceof LocalDate) { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate)val)); + } else { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + * + * @return 是否有子列表 + */ + public boolean isSubList() { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + * + * @param vo 数据对象 + * @return 是否有子列表值 + */ + public boolean isSubListValue(T vo) { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) + && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + * + * @param obj 对象 + * @return 集合值 + */ + public Collection getListCellValue(Object obj) { + Object value; + try { + value = subMethod.invoke(obj, new Object[] {}); + } catch (Exception e) { + return new ArrayList(); + } + return (Collection)value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } catch (Exception e) { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } + + /** + * 额外字段列表 + */ + private List extraFields; + + /** + * 需要隐藏的额外表头字段 + */ + private String[] hiddenExtraFields; + + /** + * 隐藏额外表头字段 + * + * @param fields 额外表头字段名 + */ + public void hideExtraColumn(String... fields) { + this.hiddenExtraFields = fields; + } + + /** + * 检查额外字段是否需要隐藏 + * + * @param fieldName 字段名 + * @return 是否需要隐藏 + */ + private boolean isExtraFieldHidden(String fieldName) { + return hiddenExtraFields != null && ArrayUtils.contains(hiddenExtraFields, fieldName); + } + + /** + * 初始化额外字段 + */ + private void createExcelExtraField() { + this.extraFields = getExtraFields(); + this.extraFields = this.extraFields.stream() + .sorted(Comparator.comparing(objects -> ((ExcelExtra)objects[1]).sort())).collect(Collectors.toList()); + } + + /** + * 获取额外字段注解信息(过滤隐藏字段) + * + * @return 额外字段列表 + */ + public List getExtraFields() { + List extraFields = new ArrayList<>(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + + for (Field field : tempFields) { + if (field.isAnnotationPresent(ExcelExtra.class)) { + ExcelExtra attr = field.getAnnotation(ExcelExtra.class); + // 检查字段是否需要隐藏 + if (attr != null && attr.isExport() && !isExtraFieldHidden(field.getName())) { + field.setAccessible(true); + extraFields.add(new Object[] {field, attr}); + } + } + } + return extraFields; + } + + /** + * 创建额外表头信息 每个表头占三个单元格:标签单元格,值单元格合并居中显示 + * + * @param entity 实体对象 + */ + public void createExtraHeader(T entity) { + if (entity == null || extraFields == null || extraFields.isEmpty()) { + return; + } + + try { + int currentRowNum = rownum; + + for (Object[] os : extraFields) { + Field field = (Field)os[0]; + ExcelExtra attr = (ExcelExtra)os[1]; + + // 检查字段是否需要隐藏 + if (isExtraFieldHidden(field.getName())) { + continue; + } + + Row row = sheet.createRow(currentRowNum++); + + // 创建标签单元格(第0列) + Cell labelCell = row.createCell(0); + labelCell.setCellValue(attr.name()); + labelCell.setCellStyle(styles.get("extraLabel")); + + // 创建值单元格(第1列) + Cell valueCell = row.createCell(1); + Object value = field.get(entity); + String cellValue = formatExtraCellValue(value, attr); + valueCell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue); + valueCell.setCellStyle(styles.get("extraValue")); + + // 创建合并区域(第1列到第2列) + CellRangeAddress mergedRegion = new CellRangeAddress(row.getRowNum(), row.getRowNum(), 1, 2); + sheet.addMergedRegion(mergedRegion); + + // 手动设置合并区域的边框,确保完整显示 + RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, sheet); + RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, sheet); + RegionUtil.setTopBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, sheet); + RegionUtil.setBottomBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, sheet); + RegionUtil.setLeftBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, sheet); + RegionUtil.setRightBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, sheet); + } + + // 设置列宽 + sheet.setColumnWidth(0, 15 * 256); // 标签列宽 + sheet.setColumnWidth(1, 20 * 256); // 值列宽 + sheet.setColumnWidth(2, 20 * 256); // 值列宽 + + // 更新当前行号,在额外表头和数据表头之间空一行 + rownum = currentRowNum + 1; + subMergedFirstRowNum = rownum; + subMergedLastRowNum = rownum; + + } catch (Exception e) { + log.error("创建额外表头失败: {}", e.getMessage()); + } + } + + /** + * 格式化额外表头单元格值 + * + * @param value 值 + * @param attr 额外注解 + * @return 格式化后的值 + */ + private String formatExtraCellValue(Object value, ExcelExtra attr) { + if (value == null) { + return ""; + } + + if (StringUtils.isNotEmpty(attr.dateFormat())) { + return parseDateToStr(attr.dateFormat(), value); + } + + return Convert.toStr(value); + } + + /** + * 重写 init 方法,初始化额外字段 + * + * @param list 数据列表 + * @param sheetName 工作表名称 + * @param title 标题 + * @param type 类型 + */ + public void init(List list, String sheetName, String title, Type type) { + if (list == null) { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createExcelExtraField(); // 初始化额外字段 + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建表格样式 + * + * @param wb 工作簿 + * @return 样式映射 + */ + private Map createStyles(Workbook wb) { + Map styles = new HashMap(); + + // 标题样式(合并居中,加粗,浅灰色背景) + CellStyle titleStyle = wb.createCellStyle(); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short)16); + titleFont.setBold(true); + titleStyle.setFont(titleFont); + titleStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + titleStyle.setBorderBottom(BorderStyle.THIN); + titleStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + styles.put("title", titleStyle); + + // 表头样式(浅灰色背景,加粗,居中,细边框) + CellStyle headerStyle = wb.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + + headerStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + headerStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + headerStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + headerStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short)11); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + styles.put("header", headerStyle); + + // 数据行样式(居中,细边框) + CellStyle dataStyle = wb.createCellStyle(); + dataStyle.setAlignment(HorizontalAlignment.CENTER); + dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + dataStyle.setBorderTop(BorderStyle.THIN); + dataStyle.setBorderBottom(BorderStyle.THIN); + dataStyle.setBorderLeft(BorderStyle.THIN); + dataStyle.setBorderRight(BorderStyle.THIN); + + dataStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + dataStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + dataStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + dataStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short)10); + dataStyle.setFont(dataFont); + styles.put("data", dataStyle); + + // 额外表头标签样式(浅灰色背景,加粗,居中,细边框) + CellStyle extraLabelStyle = wb.createCellStyle(); + extraLabelStyle.setAlignment(HorizontalAlignment.CENTER); + extraLabelStyle.setVerticalAlignment(VerticalAlignment.CENTER); + extraLabelStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + extraLabelStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + extraLabelStyle.setBorderTop(BorderStyle.THIN); + extraLabelStyle.setBorderBottom(BorderStyle.THIN); + extraLabelStyle.setBorderLeft(BorderStyle.THIN); + extraLabelStyle.setBorderRight(BorderStyle.THIN); + extraLabelStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + extraLabelStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + extraLabelStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + extraLabelStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + + Font extraLabelFont = wb.createFont(); + extraLabelFont.setFontName("Arial"); + extraLabelFont.setFontHeightInPoints((short)10); + extraLabelFont.setBold(true); + extraLabelStyle.setFont(extraLabelFont); + styles.put("extraLabel", extraLabelStyle); + + // 额外表头值样式(居中,细边框) + CellStyle extraValueStyle = wb.createCellStyle(); + extraValueStyle.setAlignment(HorizontalAlignment.CENTER); + extraValueStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + extraValueStyle.setBorderTop(BorderStyle.THIN); + extraValueStyle.setBorderBottom(BorderStyle.THIN); + extraValueStyle.setBorderLeft(BorderStyle.THIN); + extraValueStyle.setBorderRight(BorderStyle.THIN); + extraValueStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + extraValueStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + extraValueStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + extraValueStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + + Font extraValueFont = wb.createFont(); + extraValueFont.setFontName("Arial"); + extraValueFont.setFontHeightInPoints((short)10); + extraValueStyle.setFont(extraValueFont); + styles.put("extraValue", extraValueStyle); + + // 统计行样式(居中,细边框) + CellStyle totalStyle = wb.createCellStyle(); + totalStyle.setAlignment(HorizontalAlignment.CENTER); + totalStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + totalStyle.setBorderTop(BorderStyle.THIN); + totalStyle.setBorderBottom(BorderStyle.THIN); + totalStyle.setBorderLeft(BorderStyle.THIN); + totalStyle.setBorderRight(BorderStyle.THIN); + totalStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + totalStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + totalStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + totalStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short)10); + totalFont.setBold(true); + totalStyle.setFont(totalFont); + styles.put("total", totalStyle); + + // 合并注解样式(可选) + styles.putAll(annotationHeaderStyles(wb, styles)); + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 创建工作表 + */ + public void writeSheet() { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int)Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) { + createSheet(sheetNo, index); + + // 创建标题 + createTitle(); + + // 创建额外表头(如果有数据的话使用第一条数据的额外信息) + if (list != null && !list.isEmpty()) { + createExtraHeader(list.get(0)); + } + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + + // 严格按照排序后的字段列表创建表头 + for (Object[] os : fields) { + Field field = (Field)os[0]; + Excel excel = (Excel)os[1]; + if (Collection.class.isAssignableFrom(field.getType())) { + // 对于子列表字段,也要按照子字段的排序创建表头 + if (subFields != null) { + List sortedSubFields = + subFields.stream().filter(subField -> subField.isAnnotationPresent(Excel.class)) + .sorted(Comparator.comparing(subField -> { + Excel subExcel = subField.getAnnotation(Excel.class); + return subExcel.sort(); + })).collect(Collectors.toList()); + + for (Field subField : sortedSubFields) { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + } else { + this.createHeadCell(excel, row, column++); + } + } + + if (Type.EXPORT.equals(type)) { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 获取字段注解信息 - 确保排序正确 + * + * @return 字段列表 + */ + public List getFields() { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + + if (StringUtils.isNotEmpty(includeFields)) { + for (Field field : tempFields) { + if (ArrayUtils.contains(this.includeFields, field.getName()) + || field.isAnnotationPresent(Excels.class)) { + addField(fields, field); + } + } + } else if (StringUtils.isNotEmpty(excludeFields)) { + for (Field field : tempFields) { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) { + addField(fields, field); + } + } + } else { + for (Field field : tempFields) { + addField(fields, field); + } + } + + // 严格按照sort排序,确保needMerge=true的字段也能正确排序 + return fields.stream().sorted(Comparator.comparing(objects -> { + Excel excel = (Excel)objects[1]; + return excel.sort(); + })).collect(Collectors.toList()); + } + + /** + * 填充excel数据 - 优化合并单元格的数据填充顺序 + * + * @param index 索引 + * @param row 行对象 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + + for (int i = startNo; i < endNo; i++) { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T)list.get(i); + Collection subList = null; + if (isSubList()) { + if (isSubListValue(vo)) { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } else { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + + int column = 0; + // 严格按照排序后的字段顺序填充数据 + for (Object[] os : fields) { + Field field = (Field)os[0]; + Excel excel = (Excel)os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { + boolean subFirst = false; + for (Object obj : subList) { + if (subFirst) { + rowNo++; + row = sheet.createRow(rowNo); + } + // 子字段也要排序 + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + List sortedSubFields = subFields.stream().sorted(Comparator.comparing(subField -> { + Excel subExcel = subField.getAnnotation(Excel.class); + return subExcel.sort(); + })).collect(Collectors.toList()); + + int subIndex = 0; + for (Field subField : sortedSubFields) { + if (subField.isAnnotationPresent(Excel.class)) { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T)obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } else { + this.addCell(excel, row, vo, field, column++); + } + } + } + } +} \ No newline at end of file diff --git a/openhis-server-new/core-flowable/pom.xml b/openhis-server-new/core-flowable/pom.xml index a96ef821..2c047769 100644 --- a/openhis-server-new/core-flowable/pom.xml +++ b/openhis-server-new/core-flowable/pom.xml @@ -80,6 +80,7 @@ com.googlecode.aviator aviator + 5.3.3 diff --git a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/MybatisPlusConfig.java b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/MybatisPlusConfig.java index 1c1d5661..c745a676 100644 --- a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/MybatisPlusConfig.java +++ b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/MybatisPlusConfig.java @@ -99,7 +99,7 @@ public class MybatisPlusConfig { "med_medication_definition", "med_medication_dispense", "med_medication_request", "wor_activity_definition", "wor_device_dispense", "wor_device_request", "wor_inventory_item", "wor_service_request", "wor_service_request_detail", "wor_supply_delivery", "wor_supply_request", - "sys_operation_record")); + "sys_operation_record","doc_inventory_item_static")); @Override public boolean ignoreTable(String tableName) { diff --git a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/SecurityConfig.java b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/SecurityConfig.java index e6bf5241..5154bbd2 100644 --- a/openhis-server-new/core-framework/src/main/java/com/core/framework/config/SecurityConfig.java +++ b/openhis-server-new/core-framework/src/main/java/com/core/framework/config/SecurityConfig.java @@ -1,9 +1,5 @@ package com.core.framework.config; -import com.core.framework.config.properties.PermitAllUrlProperties; -import com.core.framework.security.filter.JwtAuthenticationTokenFilter; -import com.core.framework.security.handle.AuthenticationEntryPointImpl; -import com.core.framework.security.handle.LogoutSuccessHandlerImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,7 +7,7 @@ import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; @@ -21,12 +17,17 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.web.filter.CorsFilter; +import com.core.framework.config.properties.PermitAllUrlProperties; +import com.core.framework.security.filter.JwtAuthenticationTokenFilter; +import com.core.framework.security.handle.AuthenticationEntryPointImpl; +import com.core.framework.security.handle.LogoutSuccessHandlerImpl; + /** * spring security配置 - * + * * @author system */ -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true) @Configuration public class SecurityConfig { /** @@ -85,38 +86,38 @@ public class SecurityConfig { @Bean protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { return httpSecurity - // CSRF禁用,因为不使用session - .csrf(csrf -> csrf.disable()) - // 禁用HTTP响应标头 - .headers((headersCustomizer) -> { - headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin()); - }) - // 认证失败处理类 - .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler)) - // 基于token,所以不需要session - .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - // 注解标记允许匿名访问的url - .authorizeHttpRequests((requests) -> { - permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); - // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/login", "/register", "/captchaImage").permitAll() - // 静态资源,可匿名访问 - .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**") - .permitAll() - .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**") - .permitAll() - .antMatchers("/patientmanage/information/**") - .permitAll() - // 除上面外的所有请求全部需要鉴权认证 - .anyRequest().authenticated(); - }) - // 添加Logout filter - .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)) - // 添加JWT filter - .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) - // 添加CORS filter - .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class) - .addFilterBefore(corsFilter, LogoutFilter.class).build(); + // CSRF禁用,因为不使用session + .csrf(csrf -> csrf.disable()) + // 禁用HTTP响应标头 + .headers((headersCustomizer) -> { + headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin()); + }) + // 认证失败处理类 + .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler)) + // 基于token,所以不需要session + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + // 注解标记允许匿名访问的url + .authorizeHttpRequests((requests) -> { + permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + requests.antMatchers("/login", "/register", "/captchaImage").permitAll() + // 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**") + .permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**") + .permitAll() + .antMatchers("/patientmanage/information/**") + .permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated(); + }) + // 添加Logout filter + .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)) + // 添加JWT filter + .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) + // 添加CORS filter + .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class) + .addFilterBefore(corsFilter, LogoutFilter.class).build(); } /** diff --git a/openhis-server-new/core-framework/src/main/java/com/core/framework/web/service/SysLoginService.java b/openhis-server-new/core-framework/src/main/java/com/core/framework/web/service/SysLoginService.java index e217d679..cc3127c9 100644 --- a/openhis-server-new/core-framework/src/main/java/com/core/framework/web/service/SysLoginService.java +++ b/openhis-server-new/core-framework/src/main/java/com/core/framework/web/service/SysLoginService.java @@ -6,6 +6,7 @@ import java.util.Optional; import javax.annotation.Resource; +import com.core.common.enums.DelFlag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -23,7 +24,6 @@ import com.core.common.core.domain.entity.SysUser; import com.core.common.core.domain.model.LoginUser; import com.core.common.core.domain.model.LoginUserExtend; import com.core.common.core.redis.RedisCache; -import com.core.common.enums.DeleteFlag; import com.core.common.enums.TenantStatus; import com.core.common.exception.ServiceException; import com.core.common.exception.user.*; @@ -281,7 +281,7 @@ public class SysLoginService { throw new ServiceException("所属医院停用"); } // 租户删除状态校验 - if (DeleteFlag.DELETED.getCode().equals(currentTenant.getDeleteFlag())) { + if (DelFlag.YES.getCode().equals(currentTenant.getDeleteFlag())) { throw new ServiceException("所属医院不存在"); } diff --git a/openhis-server-new/core-generator/src/main/java/com/core/generator/util/GenUtils.java b/openhis-server-new/core-generator/src/main/java/com/core/generator/util/GenUtils.java index 08179835..82319b3a 100644 --- a/openhis-server-new/core-generator/src/main/java/com/core/generator/util/GenUtils.java +++ b/openhis-server-new/core-generator/src/main/java/com/core/generator/util/GenUtils.java @@ -52,6 +52,9 @@ public class GenUtils { case "yb": genTable.setPackageName(GenConfig.getPackageName() + ".ybcatalog"); break; + case "lab": + genTable.setPackageName(GenConfig.getPackageName() + ".lab"); + break; default: genTable.setPackageName(GenConfig.getPackageName() + ".errortable"); } diff --git a/openhis-server-new/core-generator/src/main/resources/generator.yml b/openhis-server-new/core-generator/src/main/resources/generator.yml index a353d51e..5ca5c560 100644 --- a/openhis-server-new/core-generator/src/main/resources/generator.yml +++ b/openhis-server-new/core-generator/src/main/resources/generator.yml @@ -7,4 +7,4 @@ gen: # 自动去除表前缀,默认是false autoRemovePre: true # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: cod_,adm_,cli_,dia_,med_,wor_,fin_,def_,doc_,yb_ \ No newline at end of file + tablePrefix: cod_,adm_,cli_,dia_,med_,wor_,fin_,def_,doc_,yb_,lab_ \ No newline at end of file diff --git a/openhis-server-new/core-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/openhis-server-new/core-generator/src/main/resources/mapper/generator/GenTableMapper.xml index d20d2112..486765fb 100644 --- a/openhis-server-new/core-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/openhis-server-new/core-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -99,14 +99,15 @@ + SELECT ii.item_name , + ii.item_no , + ii.item_id , + ii.py_str , + ii.wb_str , + ii.unit_code , + ii.min_unit_code , + ii.part_percent, + ii.category_code, + ii.manufacturer_text, + ii.total_volume + FROM ( SELECT mmd.tenant_id , + mmd."name" AS item_name , + mmd.id AS item_id , + mmd.bus_no AS item_no, + mmd.py_str , + mmd.wb_str , + mmd.unit_code , + mmd.min_unit_code , + mmd.part_percent, + mmd.category_code, + mmd.manufacturer_text, + mm.total_volume + FROM med_medication_definition mmd + LEFT JOIN med_medication mm + ON mmd.id = mm.medication_def_id + AND mm.delete_flag = '0' + WHERE mmd.delete_flag = '0' + ) AS ii + ${ew.customSqlSegment} + ORDER BY ii.py_str + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/LossReportFormMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/LossReportFormMapper.xml index 10f0043e..29e2ccbd 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/LossReportFormMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/LossReportFormMapper.xml @@ -4,20 +4,20 @@ + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductDetailAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductDetailAppMapper.xml index 18aedec2..c76a1ae0 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductDetailAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductDetailAppMapper.xml @@ -28,6 +28,7 @@ ii.min_unit_code, ii.part_percent, ii.approval_number, + ii.item_id, ii.dose_form_code, ii.total_volume, ii.sale_price, @@ -61,6 +62,7 @@ mmd.min_unit_code, mmd.part_percent, mmd.approval_number, + mmd.id AS item_id, mm.dose_form_code, mm.total_volume, acid.price AS sale_price, @@ -121,6 +123,7 @@ add2.min_unit_code, add2.part_percent, add2.approval_number, + add2.id AS item_id, NULL AS dose_form_code, add2.size AS total_volume, acid.price AS sale_price, @@ -157,9 +160,10 @@ ORDER BY ii.py_str - + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductStocktakingMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductStocktakingMapper.xml index 9a00915e..90aa26d0 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductStocktakingMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductStocktakingMapper.xml @@ -5,19 +5,19 @@ SELECT T6.tenant_id, - T6.id AS item_Id, --Id - T6.bus_no AS item_bus_no, --编码 - T6.item_type, --药品类型 - T6.medication_type, -- 药品类型 - T6.item_name, --名称 - T6.total_volume, --规格 - T6.lot_number, --产品批号 - T6.yb_no, --医保编码 - T6.measurement_unit_code, -- 计量单位 - T6.unit_code, --药品单位(包装单位)(大单位) - T6.min_unit_code, --最小单位(小单位) - T6.part_percent, --拆零比 - T6.stocktaking_unit_code, --常规单位(小单位) - T6.quantity AS total_quantity, --当前库存数量(常规单位)(小单位) - T6.price, --采购单价(大单位) - T6.manufacturer_text, --生产厂商文本 - T6.location_id AS purpose_location_id, --仓库 - T6.location_store_id AS purpose_location_store_id, --库位 - T6.supplier_id, -- 供应商id - T6.supplier_name, -- 供应商名称 - T6.start_time, -- 生产日期 - T6.end_time, -- 有效期 - T6.form_enum AS purpose_type_enum --仓库类型 + T6.id AS item_Id, -- Id + T6.bus_no AS item_bus_no, -- 编码 + T6.item_type, -- 药品类型 + T6.medication_type, -- 药品类型 + T6.item_name, -- 名称 + T6.total_volume, -- 规格 + T6.lot_number, -- 产品批号 + T6.yb_no, -- 医保编码 + T6.measurement_unit_code, -- 计量单位 + T6.unit_code, -- 药品单位(包装单位)(大单位) + T6.min_unit_code, -- 最小单位(小单位) + T6.part_percent, -- 拆零比 + T6.stocktaking_unit_code, -- 常规单位(小单位) + T6.quantity AS total_quantity, -- 当前库存数量(常规单位)(小单位) + T6.price, -- 采购单价(大单位) + T6.manufacturer_text, -- 生产厂商文本 + T6.location_id AS purpose_location_id, -- 仓库 + T6.location_store_id AS purpose_location_store_id, -- 库位 + T6.supplier_id, -- 供应商id + T6.supplier_name, -- 供应商名称 + T6.start_time, -- 生产日期 + T6.end_time, -- 有效期 + T6.form_enum AS purpose_type_enum -- 仓库类型 FROM (SELECT T1.tenant_id, T2.id, T2.bus_no, @@ -214,8 +215,8 @@ T2.manufacturer_text, T1.location_id, T1.location_store_id, - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 T1.production_date AS start_time, T1.expiration_date AS end_time, T5.form_enum @@ -238,7 +239,7 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T1.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 WHERE T1.delete_flag = '0' AND T1.inventory_status_enum = #{inventoryStatusEnum} AND T1.location_id = #{sourceLocationId} @@ -263,8 +264,8 @@ T4.manufacturer_text, T1.location_id, T1.location_store_id, - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 T1.production_date AS start_time, T1.expiration_date AS end_time, T5.form_enum @@ -284,7 +285,7 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T1.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 WHERE T1.delete_flag = '0' AND T1.inventory_status_enum = #{inventoryStatusEnum} AND T1.location_id = #{sourceLocationId} @@ -295,20 +296,20 @@ + + + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductTransferMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductTransferMapper.xml index 20d24838..81ae9902 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductTransferMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ProductTransferMapper.xml @@ -55,11 +55,12 @@ + + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/PurchaseReturnMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/PurchaseReturnMapper.xml index a7609190..e023bc6e 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/PurchaseReturnMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/PurchaseReturnMapper.xml @@ -8,94 +8,95 @@ WHEN T1.type_enum = #{purchaseReturn} THEN T1.item_quantity ELSE 0 - END AS item_quantity, --退库数量 + END AS item_quantity, -- 退库数量 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT COALESCE(SUM(T9.item_quantity), 0) - FROM wor_supply_request AS T9 - WHERE T9.original_bus_no = T1.original_bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - AND T9.status_enum = #{agree} - ) - ELSE ( - SELECT COALESCE(SUM(T9.item_quantity), 0) - FROM wor_supply_request AS T9 - WHERE T9.original_bus_no = T1.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - AND T9.status_enum = #{agree} - ) - END AS returned_quantity, --已退数量 + THEN (SELECT COALESCE(SUM(T9.item_quantity), 0) + FROM wor_supply_request AS T9 + WHERE T9.original_bus_no = T1.original_bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0' + AND T9.status_enum = #{agree}) + ELSE (SELECT COALESCE(SUM(T9.item_quantity), 0) + FROM wor_supply_request AS T9 + WHERE T9.original_bus_no = T1.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0' + AND T9.status_enum = #{agree}) + END AS returned_quantity, -- 已退数量 CASE WHEN T1.type_enum = #{purchaseReturn} THEN T1.id ELSE NULL - END AS id, --采购退货id + END AS id, -- 采购退货id CASE WHEN T1.type_enum = #{purchaseReturn} THEN NULL ELSE T1.id - END AS purchase_id, --采购入库id - T2.quantity AS quantity, --库存数量 + END AS purchase_id, -- 采购入库id + T2.quantity AS quantity, -- 库存数量 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT T9.item_quantity - FROM wor_supply_request AS T9 - WHERE T1.original_bus_no = T9.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - ) + THEN (SELECT T9.item_quantity + FROM wor_supply_request AS T9 + WHERE T1.original_bus_no = T9.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0') ELSE T3.quantity - END AS purchase_quantity, --采购数量 - T11.amount AS price, --采购单价 + END AS purchase_quantity, -- 采购数量 + T11.amount AS price, -- 采购单价 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT T9.unit_code - FROM wor_supply_request AS T9 - WHERE T1.original_bus_no = T9.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - ) + THEN (SELECT T9.unit_code + FROM wor_supply_request AS T9 + WHERE T1.original_bus_no = T9.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0') ELSE T1.unit_code - END AS purchase_unit_code, --采购单位 - T1.unit_code AS measurement_unit_code, -- 物品计量单位 - T4.unit_code, -- 包装单位 - T4.min_unit_code, -- 最小单位 - T5."name" AS purpose_location_name, --仓库 - T6."name" AS purpose_location_store_name, --货位 - T4."name" AS item_name, --药品 - T1.lot_number, --批次号 - T1.reason, --退货原因 - T1.remake, --备注 - T1.item_id, --物品编码 - T1.purpose_location_id, --目的仓库ID - T1.purpose_location_store_id, --目的货位ID - T1.purpose_type_enum, -- 目的仓库类型 - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 - T8.total_volume, -- 规格 - T4.manufacturer_text AS manufacturer, -- 生产厂商 + END AS purchase_unit_code, -- 采购单位 + T1.unit_code AS measurement_unit_code, -- 物品计量单位 + T4.unit_code, -- 包装单位 + T4.min_unit_code, -- 最小单位 + T5."name" AS purpose_location_name, -- 仓库 + T6."name" AS purpose_location_store_name, -- 货位 + T4."name" AS item_name, -- 药品 + T1.lot_number, -- 批次号 + T1.reason, -- 退货原因 + T1.remake, -- 备注 + T1.item_id, -- 物品编码 + T1.purpose_location_id, -- 目的仓库ID + T1.purpose_location_store_id, -- 目的货位ID + T1.purpose_type_enum, -- 目的仓库类型 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 + T8.total_volume, -- 规格 + T4.manufacturer_text , -- 生产厂商 #{medicine} AS item_type, - T1.start_time, -- 开始时间 - T1.end_time, -- 结束时间 - T1.invoice_no, -- 发票号 - T1.trace_no, -- 追溯码 - T2.packaging_levels, -- 追溯码包装层级 + T1.start_time, -- 开始时间 + T1.end_time, -- 结束时间 + T1.invoice_no, -- 发票号 + T1.trace_no, -- 追溯码 + T2.packaging_levels, -- 追溯码包装层级 CASE WHEN T1.type_enum = #{purchaseReturn} THEN T1.practitioner_id ELSE NULL - END AS practitioner_id, --经手人 + END AS practitioner_id, -- 经手人 T1.occurrence_time, - T4.part_percent --拆零比 + T4.part_percent, -- 拆零比 + CASE + WHEN T1.type_enum = #{purchaseReturn} + THEN (SELECT name + FROM adm_practitioner ap + WHERE ap.delete_flag = '0' + AND ap.tenant_id = 1 + AND ap.id = T1.practitioner_id) + ELSE NULL + END AS practitioner_name -- 经手人姓名 FROM wor_supply_request T1 LEFT JOIN wor_inventory_item T2 ON T1.item_id = T2.item_id @@ -127,7 +128,8 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T2.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 + WHERE T1.bus_no = #{busNo} AND T1.item_table = #{medicationTableName} AND T1.delete_flag = '0' @@ -138,94 +140,95 @@ WHEN T1.type_enum = #{purchaseReturn} THEN T1.item_quantity ELSE NULL - END AS item_quantity, --退库数量 + END AS item_quantity, -- 退库数量 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT COALESCE(SUM(T9.item_quantity), 0) - FROM wor_supply_request AS T9 - WHERE T9.original_bus_no = T1.original_bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - AND T9.status_enum = #{agree} - ) - ELSE ( - SELECT COALESCE(SUM(T9.item_quantity), 0) - FROM wor_supply_request AS T9 - WHERE T9.original_bus_no = T1.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - AND T9.status_enum = #{agree} - ) - END AS returned_quantity, --已退数量 + THEN (SELECT COALESCE(SUM(T9.item_quantity), 0) + FROM wor_supply_request AS T9 + WHERE T9.original_bus_no = T1.original_bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0' + AND T9.status_enum = #{agree}) + ELSE (SELECT COALESCE(SUM(T9.item_quantity), 0) + FROM wor_supply_request AS T9 + WHERE T9.original_bus_no = T1.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0' + AND T9.status_enum = #{agree}) + END AS returned_quantity, -- 已退数量 CASE WHEN T1.type_enum = #{purchaseReturn} THEN T1.id ELSE NULL - END AS id, --采购退货id + END AS id, -- 采购退货id CASE WHEN T1.type_enum = #{purchaseReturn} THEN NULL ELSE T1.id - END AS purchase_id, --采购入库id - T2.quantity AS quantity, --库存数量 + END AS purchase_id, -- 采购入库id + T2.quantity AS quantity, -- 库存数量 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT T9.item_quantity - FROM wor_supply_request AS T9 - WHERE T1.original_bus_no = T9.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - ) + THEN (SELECT T9.item_quantity + FROM wor_supply_request AS T9 + WHERE T1.original_bus_no = T9.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0') ELSE T3.quantity - END AS purchase_quantity, --采购数量 - T11.amount AS price, --采购单价 + END AS purchase_quantity, -- 采购数量 + T11.amount AS price, -- 采购单价 CASE WHEN T1.type_enum = #{purchaseReturn} - THEN ( - SELECT T9.unit_code - FROM wor_supply_request AS T9 - WHERE T1.original_bus_no = T9.bus_no - AND T9.item_id = T1.item_id - AND T9.lot_number = T1.lot_number - AND T9.delete_flag = '0' - ) + THEN (SELECT T9.unit_code + FROM wor_supply_request AS T9 + WHERE T1.original_bus_no = T9.bus_no + AND T9.item_id = T1.item_id + AND T9.lot_number = T1.lot_number + AND T9.delete_flag = '0') ELSE T1.unit_code - END AS purchase_unit_code, --采购单位 - T1.unit_code AS measurement_unit_code, -- 物品计量单位 - T4.unit_code, -- 包装单位 - T4.min_unit_code, -- 最小单位 - T5."name" AS purpose_location_name, --仓库 - T6."name" AS purpose_location_store_name, --货位 - T4."name" AS item_name, --药品 - T1.lot_number, --批次号 - T1.reason, --退货原因 - T1.remake, --备注 - T1.item_id, --物品编码 - T1.purpose_location_id, --目的仓库ID - T1.purpose_location_store_id, --目的货位ID - T1.purpose_type_enum, -- 目的仓库类型 - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 - T4."size" AS total_volume, -- 规格 - T4.manufacturer_text AS manufacturer, -- 生产厂商 + END AS purchase_unit_code, -- 采购单位 + T1.unit_code AS measurement_unit_code, -- 物品计量单位 + T4.unit_code, -- 包装单位 + T4.min_unit_code, -- 最小单位 + T5."name" AS purpose_location_name, -- 仓库 + T6."name" AS purpose_location_store_name, -- 货位 + T4."name" AS item_name, -- 药品 + T1.lot_number, -- 批次号 + T1.reason, -- 退货原因 + T1.remake, -- 备注 + T1.item_id, -- 物品编码 + T1.purpose_location_id, -- 目的仓库ID + T1.purpose_location_store_id, -- 目的货位ID + T1.purpose_type_enum, -- 目的仓库类型 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 + T4."size" AS total_volume, -- 规格 + T4.manufacturer_text , -- 生产厂商 #{device} AS item_type, - T1.start_time, -- 开始时间 - T1.end_time, -- 结束时间 - T1.invoice_no, -- 发票号 - T1.trace_no, -- 追溯码 - T2.packaging_levels, -- 追溯码包装层级 + T1.start_time, -- 开始时间 + T1.end_time, -- 结束时间 + T1.invoice_no, -- 发票号 + T1.trace_no, -- 追溯码 + T2.packaging_levels, -- 追溯码包装层级 CASE WHEN T1.type_enum = #{purchaseReturn} THEN T1.practitioner_id ELSE NULL - END AS practitioner_id, --经手人 + END AS practitioner_id, -- 经手人 T1.occurrence_time, - T4.part_percent --拆零比 + T4.part_percent, -- 拆零比 + CASE + WHEN T1.type_enum = #{purchaseReturn} + THEN (SELECT name + FROM adm_practitioner ap + WHERE ap.delete_flag = '0' + AND ap.tenant_id = 1 + AND ap.id = T1.practitioner_id) + ELSE NULL + END AS practitioner_name -- 经手人姓名 FROM wor_supply_request T1 LEFT JOIN wor_inventory_item T2 ON T2.item_id = T1.item_id @@ -254,11 +257,12 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T2.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 WHERE T1.bus_no = #{busNo} AND T1.item_table = #{deviceTableName} AND T1.delete_flag = '0' + SELECT T1.bus_no, T1.original_bus_no, - T1.item_quantity AS item_quantity, --退库数量 + T1.item_quantity AS item_quantity, -- 退库数量 ( SELECT COALESCE(SUM(T9.item_quantity), 0) FROM wor_supply_request AS T9 WHERE T9.original_bus_no = T1.original_bus_no @@ -296,10 +300,10 @@ AND T9.delete_flag = '0' AND T9.status_enum = #{statusEnum} ) - AS returned_quantity, --已退数量 - T1.id , --采购退货id - NULL AS purchase_id, --采购入库id - T2.quantity AS quantity, --库存数量 + AS returned_quantity, -- 已退数量 + T1.id , -- 采购退货id + NULL AS purchase_id, -- 采购入库id + T2.quantity AS quantity, -- 库存数量 ( SELECT T9.item_quantity FROM wor_supply_request AS T9 WHERE T1.original_bus_no = T9.bus_no @@ -307,41 +311,41 @@ AND T9.lot_number = T1.lot_number AND T9.delete_flag = '0' ) - AS purchase_quantity, --采购数量 - T11.amount AS price, --采购单价 + AS purchase_quantity, -- 采购数量 + T11.amount AS price, -- 采购单价 ( SELECT T9.unit_code FROM wor_supply_request AS T9 WHERE T1.original_bus_no = T9.bus_no AND T9.item_id = T1.item_id AND T9.lot_number = T1.lot_number AND T9.delete_flag = '0' - ) AS purchase_unit_code, --采购单位 - T1.unit_code AS measurement_unit_code, -- 物品计量单位 - T4.unit_code, -- 包装单位 - T4.min_unit_code, -- 最小单位 - T5."name" AS purpose_location_name, --仓库 - T6."name" AS purpose_location_store_name, --货位 - T4."name" AS item_name, --药品 - T1.lot_number, --批次号 - T1.reason, --退货原因 - T1.remake, --备注 - T1.item_id, --物品编码 - T1.purpose_location_id, --目的仓库ID - T1.purpose_location_store_id, --目的货位ID - T1.purpose_type_enum, -- 目的仓库类型 - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 - T8.total_volume, -- 规格 - T4.manufacturer_text AS manufacturer, -- 生产厂商 + ) AS purchase_unit_code, -- 采购单位 + T1.unit_code AS measurement_unit_code, -- 物品计量单位 + T4.unit_code, -- 包装单位 + T4.min_unit_code, -- 最小单位 + T5."name" AS purpose_location_name, -- 仓库 + T6."name" AS purpose_location_store_name, -- 货位 + T4."name" AS item_name, -- 药品 + T1.lot_number, -- 批次号 + T1.reason, -- 退货原因 + T1.remake, -- 备注 + T1.item_id, -- 物品编码 + T1.purpose_location_id, -- 目的仓库ID + T1.purpose_location_store_id, -- 目的货位ID + T1.purpose_type_enum, -- 目的仓库类型 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 + T8.total_volume, -- 规格 + T4.manufacturer_text , -- 生产厂商 #{medicine} AS item_type, - T1.start_time, -- 开始时间 - T1.end_time, -- 结束时间 - T1.invoice_no, -- 发票号 - T1.trace_no, -- 追溯码 - T2.packaging_levels, -- 追溯码包装层级 - T1.practitioner_id , --经手人 - T1.occurrence_time,--制单日期 - T4.part_percent --拆零比 + T1.start_time, -- 开始时间 + T1.end_time, -- 结束时间 + T1.invoice_no, -- 发票号 + T1.trace_no, -- 追溯码 + T2.packaging_levels, -- 追溯码包装层级 + T1.practitioner_id , -- 经手人 + T1.occurrence_time,-- 制单日期 + T4.part_percent -- 拆零比 FROM wor_supply_request T1 LEFT JOIN wor_inventory_item T2 ON T1.item_id = T2.item_id @@ -373,7 +377,7 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T2.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 WHERE T1.purpose_location_id = #{locationId} AND T1.status_enum = #{statusEnum} AND T1.type_enum IN @@ -386,7 +390,7 @@ UNION SELECT T1.bus_no, T1.original_bus_no, - T1.item_quantity AS item_quantity, --退库数量 + T1.item_quantity AS item_quantity, -- 退库数量 ( SELECT COALESCE(SUM(T9.item_quantity), 0) FROM wor_supply_request AS T9 WHERE T9.original_bus_no = T1.original_bus_no @@ -394,51 +398,51 @@ AND T9.lot_number = T1.lot_number AND T9.delete_flag = '0' AND T9.status_enum = #{statusEnum} - ) AS returned_quantity, --已退数量 - T1.id , --采购退货id - NULL AS purchase_id, --采购入库id - T2.quantity AS quantity, --库存数量 + ) AS returned_quantity, -- 已退数量 + T1.id , -- 采购退货id + NULL AS purchase_id, -- 采购入库id + T2.quantity AS quantity, -- 库存数量 ( SELECT T9.item_quantity FROM wor_supply_request AS T9 WHERE T1.original_bus_no = T9.bus_no AND T9.item_id = T1.item_id AND T9.lot_number = T1.lot_number AND T9.delete_flag = '0' - ) AS purchase_quantity, --采购数量 - T11.amount AS price, --采购单价 + ) AS purchase_quantity, -- 采购数量 + T11.amount AS price, -- 采购单价 ( SELECT T9.unit_code FROM wor_supply_request AS T9 WHERE T1.original_bus_no = T9.bus_no AND T9.item_id = T1.item_id AND T9.lot_number = T1.lot_number AND T9.delete_flag = '0' - ) AS purchase_unit_code, --采购单位 - T1.unit_code AS measurement_unit_code, -- 物品计量单位 - T4.unit_code, -- 包装单位 - T4.min_unit_code, -- 最小单位 - T5."name" AS purpose_location_name, --仓库 - T6."name" AS purpose_location_store_name, --货位 - T4."name" AS item_name, --药品 - T1.lot_number, --批次号 - T1.reason, --退货原因 - T1.remake, --备注 - T1.item_id, --物品编码 - T1.purpose_location_id, --目的仓库ID - T1.purpose_location_store_id, --目的货位ID - T1.purpose_type_enum, -- 目的仓库类型 - T1.supplier_id, -- 供应商id - T7."name" AS supplier_name, -- 供应商名称 - T4."size" AS total_volume, -- 规格 - T4.manufacturer_text AS manufacturer, -- 生产厂商 + ) AS purchase_unit_code, -- 采购单位 + T1.unit_code AS measurement_unit_code, -- 物品计量单位 + T4.unit_code, -- 包装单位 + T4.min_unit_code, -- 最小单位 + T5."name" AS purpose_location_name, -- 仓库 + T6."name" AS purpose_location_store_name, -- 货位 + T4."name" AS item_name, -- 药品 + T1.lot_number, -- 批次号 + T1.reason, -- 退货原因 + T1.remake, -- 备注 + T1.item_id, -- 物品编码 + T1.purpose_location_id, -- 目的仓库ID + T1.purpose_location_store_id, -- 目的货位ID + T1.purpose_type_enum, -- 目的仓库类型 + T1.supplier_id, -- 供应商id + T7."name" AS supplier_name, -- 供应商名称 + T4."size" AS total_volume, -- 规格 + T4.manufacturer_text , -- 生产厂商 #{device} AS item_type, - T1.start_time, -- 开始时间 - T1.end_time, -- 结束时间 - T1.invoice_no, -- 发票号 - T1.trace_no, -- 追溯码 - T2.packaging_levels, -- 追溯码包装层级 - T1.practitioner_id, --经手人 - T1.occurrence_time,--制单日期 - T4.part_percent --拆零比 + T1.start_time, -- 开始时间 + T1.end_time, -- 结束时间 + T1.invoice_no, -- 发票号 + T1.trace_no, -- 追溯码 + T2.packaging_levels, -- 追溯码包装层级 + T1.practitioner_id, -- 经手人 + T1.occurrence_time,-- 制单日期 + T4.part_percent -- 拆零比 FROM wor_supply_request T1 LEFT JOIN wor_inventory_item T2 ON T2.item_id = T1.item_id @@ -467,7 +471,7 @@ ON T11.definition_id = T10.id AND T11.delete_flag = '0' AND T11.condition_value = T2.lot_number - AND T11.condition_code = '1'--1:批号进价 + AND T11.condition_code = '1'-- 1:批号进价 WHERE T1.purpose_location_id = #{locationId} AND T1.status_enum = #{statusEnum} AND T1.type_enum IN diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ReceiptApprovalMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ReceiptApprovalMapper.xml index a57b5d95..1d92010d 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ReceiptApprovalMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/Inventorymanage/ReceiptApprovalMapper.xml @@ -3,12 +3,12 @@ SELECT T1.id AS definition_id, - T1.instance_id, - T1.charge_name, - T1.price AS sell_price, - T2.condition_code, - T2.condition_value, - T2.amount AS unit_price, - T3.unit_code, - T3.min_unit_code + T1.instance_id, + T1.charge_name, + T1.price AS sell_price, + T2.condition_code, + T2.condition_value, + T2.amount AS unit_price, + T3.unit_code, + T3.min_unit_code FROM adm_charge_item_definition AS T1 - LEFT JOIN adm_charge_item_def_detail AS T2 - ON T1.id = T2.definition_id - AND T2.delete_flag = '0' - LEFT JOIN med_medication_definition AS T3 - ON T1.instance_id = T3.id - AND T3.delete_flag = '0' - LEFT JOIN adm_device_definition AS T4 - ON T1.instance_id = T4.id - AND T4.delete_flag = '0' - WHERE T1.instance_id IN - - #{itemId} - + LEFT JOIN adm_charge_item_def_detail AS T2 + ON T1.id = T2.definition_id + AND T2.delete_flag = '0' + LEFT JOIN med_medication_definition AS T3 + ON T1.instance_id = T3.id + AND T3.delete_flag = '0' + LEFT JOIN adm_device_definition AS T4 + ON T1.instance_id = T4.id + AND T4.delete_flag = '0' + WHERE T1.instance_id IN + + #{itemId} + + + UPDATE sys_user set del_flag = '1' WHERE user_id = #{userId} + + delete from sys_user_role diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/InpatientChargeAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/InpatientChargeAppMapper.xml index 905c9621..e58f918e 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/InpatientChargeAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/InpatientChargeAppMapper.xml @@ -7,6 +7,7 @@ SELECT T4.encounter_id, T4.encounter_bus_no, T4.patient_id, + T4.encounter_status, T4.reception_time, T4.patient_name, T4.patient_bus_no, @@ -15,8 +16,7 @@ T4.id_card, T4.start_time, T4.patient_py_str, - T4.patient_wb_str, - T4.status_enum + T4.patient_wb_str FROM ( SELECT T1.id AS encounter_id, T1.bus_no AS encounter_bus_no, @@ -24,37 +24,36 @@ T1.reception_time, T1.delete_flag, T1.tenant_id, + T1.start_time, + T1.status_enum AS encounter_status, T2."name" AS patient_name, T2.bus_no AS patient_bus_no, T2.gender_enum, T2.birth_date, - T1.start_time, T2.id_card, T2.py_str AS patient_py_str, - T2.wb_str AS patient_wb_str, - T3.status_enum + T2.wb_str AS patient_wb_str FROM adm_encounter AS T1 LEFT JOIN adm_patient AS T2 ON T1.patient_id = T2.id - INNER JOIN adm_charge_item AS T3 - ON T3.encounter_id = T1.id - AND T3.delete_flag = '0' WHERE T1.delete_flag = '0' AND T1.class_enum = #{classEnum} + AND T1.status_enum IN (#{dischargedFromHospital},#{alreadySettled}) GROUP BY T1.id, T1.bus_no, T1.patient_id, T1.reception_time, T1.delete_flag, T1.tenant_id, + T1.start_time, + T1.status_enum, T2."name", T2.bus_no, T2.gender_enum, T2.birth_date, T2.id_card, T2.py_str, - T2.wb_str, - T3.status_enum + T2.wb_str ORDER BY T1.bus_no DESC ) AS T4 ${ew.customSqlSegment} @@ -132,8 +131,6 @@ , #{refunded} , #{partRefund}) AND T1.context_enum != #{register} - AND T1.entered_date >= #{startTime} - AND T1.entered_date <= #{endTime} AND T1.delete_flag = '0' \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientChargeAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientChargeAppMapper.xml index 7612803d..a14229d4 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientChargeAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientChargeAppMapper.xml @@ -77,7 +77,6 @@ T1.unit_price, T1.total_price, mmr.prescription_no, - mmr.prescription_no, mmr.method_code, mmr.rate_code, mmr.dose, @@ -147,4 +146,97 @@ AND T1.delete_flag = '0' + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRefundAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRefundAppMapper.xml index 5d028643..ea63ef28 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRefundAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRefundAppMapper.xml @@ -75,10 +75,6 @@ T2.unit_code, T1.unit_price, T1.total_price, - T3.status_enum AS dispense_status, - T3.not_performed_reason_enum AS not_performed_reason, - 0 AS service_status, - T3.id AS dispense_id, T2.id AS request_id, T7.name AS item_name, T10.id AS payment_id, @@ -87,9 +83,6 @@ LEFT JOIN med_medication_request AS T2 ON T2.id = T1.service_id AND T2.delete_flag = '0' - LEFT JOIN med_medication_dispense AS T3 - ON T3.med_req_id = T2.id - AND T3.delete_flag = '0' LEFT JOIN med_medication_definition AS T7 ON T1.product_id = T7.id AND T7.delete_flag = '0' @@ -117,10 +110,6 @@ T4.unit_code, T1.unit_price, T1.total_price, - T5.status_enum AS dispense_status, - T5.not_performed_reason_enum AS not_performed_reason, - 0 AS service_status, - T5.id AS dispense_id, T4.id AS request_id, T8.name AS item_name, T10.id AS payment_id, @@ -129,9 +118,6 @@ LEFT JOIN wor_device_request AS T4 ON T4.id = T1.service_id AND T4.delete_flag = '0' - LEFT JOIN wor_device_dispense AS T5 - ON T5.device_req_id = T4.id - AND T5.delete_flag = '0' LEFT JOIN adm_device_definition AS T8 ON T1.product_id = T8.id AND T8.delete_flag = '0' @@ -159,10 +145,6 @@ T6.unit_code, T1.unit_price, T1.total_price, - 0 AS dispense_status, - null AS not_performed_reason, - T6.status_enum AS service_status, - null AS dispense_id, T6.id AS request_id, T9.name AS item_name, T10.id AS payment_id, @@ -282,10 +264,7 @@ aci.service_table, mmr.prescription_no, mmr.id AS request_id, - dis.status_enum AS dispense_status, 0 AS service_status, - dis.dispense_quantity, - dis.id AS dispense_id, mmd."name" AS item_name, fpr.id AS payment_id, fpr.enterer_id, @@ -310,9 +289,6 @@ ON aci.service_id = mmr.refund_medicine_id AND mmr.refund_medicine_id IS NOT NULL AND mmr.delete_flag = '0' - LEFT JOIN med_medication_dispense dis - ON mmr.id = dis.med_req_id - AND dis.delete_flag = '0' INNER JOIN med_medication_definition mmd ON aci.product_id = mmd.id AND mmd.delete_flag = '0' @@ -350,10 +326,7 @@ aci.service_table, wdr.prescription_no, wdr.id AS request_id, - wdd.status_enum AS dispense_status, 0 AS service_status, - wdd.dispense_quantity, - wdd.id AS dispense_id, dev."name" AS item_name, fpr.id AS payment_id, fpr.enterer_id, @@ -378,9 +351,6 @@ ON aci.service_id = wdr.refund_device_id AND wdr.refund_device_id IS NOT NULL AND wdr.delete_flag = '0' - LEFT JOIN wor_device_dispense wdd - ON wdr.id = wdd.device_req_id - AND wdd.delete_flag = '0' INNER JOIN adm_device_definition dev ON aci.product_id = dev.id AND dev.delete_flag = '0' @@ -418,10 +388,7 @@ aci.service_table, wsr.prescription_no, wsr.id AS request_id, - 0 AS dispense_status, wsr.status_enum AS service_status, - 0 AS dispense_quantity, - null AS dispense_id, wad."name" AS item_name, fpr.id AS payment_id, fpr.enterer_id, diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml index 3bcb03a0..b9e5c2b0 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml @@ -10,14 +10,16 @@ T3.NAME, T3.gender_enum, T3.py_str, - T3.wb_str + T3.wb_str, + T3.dr_profttl_code FROM ( SELECT T1.tenant_id, T1.ID, T1.NAME, T1.gender_enum, T1.py_str, - T1.wb_str + T1.wb_str, + T1.dr_profttl_code FROM adm_practitioner AS T1 WHERE T1.delete_flag = '0' AND EXISTS(SELECT 1 diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/common/CommonAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/common/CommonAppMapper.xml index 0169f66a..9673933a 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/common/CommonAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/common/CommonAppMapper.xml @@ -31,6 +31,7 @@ + @@ -265,7 +266,7 @@ - AND T1.location_id IN (#{orgLocationId}, #{objLocationId}) + AND T1.location_id IN (#{orgLocationId}) AND T1.location_id = #{orgLocationId} @@ -332,179 +333,180 @@ - + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationAdviceAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationAdviceAppMapper.xml index fbde8058..2effbdb8 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationAdviceAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationAdviceAppMapper.xml @@ -41,7 +41,8 @@ abi.position_id, abi.restricted_flag, abi.restricted_scope, - abi.dosage_instruction + abi.dosage_instruction, + abi.chrgitm_lv from ( (SELECT @@ -82,7 +83,8 @@ T6.def_location_id AS position_id, t1.restricted_flag AS restricted_flag, t1.restricted_scope AS restricted_scope, - T1.dosage_instruction AS dosage_instruction + T1.dosage_instruction AS dosage_instruction, + T1.chrgitm_lv as chrgitm_lv FROM med_medication_definition AS t1 INNER JOIN med_medication AS T2 ON T2.medication_def_id = T1.ID AND T2.delete_flag = '0' AND T2.status_enum = #{statusEnum} @@ -93,7 +95,7 @@ AND T5.delete_flag = '0' AND T5.status_enum = #{statusEnum} LEFT JOIN adm_organization_location AS T6 ON T6.distribution_category_code = T1.category_code - AND T6.delete_flag = '0' AND T6.organization_id = #{organizationId} AND + AND T6.delete_flag = '0' AND T6.item_code = '1' AND T6.organization_id = #{organizationId} AND (CURRENT_TIME :: time (6) BETWEEN T6.start_time AND T6.end_time) WHERE T1.delete_flag = '0' AND T2.status_enum = #{statusEnum} @@ -154,7 +156,8 @@ T5.def_location_id AS position_id, 0 AS restricted_flag, '' AS restricted_scope, - '' AS dosage_instruction + '' AS dosage_instruction, + T1.chrgitm_lv as chrgitm_lv FROM adm_device_definition AS T1 LEFT JOIN adm_supplier AS T2 ON T2.ID = T1.supply_id @@ -162,7 +165,7 @@ LEFT JOIN adm_charge_item_definition AS T4 ON T4.instance_id = T1.ID AND T4.delete_flag = '0' AND T4.status_enum = #{statusEnum} LEFT JOIN adm_organization_location AS T5 ON T5.distribution_category_code = T1.category_code - AND T5.delete_flag = '0' AND T5.organization_id = #{organizationId} AND + AND T5.delete_flag = '0' AND T5.item_code = '2' AND T5.organization_id = #{organizationId} AND (CURRENT_TIME :: time (6) BETWEEN T5.start_time AND T5.end_time) WHERE T1.delete_flag = '0' @@ -220,7 +223,8 @@ T3.organization_id AS position_id, 0 AS restricted_flag, '' AS restricted_scope, - '' AS dosage_instruction + '' AS dosage_instruction, + T1.chrgitm_lv as chrgitm_lv FROM wor_activity_definition AS T1 LEFT JOIN adm_charge_item_definition AS T2 ON T2.instance_id = T1.ID @@ -414,7 +418,8 @@ T1.dispense_per_duration AS dispense_per_duration, T2.part_percent AS part_percent, ccd.name AS condition_definition_name, - T1.sort_number AS sort_number + T1.sort_number AS sort_number, + T1.based_on_id AS based_on_id FROM med_medication_request AS T1 LEFT JOIN med_medication_definition AS T2 ON T2.ID = T1.medication_id AND T2.delete_flag = '0' @@ -433,7 +438,7 @@ AND T1.patient_id = #{patientId} AND T1.encounter_id != #{encounterId} AND T1.refund_medicine_id IS NULL - ORDER BY T1.status_enum,T1.sort_number,T1.group_id) + ORDER BY T1.status_enum,T1.sort_number) UNION ALL (SELECT 2 AS advice_type, T1.id AS request_id, @@ -464,7 +469,8 @@ null AS dispense_per_duration, T2.part_percent AS part_percent, '' AS condition_definition_name, - 99 AS sort_number + 99 AS sort_number, + T1.based_on_id AS based_on_id FROM wor_device_request AS T1 LEFT JOIN adm_device_definition AS T2 ON T2.ID = T1.device_def_id AND T2.delete_flag = '0' @@ -511,7 +517,8 @@ null AS dispense_per_duration, 1 AS part_percent, '' AS condition_definition_name, - 99 AS sort_number + 99 AS sort_number, + T1.based_on_id AS based_on_id FROM wor_service_request AS T1 LEFT JOIN wor_activity_definition AS T2 ON T2.ID = T1.activity_id @@ -520,7 +527,6 @@ T3.service_table = #{WOR_SERVICE_REQUEST} LEFT JOIN adm_organization AS ao ON ao.ID = T1.org_id AND ao.delete_flag = '0' WHERE T1.delete_flag = '0' AND T1.generate_source_enum = #{generateSourceEnum} - AND T1.based_on_table is null AND T1.parent_id IS NULL AND T1.refund_service_id IS NULL @@ -596,4 +602,28 @@ AND tad.item_no = #{itemNo} + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationMainAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationMainAppMapper.xml index 37d06e11..4a206cbc 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationMainAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationMainAppMapper.xml @@ -14,7 +14,6 @@ T10.phone, T10.birth_date, T10.status_enum, - T10.allergy_history_flag, T10.account_id, T10.type_code, T10.contract_name, @@ -48,11 +47,7 @@ T1.create_time AS register_time, T1.reception_time AS reception_time, T1.organization_id AS org_id, - T8.bus_no AS bus_no, - CASE - WHEN T9.patient_id IS NOT NULL THEN 1 - ELSE 0 - END AS allergy_history_flag + T8.bus_no AS bus_no FROM adm_encounter AS T1 LEFT JOIN adm_organization AS T2 ON T1.organization_id = T2.ID AND T2.delete_flag = '0' LEFT JOIN adm_healthcare_service AS T3 ON T1.service_type_id = T3.ID AND T3.delete_flag = '0' @@ -71,8 +66,6 @@ LEFT JOIN adm_account AS T6 ON T1.ID = T6.encounter_id AND T6.delete_flag = '0' and T6.encounter_flag = '1' LEFT JOIN fin_contract AS T7 ON T6.contract_no = T7.bus_no AND T7.delete_flag = '0' LEFT JOIN adm_patient AS T8 ON T1.patient_id = T8.ID AND T8.delete_flag = '0' - LEFT JOIN cli_allergy_intolerance AS T9 - ON T1.patient_id = T9.patient_id AND T9.clinical_status_enum != #{ClinicalStatus} AND T9.delete_flag = '0' WHERE T1.delete_flag = '0' diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/document/DocDefinitionAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/document/DocDefinitionAppMapper.xml index 8efadbbb..ca9c5943 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/document/DocDefinitionAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/document/DocDefinitionAppMapper.xml @@ -41,7 +41,7 @@ GROUP BY dd.id, dd.primary_menu_enum , dd.sub_menu - + ORDER BY dd.display_order diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalcharge/AdvancePaymentManageAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalcharge/AdvancePaymentManageAppMapper.xml index 7a6d302f..982175fd 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalcharge/AdvancePaymentManageAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalcharge/AdvancePaymentManageAppMapper.xml @@ -6,85 +6,90 @@ @@ -145,4 +169,20 @@ , '%') + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml index 0de7769d..3d3a537e 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml @@ -23,10 +23,12 @@ ii.bed_id, ii.bed_name, ii.organization_name, - ii.contract_name + ii.contract_name, + COALESCE(ii.time1, ii.time2, ii.time3) AS admission_time FROM ( WITH locations AS ( SELECT ael.encounter_id, + ael.start_time as admission_time, al.form_enum, al.id AS location_id, al."name" AS location_name @@ -58,7 +60,10 @@ alb.location_id AS bed_id, alb.location_name AS bed_name, ao."name" AS organization_name, - fc.contract_name + fc.contract_name, + alw.admission_time as time1, + alh.admission_time as time2, + alb.admission_time as time3 FROM adm_encounter ae LEFT JOIN adm_patient ap ON ae.patient_id = ap.id @@ -85,7 +90,8 @@ WHERE ae.delete_flag = '0' AND ae.class_enum = #{imp} AND ae.status_enum != #{toBeRegistered} - GROUP BY ae.id, + GROUP BY ae.tenant_id, + ae.id, ae.bus_no, ae.status_enum, ae.start_time, @@ -105,7 +111,10 @@ alb.location_id, alb.location_name, ao."name", - fc.contract_name + fc.contract_name, + alw.admission_time, + alh.admission_time, + alb.admission_time ORDER BY ae.bus_no DESC ) AS ii ${ew.customSqlSegment} @@ -190,6 +199,7 @@ AND bed.delete_flag = '0' AND bed.status_enum != #{inactive} GROUP BY bed.id, + bed.bus_no, bed.tenant_id, bed."name", bed.status_enum, @@ -214,112 +224,107 @@ + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml index 84b1e6f5..15aa547c 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml @@ -23,83 +23,90 @@ ii.house_name, ii.bed_id, ii.bed_name, - ii.organization_name - FROM ( - WITH locations AS ( - SELECT ael.encounter_id, - al.form_enum, - al.id AS location_id, - al."name" AS location_name - FROM adm_encounter_location ael - LEFT JOIN adm_location al - ON ael.location_id = al.id - AND al.delete_flag = '0' - WHERE ael.status_enum = #{active} - AND ael.delete_flag = '0' - ) - SELECT ae.tenant_id, - ae.id AS encounter_id, - ae.bus_no, - ae.status_enum AS encounter_status, - ae.start_time, - ae.end_time, - ae.admit_source_code, - ae.priority_enum, - ae.organization_id, - ap."name" AS patient_name, - ap.py_str AS patient_py_str, - ap.wb_str AS patient_wb_str, - ap.gender_enum, - ap.birth_date, - alw.location_id AS ward_id, - alw.location_name AS ward_name, - alh.location_id AS house_id, - alh.location_name AS house_name, - alb.location_id AS bed_id, - alb.location_name AS bed_name, - ao."name" AS organization_name - FROM adm_encounter ae - LEFT JOIN adm_patient ap - ON ae.patient_id = ap.id - AND ap.delete_flag = '0' - LEFT JOIN locations alw - ON alw.encounter_id = ae.id - AND alw.form_enum = #{ward} - LEFT JOIN locations alh - ON alh.encounter_id = ae.id - AND alh.form_enum = #{house} - LEFT JOIN locations alb - ON alb.encounter_id = ae.id - AND alb.form_enum = #{bed} - LEFT JOIN adm_organization ao - ON ao.id = ae.organization_id - AND ao.delete_flag = '0' - WHERE ae.delete_flag = '0' - AND ae.class_enum = #{imp} - AND ae.status_enum != #{toBeRegistered} - AND ae.status_enum != #{registered} - GROUP BY ae.id, + ii.organization_name, + ii.patient_id, + ii.account_id + FROM (WITH locations AS (SELECT ael.encounter_id, + al.form_enum, + al.id AS location_id, + al."name" AS location_name + FROM adm_encounter_location ael + LEFT JOIN adm_location al + ON ael.location_id = al.id + AND al.delete_flag = '0' + WHERE ael.status_enum = #{active} + AND ael.delete_flag = '0') + SELECT ae.tenant_id, + ae.id AS encounter_id, ae.bus_no, - ae.status_enum, + ae.status_enum AS encounter_status, ae.start_time, ae.end_time, ae.admit_source_code, ae.priority_enum, ae.organization_id, - ap."name", - ap.py_str, - ap.wb_str, + ap."name" AS patient_name, + ap.py_str AS patient_py_str, + ap.wb_str AS patient_wb_str, ap.gender_enum, ap.birth_date, - alw.location_id, - alw.location_name, - alh.location_id, - alh.location_name, - alb.location_id, - alb.location_name, - ao."name" - ORDER BY ae.bus_no DESC - ) AS ii + ap.id as patient_id, + alw.location_id AS ward_id, + alw.location_name AS ward_name, + alh.location_id AS house_id, + alh.location_name AS house_name, + alb.location_id AS bed_id, + alb.location_name AS bed_name, + ao."name" AS organization_name, + aa.id AS account_id + FROM adm_encounter ae + LEFT JOIN adm_patient ap + ON ae.patient_id = ap.id + AND ap.delete_flag = '0' + LEFT JOIN locations alw + ON alw.encounter_id = ae.id + AND alw.form_enum = #{ward} + LEFT JOIN locations alh + ON alh.encounter_id = ae.id + AND alh.form_enum = #{house} + LEFT JOIN locations alb + ON alb.encounter_id = ae.id + AND alb.form_enum = #{bed} + LEFT JOIN adm_organization ao + ON ao.id = ae.organization_id + AND ao.delete_flag = '0' + LEFT JOIN adm_account aa + ON ae.id = aa.encounter_id + AND aa.delete_flag = '0' + WHERE ae.delete_flag = '0' + AND ae.class_enum = #{imp} + AND ae.status_enum != #{toBeRegistered} + AND ae.status_enum != #{registered} + AND aa.type_code = #{personalCashAccount} + GROUP BY ae.id, + ae.bus_no, + ae.status_enum, + ae.start_time, + ae.end_time, + ae.admit_source_code, + ae.priority_enum, + ae.organization_id, + ap."name", + ap.py_str, + ap.wb_str, + ap.gender_enum, + ap.birth_date, + ap.id, + alw.location_id, + alw.location_name, + alh.location_id, + alh.location_name, + alb.location_id, + alb.location_name, + ao."name", + aa.id, + ae.tenant_id + ORDER BY ae.bus_no DESC) AS ii ${ew.customSqlSegment} + SELECT ID AS instance_id, + NAME AS instance_name, + permitted_unit_code + FROM wor_activity_definition + WHERE delete_flag = '0' + AND status_enum = #{status} + AND category_code = #{basicService} + + + + + + + + + + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/MedicineSummaryAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/MedicineSummaryAppMapper.xml index 1198aee0..7b12760f 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/MedicineSummaryAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/MedicineSummaryAppMapper.xml @@ -260,6 +260,8 @@ mmd.unit_code , mmd.min_unit_code , mmd.part_percent , + mmd.manufacturer_text, + mmd.category_code, mm.total_volume , wsr.lot_number, wsr.item_quantity diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/NurseBillingAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/NurseBillingAppMapper.xml index e8c452a8..f024a2dc 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/NurseBillingAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/NurseBillingAppMapper.xml @@ -2,5 +2,302 @@ + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/OrgDeviceStockTakeAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/OrgDeviceStockTakeAppMapper.xml index fd82cb3c..ad46fb0d 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/OrgDeviceStockTakeAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/OrgDeviceStockTakeAppMapper.xml @@ -62,7 +62,13 @@ AND T7.delete_flag = '0' LEFT JOIN adm_charge_item AS T8 ON T1.id = T8.service_id AND T8.delete_flag = '0' - WHERE T1.delete_flag = '0') AS ii + LEFT JOIN adm_encounter AS T9 ON T1.encounter_id = T9.id + AND T9.delete_flag = '0' + WHERE T1.delete_flag = '0' + AND T9.class_enum = #{imp} + AND T1.status_enum = #{requestStatus} + AND T2.status_enum = #{dispenseStatus} + AND T8.status_enum = #{chargeItemStatus}) AS ii ${ew.customSqlSegment} diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/PatientHomeAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/PatientHomeAppMapper.xml index fff5da8b..fc4d50b5 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/PatientHomeAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/PatientHomeAppMapper.xml @@ -54,7 +54,6 @@ T8.end_time AS surgeryEndTime, -- 手术结束时间 T9.id AS encounterLocationId, -- 就诊位置ID T9.location_id, -- 床位号 - T10.category_code, -- 过敏原 T11."name" AS caty, -- 入院科室 T12."name" AS mainDiagnosis -- 主要诊断 FROM adm_patient AS T1 @@ -119,9 +118,6 @@ ON T2.id = T9.encounter_id -- 就诊ID AND T9.form_enum = 8 AND T9.delete_flag = '0' - LEFT JOIN cli_allergy_intolerance T10 - ON T1.id = T10.patient_id -- 患者ID - AND T10.delete_flag = '0' LEFT JOIN adm_organization T11 ON T2.organization_id = T11.id AND T11.type_enum = 2 diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/GroupRecMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/GroupRecMapper.xml new file mode 100644 index 00000000..b1b11a15 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/GroupRecMapper.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/LisReportMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/LisReportMapper.xml new file mode 100644 index 00000000..bdba87a4 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/LisReportMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/SampleCollectMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/SampleCollectMapper.xml new file mode 100644 index 00000000..0590863c --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inspection/SampleCollectMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientInfusionAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientInfusionAppMapper.xml index 0061ad9f..dc94133d 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientInfusionAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientInfusionAppMapper.xml @@ -2,102 +2,6 @@ - - \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientSkinTestAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientSkinTestAppMapper.xml new file mode 100644 index 00000000..4e96e44e --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientSkinTestAppMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientTreatmentAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientTreatmentAppMapper.xml index d930e55c..2ad7bfdb 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientTreatmentAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/outpatientmanage/OutpatientTreatmentAppMapper.xml @@ -23,14 +23,19 @@ T2.birth_date FROM adm_encounter AS T1 INNER JOIN adm_patient AS T2 - ON T1.patient_id = T2.id - AND T2.delete_flag = '0' - INNER JOIN wor_service_request AS T3 - ON T1.id = T3.encounter_id - AND T3.refund_service_id IS NULL - AND T3.delete_flag = '0' + ON T1.patient_id = T2.id + AND T2.delete_flag = '0' + LEFT JOIN wor_service_request AS T3 + ON T1.id = T3.encounter_id + AND T3.refund_service_id IS NULL + AND T3.delete_flag = '0' + LEFT JOIN wor_device_request AS T4 + ON T1.id = T4.encounter_id + AND T4.refund_device_id IS NULL + AND T4.delete_flag = '0' WHERE T1.class_enum = #{amb} - AND T3.status_enum IN (#{completed},#{cancelled}) + AND (T3.status_enum IN (#{completed},#{cancelled}) + OR T4.status_enum IN (#{completed},#{cancelled})) AND T1.delete_flag = '0' GROUP BY T1.tenant_id, T1.id, @@ -75,8 +80,8 @@ ae.tenant_id, wsr.id AS request_id, wsr.status_enum AS service_status, - NULL AS dispense_id, - NULL AS dispense_status, + NULL::bigint AS dispense_id, + 0 AS dispense_status, wsr.quantity AS execute_num, NULL AS quantity, wsr.unit_code, @@ -110,13 +115,13 @@ AND wad.delete_flag = '0' WHERE wsr.status_enum = #{reqCompleted} AND ae.delete_flag = '0' - UNION ALL + UNION SELECT ae.id AS encounter_id, ae.tenant_id, mmr.id AS request_id, NULL AS service_status, - dis.id AS dispense_id, - dis.status_enum AS dispense_status, + NULL::bigint AS dispense_id, + 0 AS dispense_status, mmr.execute_num, mmr.quantity, mmr.unit_code, @@ -141,9 +146,6 @@ ON ae.id = mmr.encounter_id AND mmr.refund_medicine_id IS NULL AND mmr.delete_flag = '0' - LEFT JOIN med_medication_dispense dis - ON dis.med_req_id = mmr.id - AND dis.delete_flag = '0' INNER JOIN med_medication_definition mmd ON mmr.medication_id = mmd.id AND (mmd.skin_test_flag = 1 OR mmd.inject_flag = 1) @@ -155,80 +157,79 @@ ON aci.service_id = mmr.id AND aci.delete_flag = '0' AND aci.refund_id IS NULL - WHERE dis.status_enum != #{draft} - AND ae.delete_flag = '0' - UNION ALL + WHERE mmr.status_enum = #{reqCompleted} + AND ae.delete_flag = '0' + UNION SELECT ae.id AS encounter_id, - ae.tenant_id, - wdr.id AS request_id, - NULL AS service_status, - wdd.id AS dispense_id, - wdd.status_enum AS dispense_status, - NULL AS execute_num, - wdr.quantity, - wdr.unit_code, - wdr.bus_no, - aci.status_enum AS charge_status, - aci.unit_price, - aci.total_price, - #{worDeviceRequest} AS request_table, - NULL AS service_category, - dev.category_code AS device_category, - NULL AS med_category, - dev."name" AS item_name, - dev.py_str, - dev.wb_str, - dev.size, - NULL AS group_id, - NULL AS sort_number, - NULL AS method_code, - NULL AS dispense_per_duration + ae.tenant_id, + wdr.id AS request_id, + NULL AS service_status, + wdd.id AS dispense_id, + wdd.status_enum AS dispense_status, + NULL AS execute_num, + wdr.quantity, + wdr.unit_code, + wdr.bus_no, + aci.status_enum AS charge_status, + aci.unit_price, + aci.total_price, + #{worDeviceRequest} AS request_table, + NULL AS service_category, + dev.category_code AS device_category, + NULL AS med_category, + dev."name" AS item_name, + dev.py_str, + dev.wb_str, + dev.size, + NULL AS group_id, + NULL AS sort_number, + NULL AS method_code, + NULL AS dispense_per_duration FROM adm_encounter ae - INNER JOIN wor_device_request wdr - ON wdr.encounter_id = ae.id - AND wdr.delete_flag = '0' - AND wdr.refund_device_id IS NULL - LEFT JOIN wor_device_dispense wdd - ON wdd.device_req_id = wdr.id - AND wdd.delete_flag = '0' - LEFT JOIN adm_charge_item aci - ON aci.service_id = wdr.id - AND aci.delete_flag = '0' - AND aci.refund_id IS NULL - INNER JOIN adm_device_definition dev - ON dev.id = wdr.device_def_id - AND dev.delete_flag = '0' + INNER JOIN wor_device_request wdr + ON wdr.encounter_id = ae.id + AND wdr.delete_flag = '0' + LEFT JOIN wor_device_dispense wdd + ON wdd.device_req_id = wdr.id + AND wdd.delete_flag = '0' + LEFT JOIN adm_charge_item aci + ON aci.service_id = wdr.id + AND aci.delete_flag = '0' + INNER JOIN adm_device_definition dev + ON dev.id = wdr.device_def_id + AND dev.delete_flag = '0' WHERE wdd.status_enum != #{draft} - AND ae.delete_flag = '0' + AND ae.delete_flag = '0' ) AS ii ${ew.customSqlSegment} ORDER BY ii.sort_number + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/MedicationDetailsMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/MedicationDetailsMapper.xml index 06741892..72b1b090 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/MedicationDetailsMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/MedicationDetailsMapper.xml @@ -53,7 +53,7 @@ ON wdd.device_req_id = wdr.id AND wdr.delete_flag = '0' INNER JOIN adm_charge_item aci - ON aci.service_id = wdd.device_req_id + ON aci.service_id = wdr.refund_device_id AND aci.delete_flag = '0' WHERE wdd.status_enum = #{refunded} AND wdd.delete_flag = '0' diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/ReturnMedicineMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/ReturnMedicineMapper.xml index a436d1c2..f3a6fa76 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/ReturnMedicineMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/ReturnMedicineMapper.xml @@ -19,7 +19,8 @@ ae.id AS encounter_id, ae.bus_no AS encounter_no, ae.tenant_id, - mmr.status_enum AS refund_enum, + ae.class_enum, + mmd.status_enum AS refund_enum, ap."name" AS patient_name, ap.wb_str AS patient_wb_str, ap.py_str AS patient_py_str, @@ -30,18 +31,24 @@ FROM adm_encounter ae LEFT JOIN med_medication_request mmr ON mmr.encounter_id = ae.id + AND mmr.delete_flag = '0' + LEFT JOIN med_medication_dispense mmd + ON mmd.med_req_id = mmr.id + AND mmd.delete_flag = '0' LEFT JOIN adm_patient ap ON ae.patient_id = ap.id + AND ap.delete_flag = '0' LEFT JOIN adm_organization ao ON ao.id = ae.organization_id + AND ao.delete_flag = '0' WHERE mmr.refund_medicine_id IS NOT NULL - AND ae.class_enum = #{amb} UNION SELECT ae.reception_time, ae.id AS encounter_id, ae.bus_no AS encounter_no, ae.tenant_id, - wdr.status_enum AS refund_enum, + ae.class_enum, + wdd.status_enum AS refund_enum, ap."name" AS patient_name, ap.wb_str AS patient_wb_str, ap.py_str AS patient_py_str, @@ -52,12 +59,17 @@ FROM adm_encounter ae LEFT JOIN wor_device_request wdr ON wdr.encounter_id = ae.id + AND wdr.delete_flag = '0' + LEFT JOIN wor_device_dispense wdd + ON wdd.device_req_id = wdr.id + AND wdd.delete_flag = '0' LEFT JOIN adm_patient ap ON ae.patient_id = ap.id + AND ap.delete_flag = '0' LEFT JOIN adm_organization ao ON ao.id = ae.organization_id + AND ao.delete_flag = '0' WHERE wdr.refund_device_id IS NOT NULL - AND ae.class_enum = #{amb} ) AS ii ${ew.customSqlSegment} ORDER BY ii.reception_time DESC @@ -68,31 +80,33 @@ - SELECT - T1.id AS dispense_id, - T1.unit_code AS dispense_unit, - T1.quantity, - T1.location_id, - T1.lot_number, - T1.dispense_quantity, - T2.id AS inventory_id, - T2.unit_code AS inventory_unit_code, - T2.quantity AS inventory_quantity, - T2.inventory_status_enum, - T2.expiration_date, - T3.part_percent, - T3."name" AS item_name, - T3.id AS item_id + SELECT T1.id AS dispense_id, + T1.unit_code AS dispense_unit, + T1.quantity, + T1.location_id, + T1.lot_number, + T1.dispense_quantity, + T1.status_enum AS dispense_status, + T1.trace_no, + T1.med_req_id AS request_id, + T2.id AS inventory_id, + T2.unit_code AS inventory_unit_code, + T2.quantity AS inventory_quantity, + T2.inventory_status_enum, + T2.expiration_date, + T3.part_percent, + T3."name" AS item_name, + T1.medication_id AS item_id FROM med_medication_dispense AS T1 - INNER JOIN wor_inventory_item AS T2 - ON T1.medication_id = T2.item_id - AND T2.delete_flag = '0' - AND T2.item_table = #{medMedicationDefinition} - AND T1.lot_number = T2.lot_number - AND T1.location_id = T2.location_id - INNER JOIN med_medication_definition AS T3 - ON T1.medication_id = T3.id - AND T3.delete_flag = '0' + INNER JOIN wor_inventory_item AS T2 + ON T1.medication_id = T2.item_id + AND T2.delete_flag = '0' + AND T2.item_table = #{medMedicationDefinition} + AND T1.lot_number = T2.lot_number + AND T1.location_id = T2.location_id + INNER JOIN med_medication_definition AS T3 + ON T1.medication_id = T3.id + AND T3.delete_flag = '0' WHERE T1.id IN #{medDispenseId} @@ -104,31 +118,33 @@ UNION - SELECT - T4.id AS dispense_id, - T4.unit_code AS dispense_unit, - T4.quantity, - T4.location_id, - T4.lot_number, - T4.dispense_quantity, - T2.id AS inventory_id, - T2.unit_code AS inventory_unit_code, - T2.quantity AS inventory_quantity, - T2.inventory_status_enum, - T2.expiration_date, - T5.part_percent, - T5."name" AS item_name, - T5.id AS item_id + SELECT T4.id AS dispense_id, + T4.unit_code AS dispense_unit, + T4.quantity, + T4.location_id, + T4.lot_number, + T4.dispense_quantity, + T4.status_enum AS dispense_status, + T4.trace_no, + T4.device_req_id AS request_id, + T2.id AS inventory_id, + T2.unit_code AS inventory_unit_code, + T2.quantity AS inventory_quantity, + T2.inventory_status_enum, + T2.expiration_date, + T5.part_percent, + T5."name" AS item_name, + T4.device_def_id AS item_id FROM wor_device_dispense AS T4 - INNER JOIN wor_inventory_item AS T2 - ON T4.device_def_id = T2.item_id - AND T2.delete_flag = '0' - AND T2.item_table = #{admDeviceDefinition} - AND T4.lot_number = T2.lot_number - AND T4.location_id = T2.location_id - INNER JOIN adm_device_definition AS T5 - ON T4.device_def_id = T5.id - AND T5.delete_flag = '0' + INNER JOIN wor_inventory_item AS T2 + ON T4.device_def_id = T2.item_id + AND T2.delete_flag = '0' + AND T2.item_table = #{admDeviceDefinition} + AND T4.lot_number = T2.lot_number + AND T4.location_id = T2.location_id + INNER JOIN adm_device_definition AS T5 + ON T4.device_def_id = T5.id + AND T5.delete_flag = '0' WHERE T4.id IN #{devDispenseId} @@ -143,9 +159,9 @@ SELECT mmd.status_enum AS refund_enum, mmr.refund_medicine_id, mmr.id AS request_id, - mmr.quantity, + mmd.quantity, mmr.unit_code, - mmr.lot_number, + mmd.lot_number, mmr.status_enum AS req_status, mmd.dispense_quantity, mmd.id AS dispense_id, @@ -157,7 +173,7 @@ mmd.trace_no FROM med_medication_request mmr LEFT JOIN med_medication_dispense mmd - ON mmr.refund_medicine_id = mmd.med_req_id + ON mmr.id = mmd.med_req_id AND mmd.delete_flag = '0' INNER JOIN med_medication_definition med ON mmr.medication_id = med.id @@ -172,13 +188,10 @@ AND mmr.encounter_id = #{encounterId} AND aci.service_table =#{medMedicationRequest} - AND mmr.status_enum IN (#{inRefund},#{completed}) - - - AND mmr.status_enum = #{inRefund} + AND mmd.status_enum IN (#{refunded},#{pendingRefund}) - - AND mmr.status_enum = #{completed} + + AND mmd.status_enum = #{refundStatus} AND mmr.delete_flag = '0' UNION @@ -187,7 +200,7 @@ wdr.id AS request_id, wdr.quantity, wdr.unit_code, - wdr.lot_number, + wdd.lot_number, wdr.status_enum AS req_status, wdd.dispense_quantity, wdd.id AS dispense_id, @@ -199,7 +212,7 @@ wdd.trace_no FROM wor_device_request wdr LEFT JOIN wor_device_dispense wdd - ON wdr.refund_device_id = wdd.device_req_id + ON wdr.id = wdd.device_req_id AND wdd.delete_flag = '0' INNER JOIN adm_device_definition dev ON wdr.device_def_id = dev.id @@ -213,15 +226,12 @@ WHERE wdr.refund_device_id IS NOT NULL AND wdr.encounter_id =#{encounterId} AND aci.service_table =#{worDeviceRequest} - - AND wdr.status_enum IN (#{inRefund},#{completed}) - - - AND wdr.status_enum = #{inRefund} - - - AND wdr.status_enum = #{completed} - + + AND wdd.status_enum IN (#{refunded},#{pendingRefund}) + + + AND wdd.status_enum = #{refundStatus} + AND wdr.delete_flag = '0' - SELECT ii.tenant_id, - ii.bus_no,--单据号 - ii.request_id,--供应请求id - ii.delivery_id,--供应发放id - ii.item_table,--项目表 - ii.item_name,--项目名 - ii.item_id,--项目id - ii.total_volume,--规格 - ii.lot_number,--批号 - ii.quantity,--请求数 - ii.unit_code,--单位 - ii.max_unit_code,--常规单位 - ii.min_unit_code,--最小单位 - ii.source_location_id,--发放地点 - ii.source_location_name, - ii.org_id,--申请科室 - ii.org_name, - ii.applicant_id,--领药人 - ii.applicant_name, - ii.apply_time,--申请时间 - ii.status_enum,--状态 - ii.patient_info --患者信息 - FROM (SELECT T1.tenant_id, - T1.bus_no,--单据号 - T1.id AS request_id,--供应请求id - T2.id AS delivery_id,--供应发放id - T1.item_table,--项目表 - T3.name AS item_name,--项目名 - T1.item_id,--项目id - T4.total_volume,--规格 - T1.lot_number,--批号 - T1.item_quantity AS quantity,--请求数 - T1.unit_code,--单位 - T3.unit_code AS max_unit_code,--常规单位 - T3.min_unit_code,--最小单位 - T1.source_location_id,--发放地点 - T5.name AS source_location_name, - T1.purpose_location_id AS org_id,--申请科室 - T6.name AS org_name, - T1.applicant_id,--领药人 - T7.name AS applicant_name, - T1.apply_time,--申请时间 - T1.status_enum,--状态 - STRING_AGG(CONCAT(T11.name, ' : ', T12.inpatient_bed), ',' ORDER BY T11.name, - T12.inpatient_bed) AS patient_info -- 患者信息 - FROM wor_supply_request T1 - LEFT JOIN wor_supply_delivery AS T2 - ON T2.request_id = T1.id - AND T2.delete_flag = '0' - LEFT JOIN med_medication_definition AS T3 - ON T1.item_id = T3.id - AND T3.delete_flag = '0' - LEFT JOIN med_medication AS T4 - ON T3.id = T4.medication_def_id - AND T4.delete_flag = '0' - LEFT JOIN adm_location AS T5 - ON T1.source_location_id = T5.id - AND T5.delete_flag = '0' - LEFT JOIN adm_organization AS T6 - ON T1.purpose_location_id = T6.id - AND T6.delete_flag = '0' - LEFT JOIN adm_practitioner AS T7 - ON T1.applicant_id = T7.id - AND T7.delete_flag = '0' - LEFT JOIN (SELECT id, - encounter_id, - patient_id - FROM (SELECT id, - encounter_id, - patient_id, - ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY id) AS rn - FROM med_medication_dispense - WHERE delete_flag = '0') t - WHERE rn = 1) AS T8 - ON CONCAT(',', T2.based_on_ids, ',') LIKE CONCAT('%,', T8.id, ',%') - LEFT JOIN (SELECT STRING_AGG(T10.NAME, '_' ORDER BY T10.bus_no) AS inpatient_bed, T9.encounter_id - FROM adm_encounter_location T9 - LEFT JOIN adm_location AS T10 - ON T10.id = T9.location_id - AND T10.delete_flag = '0' - WHERE T9.status_enum = '2' - AND T9.delete_flag = '0' - GROUP BY T9.encounter_id) AS T12 ON T8.encounter_id = T12.encounter_id - LEFT JOIN adm_patient AS T11 - ON T11.id = T8.patient_id - AND T11.delete_flag = '0' - WHERE T1.item_table = 'med_medication_definition' - AND T1.type_enum = 23 - AND T1.category_enum = 21 - AND T1.delete_flag = '0' - GROUP BY T1.tenant_id, - T1.bus_no, - T1.id, - T2.id, - T1.item_table, - T3.name, - T1.item_id, - T4.total_volume, - T1.lot_number, - T1.item_quantity, - T1.unit_code, - T3.unit_code, - T3.min_unit_code, - T1.source_location_id, - T5.name, - T1.purpose_location_id, - T6.name, - T1.applicant_id, - T7.name, - T1.apply_time, - T1.status_enum - ) AS ii - ${ew.customSqlSegment} - - - diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/WesternMedicineDispenseMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/WesternMedicineDispenseMapper.xml index 298dcbe6..04570b1c 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/WesternMedicineDispenseMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/pharmacymanage/WesternMedicineDispenseMapper.xml @@ -1,6 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - SELECT ii.department_name, ii.doctor_id, ii.doctor_name, @@ -77,6 +125,7 @@ ii.request_id, ii.tcm_flag, ii.item_name, + ii.merchandise_name, ii.item_id, ii.total_volume, ii.unit_code, @@ -89,6 +138,7 @@ ii.dose_unit_code, ii.dispense_per_quantity, ii.dispense_per_duration, + ii.request_quantity, ii.quantity, ii.dispense_id, ii.unit_price, @@ -100,17 +150,25 @@ ii.skin_test_flag, ii.group_id, ii.manufacturer_text, - ii.trace_no + ii.trace_no, + ii.max_unit_code, + ii.part_percent, + ii.inventory_id, + ii.inventory_unit_code, + ii.inventory_quantity, + ii.inventory_lot_number, + ii.expiration_date, + ii.med_type_code FROM ( SELECT T8."name" AS department_name, T9.id AS doctor_id, T9."name" AS doctor_name, T3.category_code AS item_type, T7."name" AS condition_name, T2.prescription_no, - T2.lot_number, T2.id AS request_id, T2.tcm_flag, T3."name" AS item_name, + T3.merchandise_name, T3.id AS item_id, T4.total_volume, T1.unit_code, @@ -120,9 +178,11 @@ T2.rate_code, T1.location_id, T1.method_code, + T1.lot_number, T2.dose_unit_code, T2.dispense_per_quantity, T2.dispense_per_duration, + T2.quantity AS request_quantity, T1.quantity, T1.id AS dispense_id, T5.unit_price, @@ -135,7 +195,15 @@ T2.group_id AS group_id, T1.tenant_id, T3.manufacturer_text, - T1.trace_no + T1.trace_no, + T3.unit_code AS max_unit_code, + T3.part_percent, + T14.id AS inventory_id, + T14.unit_code AS inventory_unit_code, + T14.quantity AS inventory_quantity, + T14.lot_number AS inventory_lot_number, + T14.expiration_date, + T15.med_type_code FROM med_medication_dispense AS T1 LEFT JOIN med_medication_request AS T2 ON T1.med_req_id = T2.id @@ -170,6 +238,13 @@ LEFT JOIN adm_location AS T13 ON T1.location_id = T13.id AND T13.delete_flag = '0' + LEFT JOIN wor_inventory_item AS T14 + ON T2.medication_id = T14.item_id + AND T1.location_id = T14.location_id + AND T14.delete_flag = '0' + LEFT JOIN adm_encounter_diagnosis AS T15 + ON T2.encounter_diagnosis_id = T15.id + AND T15.delete_flag = '0' WHERE T1.delete_flag = '0' -- 因发药配药合并,前台只能看到待发药,已发药状态,但是后台配药发药状态都查 AND @@ -182,18 +257,53 @@ T1.status_enum = #{completed} + AND T14.inventory_status_enum = #{active} ORDER BY prescription_no DESC ) AS ii ${ew.customSqlSegment} + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/AdviceManageAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/AdviceManageAppMapper.xml index 99ef6114..9d34e1bf 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/AdviceManageAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/AdviceManageAppMapper.xml @@ -86,12 +86,12 @@ AND ae.class_enum = #{classEnum} AND ae.status_enum = #{status} AND EXISTS( - SELECT 1 - FROM adm_practitioner_role - WHERE delete_flag = '0' - AND practitioner_id = #{practitionerId} - AND org_id = ae.organization_id - )) AS rpmi + SELECT 1 + FROM adm_practitioner_role + WHERE delete_flag = '0' + AND practitioner_id = #{practitionerId} + AND org_id = ae.organization_id + )) AS rpmi ${ew.customSqlSegment} @@ -125,7 +125,8 @@ T2.part_percent AS part_percent, ccd.name AS condition_definition_name, T1.therapy_enum AS therapyEnum, - T1.sort_number AS sort_number + T1.sort_number AS sort_number, + T1.based_on_id AS based_on_id FROM med_medication_request AS T1 LEFT JOIN med_medication_definition AS T2 ON T2.ID = T1.medication_id AND T2.delete_flag = '0' @@ -175,7 +176,8 @@ T2.part_percent AS part_percent, '' AS condition_definition_name, 2 AS therapyEnum, - 99 AS sort_number + 99 AS sort_number, + T1.based_on_id AS based_on_id FROM wor_device_request AS T1 LEFT JOIN adm_device_definition AS T2 ON T2.ID = T1.device_def_id AND T2.delete_flag = '0' @@ -222,7 +224,8 @@ 1 AS part_percent, '' AS condition_definition_name, T1.therapy_enum AS therapyEnum, - 99 AS sort_number + 99 AS sort_number, + T1.based_on_id AS based_on_id FROM wor_service_request AS T1 LEFT JOIN wor_activity_definition AS T2 ON T2.ID = T1.activity_id @@ -231,7 +234,6 @@ T3.service_table = #{WOR_SERVICE_REQUEST} LEFT JOIN adm_organization AS ao ON ao.ID = T1.org_id AND ao.delete_flag = '0' WHERE T1.delete_flag = '0' AND T1.generate_source_enum = #{generateSourceEnum} - AND T1.based_on_table is null AND T1.parent_id IS NULL AND T1.encounter_id = #{encounterId} diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ChargeReportMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ChargeReportMapper.xml index 8099a01b..b6bd28cc 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ChargeReportMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ChargeReportMapper.xml @@ -1,168 +1,219 @@ - - + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/MedicationInboundReportMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/MedicationInboundReportMapper.xml new file mode 100644 index 00000000..dec4bf37 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/MedicationInboundReportMapper.xml @@ -0,0 +1,46 @@ + + + + + + + diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ReportMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ReportMapper.xml new file mode 100644 index 00000000..2d661740 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/reportmanage/ReportMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/tencentJH/TencentAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/tencentJH/TencentAppMapper.xml new file mode 100644 index 00000000..2d163450 --- /dev/null +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/tencentJH/TencentAppMapper.xml @@ -0,0 +1,184 @@ + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbElepMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbElepMapper.xml index 3eb87500..54299272 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbElepMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbElepMapper.xml @@ -93,7 +93,8 @@ T5.create_time AS mdtrt_time, --挂号日期 T1.issue_time AS prsc_time, --处方开立日期 --诊断信息 - T8.name AS condition_name --诊断名 + T8.name AS condition_name, --诊断名 + T12.name AS special_condition_name --诊断名 FROM elep_medication_request AS T1 LEFT JOIN (SELECT drug.medical_catalog_code, drug.registered_name, @@ -127,8 +128,11 @@ ON T1.condition_id = T11.id AND T11.delete_flag = '0' LEFT JOIN cli_condition_definition AS T8 - ON T11.definition_id = T8.id + ON T1.condition_def_id = T8.id AND T8.delete_flag = '0' + LEFT JOIN cli_condition_definition AS T12 + ON T1.opsp_dise_code = T12.yb_no + AND T12.delete_flag = '0' LEFT JOIN yb_elep_medresult_info AS T9 ON T1.hi_rxno = T9.hi_rxno LEFT JOIN (SELECT hi_rxno, rx_stas_codg, rx_stas_name diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbMapper.xml index 19bf0cc3..8ffb73eb 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/ybmanage/YbMapper.xml @@ -185,4 +185,76 @@ WHERE T1.id = #{paymentId} GROUP BY T5."name", T5.yb_no + + \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/properties/yb.properties b/openhis-server-new/openhis-application/src/main/resources/properties/yb.properties index d78bf823..b96d8c96 100644 --- a/openhis-server-new/openhis-application/src/main/resources/properties/yb.properties +++ b/openhis-server-new/openhis-application/src/main/resources/properties/yb.properties @@ -1,5 +1,5 @@ ybapp.config.url=http://localhost:18079/openhis/yb/yb ybapp.config.api.key=your_api_key_123 ybapp.config.timeout=5000 -ybapp.config.fixmedinsCode=H22010200 +ybapp.config.fixmedinsCode=H22010402403 ybapp.config.eleUrl=http://localhost:18079/openhis/yb/ybElep \ No newline at end of file diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/constant/CommonConstants.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/constant/CommonConstants.java index f3ede49b..a2c0ef87 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/constant/CommonConstants.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/constant/CommonConstants.java @@ -1,5 +1,7 @@ package com.openhis.common.constant; +import java.math.BigDecimal; + /** * 常量 * @@ -41,6 +43,11 @@ public class CommonConstants { */ String SS_DD_FORMAT = "%s-%s-%d-%d"; + /** + * 拼接符(s-d-d) + */ + String S_DD_FORMAT = "%s-%d-%d"; + /** * 逗号 */ @@ -70,6 +77,16 @@ public class CommonConstants { * 地区码 */ String AREA_CODE = "000000"; + + /** + * GET + */ + String REQUEST_MAPPING_METHOD_GET = "GET"; + + /** + * POST + */ + String REQUEST_MAPPING_METHOD_POST = "POST"; } /** @@ -280,6 +297,11 @@ public class CommonConstants { */ String MedCategoryCode = "med_category_code"; + /** + * 耗材分类 + */ + String DevCategoryCode = "dev_category_code"; + /** * 门诊号 */ @@ -320,7 +342,7 @@ public class CommonConstants { String ChargeTime = "charge_time"; /** - * 审批时间 + * 申请人 */ String ApplicantName = "applicant_name"; @@ -339,6 +361,11 @@ public class CommonConstants { */ String ItemId = "item_id"; + /** + * 项目编号 + */ + String ItemNo = "item_no"; + /** * 项目所在表 */ @@ -358,11 +385,22 @@ public class CommonConstants { * 校对人Id */ String PerformerCheckId = "performer_check_id"; + /** * 单位 */ String UnitCode = "unit_code"; + /** + * 用法 + */ + String MethodCode = "method_code"; + + /** + * 用药频次 + */ + String RateCode = "rate_code"; + /** * 住院开始时间 */ @@ -387,6 +425,17 @@ public class CommonConstants { * 过期天数 */ String RemainingDays = "remaining_days"; + + + /** + * 追溯码 + */ + String TraceNo = "trace_no"; + + /** + * encounter状态 + */ + String StatusEnum = "status_enum"; } /** @@ -544,4 +593,129 @@ public class CommonConstants { String DisDeviceDoctorName = "张桂英"; } + /** + * excel导出常量 + */ + public interface ExcelOut { + // "0"的 + String CONSTANTZERO = "0"; + // 0.00 + String CONSTANT_ZERO_DML = "0.00"; + // 药品 + String MEDICATION = "药品"; + // 耗材 + String DEVICE = "耗材"; + // 未知类型 + String UNKONWN_TYPE = "未知类型"; + // 否 + String NO = "否"; + // 是 + String YES = "是"; + // BigDecimal类型的0 + BigDecimal ZERO = new BigDecimal(0); + // 元 + String YUAN = "元"; + + } + + /** + * excel导出的sheet名称 + */ + public interface SheetName { + /** + * 发药明细 + */ + String SHEET_NAME_DRUG_DETAIL = "发药明细"; + /** + * 住院发药单 + */ + String INPATIENT_DISPENSING = "住院发药单"; + /** + * 库存明细记录 + */ + String INVENTORY_DETAIL_RECORD = "库存明细记录"; + /** + * 住院汇总单 + */ + String INPATIENT_AGGREGATE_ORDER = "住院汇总单"; + /** + * 调拨单据明细 + */ + String TRANSFER_DOCUMENT_DETAIL = "调拨单据明细"; + /** + * 入库单明细 + */ + String WAREHOUSE_ENTRY_DETAIL = "入库单明细"; + /** + * 盘点单明细 + */ + String INVENTORY_LIST_DETAIL = "盘点单明细"; + /** + * 采购退货明细 + */ + String PURCHASE_RETURN_DETAIL = "采购退货明细"; + /** + * 报损单据明细 + */ + String LOSS_REPORT_DETAIL = "报损单据明细"; + /** + * 领用单据明细 + */ + String REQUISITION_FORM_DETAIL = "领用单据明细"; + /** + * 退库单据明细 + */ + String RETURN_WAREHOUSE_DETAIL = "退库单据明细"; + /** + * 年度药品总收入 + */ + String ANNUAL_TOTAL_DRUG_REVENUE = "年度药品总收入"; + /** + * 药品调拨详情 + */ + String DRUG_TRANSFER_DETAILS = "药品调拨详情"; + + /** + * 库存审批详情 + */ + String INVENTORY_APPROVAL_DETAILS = "库存审批详情"; + + } + + /** + * 导出时需要隐藏的列 + */ + public interface CellName { + /** + * 源仓库 + */ + String SOURCE_LOCATION_NAME = "sourceLocationName"; + /** + * 目的仓库 + */ + String PURPOSE_LOCATION_NAME = "purposeLocationName"; + + } + + /** + * 工具方法常量 + */ + public interface UtilMethodConstant { + /** + * 是否四舍五入(与余数作比较)的临界值 例:0.86 -> 0.85 0.88 -> 0.90 + */ + Double THRESHOLD_VALUE = 0.02; + } + + /** + * 数字常量 + */ + public interface NumConstant { + /** + * 数字 1 + */ + Integer ONE = 1; + + } + } diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ActivityDefCategory.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ActivityDefCategory.java index cf4ec26c..5c79f9b4 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ActivityDefCategory.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ActivityDefCategory.java @@ -35,9 +35,9 @@ public enum ActivityDefCategory implements HisEnumInterface { ANESTHESIA(25, "25", "麻醉"), /** - * 护理 + * 护理级别 */ - NURSING(26, "26", "护理"), + NURSING(26, "26", "护理级别"), /** * 膳食 @@ -77,7 +77,7 @@ public enum ActivityDefCategory implements HisEnumInterface { /** * 死亡 */ - death(36, "36", "死亡"), + DEATH(36, "36", "死亡"), /** * 产后 @@ -107,7 +107,47 @@ public enum ActivityDefCategory implements HisEnumInterface { /** * 隔离等级 */ - ISOLATION_LEVEL(42, "42", "隔离等级"); + ISOLATION_LEVEL(42, "42", "隔离等级"), + + /** + * 口腔检查 + */ + ORAL_EXAMINATION(43, "43", "口腔检查"), + + /** + * 内镜检查 + */ + ENDOSCOPY(44, "44", "内镜检查"), + + /** + * 内镜治疗 + */ + ENDOSCOPIC_THERAPY(45, "45", "内镜治疗"), + + /** + * 基础服务 + */ + BASIC_SERVICE(46, "46", "基础服务"), + + /** + * 诊断费 + */ + DIAGNOSIS_FEE(47, "47", "诊断费"), + + /** + * 预防接种手续费 + */ + VACCINATION_HANDLING_FEE(48, "48", "预防接种手续费"), + + /** + * 口腔治疗 + */ + ORAL_TREATMENT(49, "49", "口腔治疗"), + + /** + * 护理项目 + */ + NURSING_PROJECT(50, "50", "护理项目"); @EnumValue private final Integer value; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/AssignSeqEnum.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/AssignSeqEnum.java index 8c478bb1..d9ad71d7 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/AssignSeqEnum.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/AssignSeqEnum.java @@ -3,12 +3,15 @@ */ package com.openhis.common.enums; +import lombok.Getter; + /** * 采番前缀枚举 * * @author zxy * @date 2025-02-24 */ +@Getter public enum AssignSeqEnum { /** @@ -357,7 +360,12 @@ public enum AssignSeqEnum { /** * 耗材汇总单号 */ - DEVICE_SUMMARY_NO("69", "耗材汇总单号", "DSN"); + DEVICE_SUMMARY_NO("69", "耗材汇总单号", "DSN"), + + /** + * 自动备份单据号 + */ + AUTO_BACKUP_NO("70", "自动备份单据号", "ABU"); private final String code; private final String info; @@ -368,16 +376,4 @@ public enum AssignSeqEnum { this.info = info; this.prefix = prefix; } - - public String getCode() { - return code; - } - - public String getInfo() { - return info; - } - - public String getPrefix() { - return prefix; - } } \ No newline at end of file diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/CatalogType.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/CatalogType.java index abfb4d16..920404ee 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/CatalogType.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/CatalogType.java @@ -18,39 +18,39 @@ import lombok.Getter; public enum CatalogType { /** - * MEMBER_FIRST + * 西药中成药目录 */ CATALOG_TYPE_1301(1301, "西药中成药目录"), /** - * MEMBER_FIRST + * 中药饮片目录 */ CATALOG_TYPE_1302(1302, "中药饮片目录"), /** - * MEMBER_FIRST + * 医疗机构制剂目录 */ CATALOG_TYPE_1303(1303, "医疗机构制剂目录"), /** - * MEMBER_FIRST + * 民族药品目录 */ CATALOG_TYPE_1304(1304, "民族药品目录"), /** - * MEMBER_FIRST + * 医疗服务项目目录 */ CATALOG_TYPE_1305(1305, "医疗服务项目目录"), /** - * MEMBER_FIRST + * 医用耗材目录 */ CATALOG_TYPE_1306(1306, "医用耗材目录"), /** - * MEMBER_FIRST + * 疾病与诊断目录 */ CATALOG_TYPE_1307(1307, "疾病与诊断目录"), /** - * MEMBER_FIRST + * 手术操作目录 */ CATALOG_TYPE_1308(1308, "手术操作目录"), /** - * MEMBER_FIRST + * 门诊慢特病种目录 */ CATALOG_TYPE_1309(1309, "门诊慢特病种目录"), /** diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ClinicalStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ClinicalStatus.java index 3f7ea662..ef47f871 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ClinicalStatus.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ClinicalStatus.java @@ -14,7 +14,12 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum ClinicalStatus implements HisEnumInterface { - ACTIVE(1, "active", "阳性"), INACTIVE(2, "inactive", "阴性"), RESOLVED(3, "resolved", "已解决"), + ACTIVE(1, "active", "阳性"), + + INACTIVE(2, "inactive", "阴性"), + + RESOLVED(3, "resolved", "已解决"), + UNKNOWN(4, "unknown", "未知"); @EnumValue diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Criticality.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Criticality.java index fd1d31b1..ff84feb2 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Criticality.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Criticality.java @@ -17,7 +17,9 @@ import lombok.Getter; public enum Criticality implements HisEnumInterface { LOW(0, "low", "低"), + HIGH(1, "high", "高"), + UNASSESSABLE(2, "unassessable", "无法评估"); @EnumValue diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DispenseStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DispenseStatus.java index 2b2896e2..f2bd03a3 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DispenseStatus.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DispenseStatus.java @@ -77,10 +77,16 @@ public enum DispenseStatus implements HisEnumInterface { * 已配药 */ PREPARED(14, "PR", "已配药"), + /** * 撤回 */ - CANCELLED(15, "CA", "撤回"); + CANCELLED(15, "CA", "撤回"), + + /** + * 待退药 + */ + PENDING_REFUND(16, "PRD", "待退药"); private Integer value; private String code; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocDefinitionEnum.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocDefinitionEnum.java new file mode 100644 index 00000000..eda2fd18 --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocDefinitionEnum.java @@ -0,0 +1,25 @@ +package com.openhis.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 来源(Source)类型 + * + * @author swb + * @date 2025-11-26 + */ +@Getter +@AllArgsConstructor +public enum DocDefinitionEnum{ + ADMISSION_VITAL_SIGNS("1", "ADMISSION_VITAL_SIGNS", "入院体征"), + TEMPERATURE("4", "TEMPERATURE", "体温单"), + NURSING_RECORD("3", "NURSING_RECORD", "护理记录"); + + @EnumValue + private final String value; + private final String code; + private final String info; +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocStatusEnum.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocStatusEnum.java index d8579ba9..f6cb2264 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocStatusEnum.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DocStatusEnum.java @@ -12,8 +12,8 @@ import lombok.Getter; public enum DocStatusEnum implements HisEnumInterface { DRAFT(0, "DRAFT", "草稿/暂存"), SAVED(1, "SAVED", "提交"), - ARCHIVED(2, "ARCHIVED", "归档"), - UPDATED(3, "UPDATED", "修改"); + ARCHIVED(2, "ARCHIVED", "归档"); +// UPDATED(3, "UPDATED", "修改"); @EnumValue private final Integer value; private final String code; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/EncounterZyStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/EncounterZyStatus.java index 9a86f589..bfd34b53 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/EncounterZyStatus.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/EncounterZyStatus.java @@ -17,13 +17,13 @@ public enum EncounterZyStatus implements HisEnumInterface { AWAITING_DISCHARGE(3, "awaiting-discharge", "待出院"), - DISCHARGED_FROM_HOSPITAL(4, "discharged-from-hospital", "已出院"), + DISCHARGED_FROM_HOSPITAL(4, "discharged-from-hospital", "待出院结算"), ADMITTED_TO_THE_HOSPITAL(5, "admitted-to-the-hospital", "已入院"), PENDING_TRANSFER(6, "pending-transfer", "待转科"), - ALREADY_SETTLED(7, "already-settled", "已结算"); + ALREADY_SETTLED(7, "already-settled", "已结算出院"); @EnumValue private final Integer value; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentCategory.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentCategory.java new file mode 100644 index 00000000..9cca1515 --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentCategory.java @@ -0,0 +1,53 @@ +package com.openhis.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum InstrumentCategory implements HisEnumInterface{ + + /** + * 仪器种类 + */ + INSTRUMENT_TYPE_BLOOD_CELL_ANALYZER(1, "Blood Cell Analyzer", "血细胞分析仪"), + INSTRUMENT_TYPE_BLOOD_COAGULATION_ANALYZER(2, "Blood Coagulation Analyzer", "血凝仪"), + INSTRUMENT_TYPE_URINE_ANALYZER(3, "Urine Analyzer", "尿液分析仪"), + INSTRUMENT_TYPE_BLOOD_GAS_ANALYZER(4, "Blood Gas Analyzer", "血气分析仪"), + INSTRUMENT_TYPE_BIOCHEMICAL_ANALYZER(5, "Biochemical Analyzer", "生化分析仪"), + INSTRUMENT_TYPE_R_COUNTER(6, "R Counter", "R-计数器"), + INSTRUMENT_TYPE_GENE_AMPLIFICATION_INSTRUMENT(7, "Gene Amplification Instrument", "基因扩增仪"), + INSTRUMENT_TYPE_SEQUENCER(8, "Sequencer", "测序仪"), + INSTRUMENT_TYPE_ENZYME_LABELED_INSTRUMENT(9, "Enzyme Labeled Instrument", "酶标仪"), + INSTRUMENT_TYPE_ELECTROLYTE_ANALYZER(10, "Electrolyte Analyzer", "电解质分析仪"), + INSTRUMENT_TYPE_BACTERIAL_IDENTIFICATION_INSTRUMENT(11, "Bacterial Identification Instrument", "细菌鉴定仪"), + INSTRUMENT_TYPE_MANUAL_ANALYSIS(12, "Manual Analysis", "手工分析"), + INSTRUMENT_TYPE_ELECTROPHORESIS(13, "Electrophoresis", "电泳仪"), + INSTRUMENT_TYPE_SPECIFIC_PROTEIN_ANALYZER(14, "Specific Protein Analyzer", "特定蛋白分析仪"), + INSTRUMENT_TYPE_GLYCOHEMOGLOBIN_ANALYZER(15, "Glycohemoglobin Analyzer", "糖化血红蛋白分析仪"), + INSTRUMENT_TYPE_FLOW_CYTOMETER(16, "Flow Cytometer", "流式细胞仪"), + INSTRUMENT_TYPE_BLOOD_TYPE_ANALYZER(17, "Blood Type Analyzer", "血型分析仪"), + INSTRUMENT_TYPE_HS_CRP_ANALYZER(18, "High-Sensitivity CRP Analyzer", "超敏CRP分析仪"), + INSTRUMENT_TYPE_BLOOD_RHEOLOGY_ANALYZER(19, "Blood Rheology Analyzer", "血流变分析仪"), + INSTRUMENT_TYPE_BLOOD_CULTURE_ANALYZER(20, "Blood Culture Analyzer", "血培养仪"); + + + + @EnumValue + private final Integer value; + private final String code; + private final String info; + + public static InstrumentCategory getByValue(Integer value) { + if (value == null) { + return null; + } + for (InstrumentCategory val : values()) { + if (val.getValue().equals(value)) { + return val; + } + } + return null; + } +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DeviceCategory.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentStatus.java similarity index 48% rename from openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DeviceCategory.java rename to openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentStatus.java index a4bff69b..38e40d3b 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/DeviceCategory.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/InstrumentStatus.java @@ -1,27 +1,45 @@ package com.openhis.common.enums; import com.baomidou.mybatisplus.annotation.EnumValue; - import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor -public enum DeviceCategory implements HisEnumInterface { - ACTIVE(1, "1", "有源的"), COMMUNICATING(2, "2", "通讯类"), HOMEUSE(3, "3", "非院内使用"), IMPLANTABLE(4, "4", "植入类"), - IN_VITRO(5, "5", "试管类"), POINT_OF_CARE(6, "6", "床旁类"), SINGLE_USE(7, "7", "单次消耗类"), REUSABLE(8, "8", "可重用的"), - SOFTWARE(9, "9", "软件类"), DME(10, "10", "治疗设备"); +public enum InstrumentStatus implements HisEnumInterface{ + + /** + * 仪器状态 + */ + NORMAL(1, "Normal", "日常"), + + /** + * 仪器闲置 + */ + IDLE(2, "Idle", "闲置"), + + /** + * 仪器报损 + */ + DAMAGED(3, "Damaged", "报损"), + + /** + * 仪器故障 + */ + FAULTY(4, "Faulty", "故障"); + + @EnumValue private final Integer value; private final String code; private final String info; - public static DeviceCategory getByValue(Integer value) { + public static InstrumentStatus getByValue(Integer value) { if (value == null) { return null; } - for (DeviceCategory val : values()) { + for (InstrumentStatus val : values()) { if (val.getValue().equals(value)) { return val; } diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/NursingOrdersClass.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/NursingOrdersClass.java index d8a5ec4f..d109eea2 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/NursingOrdersClass.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/NursingOrdersClass.java @@ -19,9 +19,9 @@ import lombok.Getter; public enum NursingOrdersClass implements HisEnumInterface { /** - * 护理 + * 护理级别 */ - NURSING(26, "26", "护理"), + NURSING(26, "26", "护理级别"), /** * 病情 diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ObservationType.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ObservationType.java new file mode 100644 index 00000000..9506f46e --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ObservationType.java @@ -0,0 +1,67 @@ +package com.openhis.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ObservationType implements HisEnumInterface{ + /** + * OBSERVATION_TYPE: 实验室检查:如血液、尿液等实验室检查结果 + */ + OBSERVATION_TYPE_LABORATORY_TEST(1, "Laboratory Test", "实验室检查"), + + /** + * OBSERVATION_TYPE: 临床症状:如体温、呼吸等临床观察症状 + */ + OBSERVATION_TYPE_CLINICAL_SYMPTOMS(2, "Clinical Symptoms", "临床症状"), + + /** + * OBSERVATION_TYPE: 影像学检查:如X光、CT扫描等影像学检查 + */ + OBSERVATION_TYPE_IMAGING_EXAMINATION(3, "Imaging Examination", "X光、CT扫描影像学"), + + /** + * OBSERVATION_TYPE: 生理指标:如血压、心率、体温等常规生理参数 + */ + OBSERVATION_TYPE_PHYSIOLOGICAL_PARAMETERS(4, "Physiological Parameters", "常规生理"), + + /** + * OBSERVATION_TYPE: 药物反应:观察药物治疗后的效果 + */ + OBSERVATION_TYPE_DRUG_REACTION(5, "Drug Reaction", "药物治疗"), + + /** + * OBSERVATION_TYPE: 病理检查:如组织切片、病理学诊断结果 + */ + OBSERVATION_TYPE_PATHOLOGY_TEST(6, "Pathology Test", "组织切片、病理学诊断"), + + /** + * OBSERVATION_TYPE: 基因检测:基因组或遗传相关检查 + */ + OBSERVATION_TYPE_GENETIC_TEST(7, "Genetic Test", "基因组检查"), + + /** + * OBSERVATION_TYPE: 其他 + */ + OBSERVATION_TYPE_OTHER(8, "Other", "其他类型"); + + + @EnumValue + private final Integer value; + private final String code; + private final String info; + + public static ObservationType getByValue(Integer value) { + if (value == null) { + return null; + } + for (ObservationType val : values()) { + if (val.getValue().equals(value)) { + return val; + } + } + return null; + } +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ProcedureCategory.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ProcedureCategory.java index 59908b88..6251c917 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ProcedureCategory.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ProcedureCategory.java @@ -24,7 +24,8 @@ public enum ProcedureCategory { OUTPATIENT_ADVICE(10, "10", "门诊医嘱"), - INPATIENT_ADVICE(11, "11", "住院医嘱"); + INPATIENT_ADVICE(11, "11", "住院医嘱"), + INPATIENT_NURSE_ADVICE(12, "12", "住院护理医嘱"); @EnumValue private final Integer value; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ReportCodeEnum.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ReportCodeEnum.java new file mode 100644 index 00000000..de982dca --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ReportCodeEnum.java @@ -0,0 +1,18 @@ +package com.openhis.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ReportCodeEnum { + ANNUAL_TOTAL_DRUG_INCOME("1", "ANNUAL_TOTAL_DRUG_INCOME", "年度药品总收入"), + PRODUCT_TRANSFER("2", "PRODUCT_TRANSFER", "药品调拨"); + + @EnumValue + private final String value; + private final String code; + private final String info; +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Severity.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Severity.java index fc30f6ec..a0088728 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Severity.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/Severity.java @@ -16,7 +16,9 @@ import lombok.Getter; public enum Severity implements HisEnumInterface { MILD(0, "mild", "轻微"), + MODERATE(1, "moderate", "中度"), + SEVERE(2, "severe", "严重"); @EnumValue diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/VerificationStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecCollectStatus.java similarity index 52% rename from openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/VerificationStatus.java rename to openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecCollectStatus.java index 9e51e1d3..d4e7a57b 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/VerificationStatus.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecCollectStatus.java @@ -1,32 +1,40 @@ package com.openhis.common.enums; import com.baomidou.mybatisplus.annotation.EnumValue; - import lombok.AllArgsConstructor; import lombok.Getter; -/** - * 过敏与不耐受中验证状态 - * - * @author liuhr - * @date 2025/3/6 - */ @Getter @AllArgsConstructor -public enum VerificationStatus implements HisEnumInterface { - UNCONFIRMED(1, "unconfirmed", "未确认"), CONFIRMED(2, "confirmed", "已确认"), REFUTED(3, "refuted", "已反驳"), - ENTERED_IN_ERROR(4, "entered-in-error", "输入错误"); +public enum SpecCollectStatus implements HisEnumInterface{ + + /** + * 待采集 + */ + + PENDING(0, "Pending", "待采集"), + + /** + * 已采集 + */ + COLLECTED(1, "COLLECTED", "已采集"), + + /** + * 已接收 + */ + RECEIVED(2, "COLLECTED", "已接收"); + @EnumValue private final Integer value; private final String code; private final String info; - public static VerificationStatus getByValue(Integer value) { + public static SpecCollectStatus getByValue(Integer value) { if (value == null) { return null; } - for (VerificationStatus val : values()) { + for (SpecCollectStatus val : values()) { if (val.getValue().equals(value)) { return val; } diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecimenType.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecimenType.java new file mode 100644 index 00000000..64f298f4 --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/SpecimenType.java @@ -0,0 +1,44 @@ +package com.openhis.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum SpecimenType implements HisEnumInterface{ + + /** + * 样本种类 + */ + SPECIMEN_TYPE_BLOOD(1, "Blood", "血液样本"), + SPECIMEN_TYPE_URINE(2, "Urine", "尿液样本"), + SPECIMEN_TYPE_SALIVA(3, "Saliva", "唾液样本"), + SPECIMEN_TYPE_TISSUE(4, "Tissue", "组织样本"), + SPECIMEN_TYPE_CSF(5, "Cerebrospinal Fluid", "脑脊液样本"), + SPECIMEN_TYPE_SPUTUM(6, "Sputum", "痰液样本"), + SPECIMEN_TYPE_FECES(7, "Feces", "粪便样本"), + SPECIMEN_TYPE_SWAB(8, "Swab", "拭子样本"), + SPECIMEN_TYPE_BONE_MARROW(9, "Bone Marrow", "骨髓样本"), + SPECIMEN_TYPE_SEMEN(10, "Semen", "精液样本"), + SPECIMEN_TYPE_AMNIOTIC_FLUID(11, "Amniotic Fluid", "羊水样本"), + SPECIMEN_TYPE_HAIR(12, "Hair", "毛发样本"), + SPECIMEN_TYPE_NAIL(13, "Nail", "指甲样本"); + + @EnumValue + private final Integer value; + private final String code; + private final String info; + + public static SpecimenType getByValue(Integer value) { + if (value == null) { + return null; + } + for (SpecimenType val : values()) { + if (val.getValue().equals(value)) { + return val; + } + } + return null; + } +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TemperatureChartEnum.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TemperatureChartEnum.java new file mode 100644 index 00000000..5f822b2e --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TemperatureChartEnum.java @@ -0,0 +1,32 @@ +package com.openhis.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 体温单枚举 + * + * @author swb + * @date 2025-11-21 + */ +@Getter +@AllArgsConstructor +public enum TemperatureChartEnum { + BREATH("001", "breathe", "呼吸"), + PULSE("002", "pulse", "脉搏"), + TEMPERATURE("003", "temperature", "体温"), + BLOOD_PRESSURE("008", "bloodPressure", "血压"), + PAIN_SCORE("016", "painScore", "疼痛等级"), + POSTOP_DAYS("031", "", "术后天数"), + HEIGHT("","height","身高"), + WEIGHT("","weight","体重"), + OUTPUT("","output","出量"), + INPUT("","input","入量"), + HEART_RATE("","heartRate","心率"), + TIME_POINT("","timePoint","时间点"), + WARD_ADMISSION("9500", "", "入科"); + + private final String code; + private final String typeCode; + private final String description; +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TraceNoStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TraceNoStatus.java index aefe9c07..550f34eb 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TraceNoStatus.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/TraceNoStatus.java @@ -10,7 +10,9 @@ public enum TraceNoStatus implements HisEnumInterface { IN(1, "1", "进"), - OUT(2, "2", "出"),; + OUT(2, "2", "出"), + + IN_STOCK(3, "3", "在库"); @EnumValue private final Integer value; diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbEncounterZyStatus.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbEncounterZyStatus.java new file mode 100644 index 00000000..fbaebfcc --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbEncounterZyStatus.java @@ -0,0 +1,37 @@ +package com.openhis.common.enums.ybenums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.openhis.common.enums.HisEnumInterface; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum YbEncounterZyStatus implements HisEnumInterface { + + + TO_BE_REGISTERED(1, "to-be-registered", "待登记"), + + ADMITTED_TO_THE_HOSPITAL(2, "admitted-to-the-hospital", "已登记"), + + DISCHARGED_FROM_HOSPITAL(3, "discharged-from-hospital", "已出院"), + + ALREADY_SETTLED(4, "already-settled", "已结算"); + + @EnumValue + private final Integer value; + private final String code; + private final String info; + + public static YbEncounterZyStatus getByValue(Integer value) { + if (value == null) { + return null; + } + for (YbEncounterZyStatus val : values()) { + if (val.getValue().equals(value)) { + return val; + } + } + return null; + } +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbMdcsType.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbMdcsType.java new file mode 100644 index 00000000..68f1e5ca --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbMdcsType.java @@ -0,0 +1,66 @@ +package com.openhis.common.enums.ybenums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.openhis.common.enums.ClaimType; +import com.openhis.common.enums.HisEnumInterface; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum YbMdcsType { + + /** 职工基本医疗保险 */ + EMPLOYEE_BASIC(310,"310", "职工基本医疗保险"), + + /** 离休人员医疗保障 */ + RETIRED_PERSONNEL(340,"340", "离休人员医疗保障"), + + /** 一至六级残疾军人医疗补助 */ + DISABLED_SOLDIER(350,"350", "一至六级残疾军人医疗补助"), + + /** 老红军医疗保障 */ + RED_ARMY_VETERAN(360,"360", "老红军医疗保障"), + + /** 新型农村合作医疗 */ + NEW_RURAL_COOPERATIVE(380,"380", "新型农村合作医疗"), + + /** 城乡居民基本医疗保险 */ + URBAN_RURAL_RESIDENT(390,"390", "城乡居民基本医疗保险"), + + /** 城镇居民基本医疗保险 */ + URBAN_RESIDENT(391,"391", "城镇居民基本医疗保险"), + + /** 其他医疗保险 */ + OTHER(999,"999", "其他医疗保险"); + + @EnumValue + private final Integer value; + private final String code; + private final String info; + + public static YbMdcsType getByValue(Integer value) { + if (value == null) { + return null; + } + for (YbMdcsType val : values()) { + if (val.getValue().equals(value)) { + return val; + } + } + return null; + } + + + public static YbMdcsType getByCode(String code) { + if (code == null|| code.isEmpty()) { + return null; + } + for (YbMdcsType val : values()) { + if (val.getCode().equals(code)) { + return val; + } + } + return null; + } +} diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbPayment.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbPayment.java index 3fa16896..d277de03 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbPayment.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ybenums/YbPayment.java @@ -156,18 +156,28 @@ public enum YbPayment { // 医保结算返回值记录枚举 FULAMT_OWNPAY_AMT(1, 2, null, "全自费金额"), // PSN_PART_AMT(2,2,null,"个人负担总金额"), - OVERLMT_SELFPAY(3, 2, null, "超限价自费费用"), PRESELFPAY_AMT(4, 2, null, "先行自付金额"), INSCP_SCP_AMT(5, 2, null, "符合政策范围金额"), - ACT_PAY_DEDC(6, 2, null, "实际支付起付线"), POOL_PROP_SELFPAY(7, 2, null, "基本医疗保险统筹基金支付比例"), BALC(8, 2, null, "余额"), + OVERLMT_SELFPAY(3, 2, null, "超限价自费费用"), + PRESELFPAY_AMT(4, 2, null, "先行自付金额"), + INSCP_SCP_AMT(5, 2, null, "符合政策范围金额"), + ACT_PAY_DEDC(6, 2, null, "实际支付起付线"), + POOL_PROP_SELFPAY(7, 2, null, "基本医疗保险统筹基金支付比例"), + BALC(8, 2, null, "余额"), // 基金类型,下述仅作记录 - BIRTH_FUND(510100, 2, YB_FUND_PAY, "生育基金"), RETIREE_MEDICAL(340100, 2, YB_FUND_PAY, "离休人员医疗保障基金"), + BIRTH_FUND(510100, 2, YB_FUND_PAY, "生育基金"), + RETIREE_MEDICAL(340100, 2, YB_FUND_PAY, "离休人员医疗保障基金"), URBAN_BASIC_MEDICAL(390100, 2, YB_FUND_PAY, "城乡居民基本医疗保险基金"), - URBAN_SERIOUS_ILLNESS(390200, 2, YB_FUND_PAY, "城乡居民大病医疗保险基金"), MEDICAL_ASSISTANCE(610100, 2, YB_FUND_PAY, "医疗救助基金"), - GOVERNMENT_SUBSIDY(640100, 2, YB_FUND_PAY, "政府兜底基金"), ACCIDENT_INSURANCE(390400, 2, YB_FUND_PAY, "意外伤害基金"), - CARE_INSURANCE(620100, 2, YB_FUND_PAY, "照护保险基金"), FINANCIAL_FUND(360100, 2, YB_FUND_PAY, "财政基金"), - HOSPITAL_ADVANCE(999900, 2, YB_FUND_PAY, "医院垫付"), SUPPLEMENTARY_INSURANCE(390300, 2, YB_FUND_PAY, "城乡居民大病补充保险基金"), + URBAN_SERIOUS_ILLNESS(390200, 2, YB_FUND_PAY, "城乡居民大病医疗保险基金"), + MEDICAL_ASSISTANCE(610100, 2, YB_FUND_PAY, "医疗救助基金"), + GOVERNMENT_SUBSIDY(640100, 2, YB_FUND_PAY, "政府兜底基金"), + ACCIDENT_INSURANCE(390400, 2, YB_FUND_PAY, "意外伤害基金"), + CARE_INSURANCE(620100, 2, YB_FUND_PAY, "照护保险基金"), + FINANCIAL_FUND(360100, 2, YB_FUND_PAY, "财政基金"), + HOSPITAL_ADVANCE(999900, 2, YB_FUND_PAY, "医院垫付"), + SUPPLEMENTARY_INSURANCE(390300, 2, YB_FUND_PAY, "城乡居民大病补充保险基金"), BASIC_MEDICAL_INSURANCE_FOR_URBAN_EMPLOYEES(310201, 2, YB_FUND_PAY, "城镇职工基本医疗保险个人账户基金"), - E_WALLET(999981, 2, YB_FUND_PAY, "电子钱包"), HEALTHCARE_PREPAYMENT(360300, 2, YB_FUND_PAY, "保健预支基金"), + E_WALLET(999981, 2, YB_FUND_PAY, "电子钱包"), + HEALTHCARE_PREPAYMENT(360300, 2, YB_FUND_PAY, "保健预支基金"), // 师大中银支付 BPC_PAY(500000, 2, SELF_PAY, "BPC支付"), diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/HisQueryUtils.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/HisQueryUtils.java index 94435f47..452d24ea 100644 --- a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/HisQueryUtils.java +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/HisQueryUtils.java @@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletRequest; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.core.common.utils.DateUtils; import com.core.common.utils.SecurityUtils; +import com.core.framework.config.TenantContext; import com.openhis.common.constant.CommonConstants; /** @@ -146,6 +147,8 @@ public class HisQueryUtils { // 获取当前登录用户的租户 ID if (SecurityUtils.getAuthentication() != null) { return SecurityUtils.getLoginUser().getTenantId(); + } else if (TenantContext.getCurrentTenant() != null) { + return TenantContext.getCurrentTenant(); } return 0; } diff --git a/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/PageUtils.java b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/PageUtils.java new file mode 100644 index 00000000..e4fbf1fe --- /dev/null +++ b/openhis-server-new/openhis-common/src/main/java/com/openhis/common/utils/PageUtils.java @@ -0,0 +1,56 @@ +package com.openhis.common.utils; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.ArrayList; +import java.util.List; + +/** + * 分页工具类 + */ +public class PageUtils { + + /** + * 手动分页 + * + * @param allList 数据 + * @param pageNo 页码 + * @param pageSize 每页大小 + * @return 分页数据 + */ + public static Page buildPage(List allList, long pageNo, long pageSize) { + Page page = new Page<>(); + + int total = allList.size(); + if (total == 0) { + page.setRecords(new ArrayList<>()); + page.setTotal(0); + page.setCurrent(pageNo); + page.setSize(pageSize); + page.setPages(0L); + return page; + } + + // 计算分页起始位置 + int startIndex = (int)((pageNo - 1) * pageSize); + if (startIndex >= total) { + // 如果起始位置超过总数,返回最后一页 + startIndex = (int)((total - 1) / pageSize * pageSize); + pageNo = (total + pageSize - 1) / pageSize; + } + + int endIndex = (int)Math.min(startIndex + pageSize, total); + + // 获取当前页数据 + List currentPageList = allList.subList(startIndex, endIndex); + + // 设置分页信息 + page.setRecords(new ArrayList<>(currentPageList)); + page.setCurrent(pageNo); + page.setSize(pageSize); + page.setTotal(total); + page.setPages((total + pageSize - 1) / pageSize); // 计算总页数 + + return page; + } +} diff --git a/openhis-server-new/openhis-domain/pom.xml b/openhis-server-new/openhis-domain/pom.xml index 34c31894..6abb2553 100644 --- a/openhis-server-new/openhis-domain/pom.xml +++ b/openhis-server-new/openhis-domain/pom.xml @@ -15,13 +15,26 @@ 领域 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 16 + 16 + + + + - - com.alibaba.fastjson2 - fastjson2 + com.alibaba + fastjson + 2.0.43 + compile org.apache.httpcomponents @@ -31,12 +44,12 @@ com.openhis openhis-common + 0.0.1-SNAPSHOT - - org.springframework.boot - spring-boot-starter-web - provided + com.opencsv + opencsv + 5.7.1 diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ChargeItem.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ChargeItem.java index f24816e1..4a3c48f3 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ChargeItem.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ChargeItem.java @@ -160,4 +160,16 @@ public class ChargeItem extends HisBaseEntity { /** 发放ID */ private Long dispenseId; + + /** + * 系统优惠价格 + */ + private BigDecimal systemDiscountPrice; + + /** + * 人为二次调价 + */ + private BigDecimal manualAdjustedPrice; + + } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Device.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Device.java index 5907cd0b..3c956389 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Device.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Device.java @@ -1,14 +1,11 @@ package com.openhis.administration.domain; -import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - import com.core.common.core.domain.HisBaseEntity; -import com.openhis.common.enums.DeviceCategory; import com.openhis.common.enums.DeviceSafety; import lombok.Data; import lombok.EqualsAndHashCode; @@ -70,7 +67,7 @@ public class Device extends HisBaseEntity { private String partNumber; /** 器材种类 */ - private DeviceCategory categoryEnum; + private Integer categoryEnum; /** 器材类型 */ private String typeCode; @@ -93,5 +90,4 @@ public class Device extends HisBaseEntity { /** 器材安全 */ private DeviceSafety safetyEnum; - } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/DeviceDefinition.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/DeviceDefinition.java index 21b59a55..1c3f13b0 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/DeviceDefinition.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/DeviceDefinition.java @@ -6,8 +6,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; -import com.openhis.common.enums.DeviceCategory; -import com.openhis.common.enums.PublicationStatus; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,6 +27,7 @@ public class DeviceDefinition extends HisBaseEntity { /** ID */ @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long id; /** 编码 */ diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Instrument.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Instrument.java new file mode 100644 index 00000000..4d21d8b5 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/Instrument.java @@ -0,0 +1,113 @@ +package com.openhis.administration.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 存储各类仪器的信息,包括设备基本信息、状态、维护记录等Entity实体 + * + * @author system + * @date 2025-09-19 + */ +@Data +@TableName("adm_instrument") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class Instrument extends HisBaseEntity { + + /** 仪器的唯一标识符,使用自增序列 */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 仪器编号,唯一且不能为空 */ + private String instrumentCode; + + /** 仪器名称,必填项 */ + private String instrumentName; + + /** 仪器主编号 */ + private String instrumentMainCode; + + /** 仪器类型,选择项 */ + private Integer instrumentTypeEnum; + + /** 仪器型号 */ + private String instrumentModel; + + /** 生产厂家 */ + private String manufacturer; + + /** 仪器序列号 */ + private String serialNumber; + + /** 购买公司 */ + private String purchasingCompany; + + /** 联系人员 */ + private String contactPerson; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /** 购买日期 */ + private Date purchaseDate; + + /** 原价格 */ + private BigDecimal originalPrice; + + /** 成交价格 */ + private BigDecimal transactionPrice; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /** 安装日期 */ + private Date installationDate; + + /** 安装人员 */ + private String installationPerson; + + /** 维护人员 */ + private String maintenancePerson; + + /** 使用科室 */ + private Long orgId; + + /** 鉴定人员 */ + private String identificationPerson; + + /** 记录温度,选择项 */ + private String recordedTemperature; + + /** 仪器附件 */ + private String accessories; + + /** 仪器状态 */ + private Integer instrumentStatusEnum; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /** 报损日期 */ + private Date damageReportDate; + + /** 可复查仪器 是否 */ + private Integer recheckableInstrumentEnum; + + /** 使用状态,是否 */ + private Integer usageStatusEnum; + + /** 停用原因 */ + private String decommissionReason; + + /** 备注 */ + private String remarks; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ObservationDefinition.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ObservationDefinition.java new file mode 100644 index 00000000..d1d059ef --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/ObservationDefinition.java @@ -0,0 +1,55 @@ +package com.openhis.administration.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 观测定义Entity实体 + * + * @author system + * @date 2025-09-23 + */ +@Data +@TableName("adm_observation_definition") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class ObservationDefinition extends HisBaseEntity { + + /** $column.columnComment */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 观测名称,用于标识观测的具体名称 */ + private String name; + + /** 观测代码,用于唯一标识一个观测项 */ + private String code; + + /** 观测类型,例如:实验室、临床症状等 */ + private Integer observationTypeEnum; + + /** 参考范围,例如:3.0-6.0 mg/dL,用于指示正常范围 */ + private String referenceRange; + + /** 观测仪器id */ + private Long instrumentId; + + /** 状态 */ + private Integer statusEnum; + + /** 删除状态) */ + private String deleteFlag; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/OrganizationLocation.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/OrganizationLocation.java index 66f49845..f94002f4 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/OrganizationLocation.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/OrganizationLocation.java @@ -60,4 +60,9 @@ public class OrganizationLocation extends HisBaseEntity { /** 显示顺序 */ private Integer displayOrder; + /** + * 项目编码 | 药品:1 耗材:2 + */ + private String itemCode; + } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/SpecimenDefinition.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/SpecimenDefinition.java new file mode 100644 index 00000000..24f69fd7 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/domain/SpecimenDefinition.java @@ -0,0 +1,75 @@ +package com.openhis.administration.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 样本定义Entity实体 + * + * @author system + * @date 2025-09-05 + */ +@Data +@TableName("adm_specimen_definition") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class SpecimenDefinition extends HisBaseEntity { + + /** $column.columnComment */ + @JsonSerialize(using = ToStringSerializer.class) + @TableId(type = IdType.ASSIGN_ID) + + private Long id; + + /** 样本类型 */ + private Integer specimenTypeEnum; + + /** 样本名称 */ + private String specimenName; + + /** 自定义码 */ + private String customCode; + + /** 类型顺序 */ + private Integer typeOrder; + + /** 外部代码 */ + private String externalCode; + + /** 序号 */ + private Integer serialNumber; + + /** 全网型 */ + private String globalType; + + /** 拼音 */ + private String pyStr; + + /** 五笔 */ + private String wbStr; + + /** 样本类 */ + private String specimenClass; + + /** 扩展类型 */ + private String extendedType; + + /** WHONET代码 */ + private String whonetCode; + + + /** 状态 */ + private Integer statusEnum; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/InstrumentMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/InstrumentMapper.java new file mode 100644 index 00000000..3f7b346e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/InstrumentMapper.java @@ -0,0 +1,17 @@ +package com.openhis.administration.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.administration.domain.Instrument; + +/** + * 存储各类仪器的信息,包括设备基本信息、状态、维护记录等Mapper接口 + * + * @author system + * @date 2025-09-19 + */ +@Repository +public interface InstrumentMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/ObservationDefinitionMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/ObservationDefinitionMapper.java new file mode 100644 index 00000000..627dd007 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/ObservationDefinitionMapper.java @@ -0,0 +1,17 @@ +package com.openhis.administration.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.administration.domain.ObservationDefinition; + +/** + * 观测定义Mapper接口 + * + * @author system + * @date 2025-09-23 + */ +@Repository +public interface ObservationDefinitionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/SpecimenDefinitionMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/SpecimenDefinitionMapper.java new file mode 100644 index 00000000..43b4c16d --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/mapper/SpecimenDefinitionMapper.java @@ -0,0 +1,17 @@ +package com.openhis.administration.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.administration.domain.SpecimenDefinition; + +/** + * 样本定义Mapper接口 + * + * @author system + * @date 2025-09-05 + */ +@Repository +public interface SpecimenDefinitionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IChargeItemService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IChargeItemService.java index f83a8f96..215149d8 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IChargeItemService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IChargeItemService.java @@ -124,4 +124,19 @@ public interface IChargeItemService extends IService { */ void updatePlannedChargeStatus(List procedureIdList); + /** + * 根据encounterId查询收费项 + * + * @param id + * @return + */ + List getChargeItemByEncounterId(Long id); + + /** + * 根据encounterId查询收费项 + * + * @param id + * @return + */ + List getChargeItemByEncounterId(Long id,String tableName,List serviceId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInstrumentService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInstrumentService.java new file mode 100644 index 00000000..92252309 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInstrumentService.java @@ -0,0 +1,14 @@ +package com.openhis.administration.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.administration.domain.Instrument; + +/** + * 存储各类仪器的信息,包括设备基本信息、状态、维护记录等Service接口 + * + * @author system + * @date 2025-09-19 + */ +public interface IInstrumentService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInvoiceService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInvoiceService.java index 6b23bc38..ebd9e9a5 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInvoiceService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IInvoiceService.java @@ -18,4 +18,12 @@ public interface IInvoiceService extends IService { * @return */ Long addInvoice(Invoice invoice); + + /** + * 根据付款单ID查询发票 + * + * @param id 付款单ID + * @return + */ + Invoice getByPaymentId(Long id); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ILocationService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ILocationService.java index e27a53f7..7746df5b 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ILocationService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ILocationService.java @@ -5,6 +5,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.administration.domain.Location; import com.openhis.administration.dto.LocationDataDto; +import liquibase.pro.packaged.L; import org.apache.ibatis.annotations.Param; /** @@ -110,4 +111,11 @@ public interface ILocationService extends IService { **/ List searchLocationDataByIds(@Param("locationIds") List locationIds); + /** + * 获取所有位置信息 + * + * @return 所有位置信息列表 + */ + List< Location> getLocationList(); + } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IObservationDefinitionService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IObservationDefinitionService.java new file mode 100644 index 00000000..03bb912c --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IObservationDefinitionService.java @@ -0,0 +1,14 @@ +package com.openhis.administration.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.administration.domain.ObservationDefinition; + +/** + * 观测定义Service接口 + * + * @author system + * @date 2025-09-23 + */ +public interface IObservationDefinitionService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPatientIdentifierService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPatientIdentifierService.java index a1c6c97f..85473342 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPatientIdentifierService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IPatientIdentifierService.java @@ -3,6 +3,8 @@ package com.openhis.administration.service; import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.administration.domain.PatientIdentifier; +import java.util.List; + /** * 患者标识管理Service接口 * @@ -16,7 +18,7 @@ public interface IPatientIdentifierService extends IService { * * @param patientId 患者Id */ - PatientIdentifier selectByPatientId(Long patientId); + List selectByPatientId(Long patientId); /** * 查询病人标识 diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ISpecimenDefinitionService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ISpecimenDefinitionService.java new file mode 100644 index 00000000..6bbe404a --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/ISpecimenDefinitionService.java @@ -0,0 +1,16 @@ +package com.openhis.administration.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.core.common.core.domain.R; +import com.openhis.administration.domain.SpecimenDefinition; + +import javax.servlet.http.HttpServletRequest; + +/** + * 样本定义Service接口 + * + * @author system + * @date 2025-09-05 + */ +public interface ISpecimenDefinitionService extends IService { +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefDetailServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefDetailServiceImpl.java index 1bf1ea5a..a4e750a3 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefDetailServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefDetailServiceImpl.java @@ -10,7 +10,7 @@ import com.openhis.administration.domain.ChargeItemDefDetail; import com.openhis.administration.mapper.ChargeItemDefDetailAppMapper; import com.openhis.administration.service.IChargeItemDefDetailService; import com.openhis.common.enums.ConditionCode; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; /** * 费用定价管理子Service业务层处理 diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefinitionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefinitionServiceImpl.java index f2f45630..fbc108b1 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefinitionServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ChargeItemDefinitionServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; import com.core.common.utils.DateUtils; import com.openhis.administration.domain.ChargeItemDefDetail; import com.openhis.administration.domain.ChargeItemDefinition; @@ -20,7 +21,6 @@ import com.openhis.administration.service.IChargeItemDefDetailService; import com.openhis.administration.service.IChargeItemDefinitionService; import com.openhis.common.constant.CommonConstants; import com.openhis.common.enums.ConditionCode; -import com.openhis.common.enums.DelFlag; import com.openhis.common.enums.PublicationStatus; import com.openhis.common.enums.Whether; @@ -50,7 +50,7 @@ public class ChargeItemDefinitionServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ChargeItemDefinition::getDeleteFlag, DelFlag.NO.getValue()); + queryWrapper.eq(ChargeItemDefinition::getDeleteFlag, DelFlag.NO.getCode()); // 拼接查询条件 if (chargeItemDefinition.getStatusEnum() != null) { @@ -177,7 +177,7 @@ public class ChargeItemDefinitionServiceImpl extends ServiceImpl getChargeItemByEncounterId(Long id) { + return baseMapper.selectList(new LambdaUpdateWrapper().eq(ChargeItem::getEncounterId, id) + .eq(ChargeItem::getDeleteFlag, DelFlag.NO.getCode())); + } + + @Override + public List getChargeItemByEncounterId(Long id, String tableName, List serviceId) { + return baseMapper.selectList(new LambdaUpdateWrapper().eq(ChargeItem::getEncounterId, id) + .in(ChargeItem::getEncounterId, serviceId) + .eq(ChargeItem::getDeleteFlag, DelFlag.NO.getCode())); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/EncounterLocationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/EncounterLocationServiceImpl.java index 0aae96ab..02055cbf 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/EncounterLocationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/EncounterLocationServiceImpl.java @@ -9,10 +9,10 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; import com.openhis.administration.domain.EncounterLocation; import com.openhis.administration.mapper.EncounterLocationMapper; import com.openhis.administration.service.IEncounterLocationService; -import com.openhis.common.enums.DelFlag; import com.openhis.common.enums.EncounterActivityStatus; import com.openhis.common.enums.LocationForm; @@ -73,7 +73,7 @@ public class EncounterLocationServiceImpl extends ServiceImpl implements IInstrumentService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/InvoiceServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/InvoiceServiceImpl.java index c1d47748..24369220 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/InvoiceServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/InvoiceServiceImpl.java @@ -2,6 +2,7 @@ package com.openhis.administration.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.core.common.enums.DelFlag; import com.core.common.utils.SecurityUtils; import com.openhis.administration.domain.Supplier; import com.openhis.common.enums.SupplyStatus; @@ -46,4 +47,9 @@ public class InvoiceServiceImpl extends ServiceImpl impl return invoice.getId(); } + @Override + public Invoice getByPaymentId(Long id) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(Invoice::getReconciliationId, id) + .eq(Invoice::getDeleteFlag, DelFlag.NO.getCode())); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/LocationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/LocationServiceImpl.java index 06defde0..37ca91bf 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/LocationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/LocationServiceImpl.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.administration.domain.Location; import com.openhis.administration.mapper.LocationMapper; import com.openhis.administration.service.ILocationService; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.LocationForm; import com.openhis.common.enums.LocationStatus; @@ -190,4 +190,13 @@ public class LocationServiceImpl extends ServiceImpl i return this.locationMapper.searchLocationDataByIds(locationIds); } + /** + * 获取所有位置信息 + * + * @return 所有位置信息列表 + */ + @Override public List getLocationList() { + return baseMapper.selectList(new LambdaQueryWrapper()); + } + } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ObservationDefinitionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ObservationDefinitionServiceImpl.java new file mode 100644 index 00000000..b7be7617 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/ObservationDefinitionServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.administration.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.administration.domain.ObservationDefinition; +import com.openhis.administration.mapper.ObservationDefinitionMapper; +import com.openhis.administration.service.IObservationDefinitionService; + +/** + * 观测定义Service业务层处理 + * + * @author system + * @date 2025-09-23 + */ +@Service +public class ObservationDefinitionServiceImpl extends ServiceImpl implements IObservationDefinitionService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationServiceImpl.java index c0dbd63b..d77161fb 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationServiceImpl.java @@ -2,9 +2,8 @@ package com.openhis.administration.service.impl; import java.util.List; -import com.openhis.administration.domain.Practitioner; import com.openhis.administration.dto.OrgDataDto; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientIdentifierServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientIdentifierServiceImpl.java index 9bf7c345..12299c9c 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientIdentifierServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientIdentifierServiceImpl.java @@ -10,6 +10,8 @@ import com.openhis.administration.domain.PatientIdentifier; import com.openhis.administration.mapper.PatientIdentifierMapper; import com.openhis.administration.service.IPatientIdentifierService; +import java.util.List; + /** * 患者标识管理Service业务层处理 * @@ -29,12 +31,11 @@ public class PatientIdentifierServiceImpl extends ServiceImpl selectByPatientId(Long patientId) { // 构造查询条件 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(PatientIdentifier::getPatientId, patientId); - - return baseMapper.selectOne(queryWrapper); + return baseMapper.selectList(queryWrapper); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientStudentServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientStudentServiceImpl.java index f9e2033b..b9e01577 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientStudentServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PatientStudentServiceImpl.java @@ -12,7 +12,7 @@ import com.openhis.administration.domain.Patient; import com.openhis.administration.domain.PatientStudent; import com.openhis.administration.mapper.PatientStudentMapper; import com.openhis.administration.service.IPatientStudentService; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.PhysicalExamResult; /** diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerServiceImpl.java index cee113f0..08d54956 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/PractitionerServiceImpl.java @@ -2,7 +2,7 @@ package com.openhis.administration.service.impl; import java.util.List; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SpecimenDefinitionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SpecimenDefinitionServiceImpl.java new file mode 100644 index 00000000..bc550011 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SpecimenDefinitionServiceImpl.java @@ -0,0 +1,23 @@ +package com.openhis.administration.service.impl; + +import com.core.common.core.domain.R; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.administration.domain.SpecimenDefinition; +import com.openhis.administration.mapper.SpecimenDefinitionMapper; +import com.openhis.administration.service.ISpecimenDefinitionService; + +import javax.servlet.http.HttpServletRequest; + +/** + * 样本定义Service业务层处理 + * + * @author system + * @date 2025-09-05 + */ +@Service +public class SpecimenDefinitionServiceImpl extends ServiceImpl implements ISpecimenDefinitionService { + + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SupplierServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SupplierServiceImpl.java index 2a008d51..20a1ca3d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SupplierServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/SupplierServiceImpl.java @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.administration.domain.Supplier; import com.openhis.administration.mapper.SupplierMapper; import com.openhis.administration.service.ISupplierService; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.SupplierType; import com.openhis.common.enums.Whether; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/domain/AllergyIntolerance.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/domain/AllergyIntolerance.java index 4e98f4ed..bc1d2fdd 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/domain/AllergyIntolerance.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/domain/AllergyIntolerance.java @@ -71,7 +71,7 @@ public class AllergyIntolerance extends HisBaseEntity { private Date recordedDate; /** 最后反应发生日期 */ - private Date lastReactionOccurrence ; + private Date lastReactionOccurrence; /** 曝光路线 */ private String exposureRoute; @@ -82,4 +82,19 @@ public class AllergyIntolerance extends HisBaseEntity { /** 删除状态 */ private String deleteFlag; + /** + * 药品定义id + */ + private Long medicationId; + + /** + * 批次号 + */ + private String lotNumber; + + /** + * 就诊id + */ + private Long encounterId; + } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IAllergyIntoleranceService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IAllergyIntoleranceService.java index d0f44f58..40b8b014 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IAllergyIntoleranceService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IAllergyIntoleranceService.java @@ -1,7 +1,6 @@ package com.openhis.clinical.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.openhis.administration.domain.Encounter; import com.openhis.clinical.domain.AllergyIntolerance; /** @@ -12,19 +11,4 @@ import com.openhis.clinical.domain.AllergyIntolerance; */ public interface IAllergyIntoleranceService extends IService { - /** - * 更新或者保存过敏与不耐受 - * - * @param allergyIntolerance 过敏与不耐受实体 - */ - boolean saveOrUpdateAllergyIntolerance(AllergyIntolerance allergyIntolerance); - - /** - * 根据药品请求id,获取皮试结果 - * - * @param serviceRequestId 药品请求id - * @return 皮试结果 - */ - Integer getPsResultByRequestId(Long serviceRequestId); - } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IProcedureService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IProcedureService.java index 0e52a285..2ccf0b57 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IProcedureService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/IProcedureService.java @@ -36,14 +36,15 @@ public interface IProcedureService extends IService { * @param eventStatus 执行状态 * @param procedureCategory 执行种类 * @param locationId 执行位置 + * @param expectedDate 预计执行时间 * @param exeDate 执行时间 * @param groupId 组号 * @param refundId 取消执行id * @return 执行id */ Long addProcedureRecord(Long encounterId, Long patientId, Long requestId, String requestTable, - EventStatus eventStatus, ProcedureCategory procedureCategory, Long locationId, Date exeDate, Long groupId, - Long refundId); + EventStatus eventStatus, ProcedureCategory procedureCategory, Long locationId, Date expectedDate, Date exeDate, + Long groupId, Long refundId); /** * 添加药品执行记录 diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/AllergyIntoleranceServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/AllergyIntoleranceServiceImpl.java index 31160c16..e347ec70 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/AllergyIntoleranceServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/AllergyIntoleranceServiceImpl.java @@ -1,16 +1,11 @@ package com.openhis.clinical.service.impl; -import com.openhis.common.enums.ClinicalStatus; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.clinical.domain.AllergyIntolerance; import com.openhis.clinical.mapper.AllergyIntoleranceMapper; import com.openhis.clinical.service.IAllergyIntoleranceService; -import com.openhis.common.enums.VerificationStatus; -import com.openhis.workflow.mapper.ServiceRequestMapper; /** * 过敏与不耐受Service业务层处理 @@ -22,55 +17,4 @@ import com.openhis.workflow.mapper.ServiceRequestMapper; public class AllergyIntoleranceServiceImpl extends ServiceImpl implements IAllergyIntoleranceService { - @Autowired - ServiceRequestMapper serviceRequestMapper; - - /** - * 更新或者保存过敏与不耐受 - * - * @param allergyIntolerance 过敏与不耐受实体 - */ - @Override - public boolean saveOrUpdateAllergyIntolerance(AllergyIntolerance allergyIntolerance) { - - // 创建 LambdaQueryWrapper - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AllergyIntolerance::getId, allergyIntolerance.getId()).eq(AllergyIntolerance::getPatientId, - allergyIntolerance.getPatientId()); - - // 查询是否存在记录 - AllergyIntolerance existingEncounter = baseMapper.selectOne(queryWrapper); - if (existingEncounter != null) { - // 如果记录存在,更新记录 - allergyIntolerance.setId(existingEncounter.getId()); // 设置主键 - return baseMapper.updateById(allergyIntolerance) > 0; - } else { - // 如果记录不存在,插入新记录 - return baseMapper.insert(allergyIntolerance) > 0; - } - } - - /** - * 根据药品请求id,获取皮试结果 - * - * @param serviceRequestId 服务请求id - * @return 皮试结果 - */ - @Override - public Integer getPsResultByRequestId(Long serviceRequestId) { - - // 创建 LambdaQueryWrapper - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AllergyIntolerance::getRequestId, serviceRequestId) - // 皮试结果是已确认的 - .eq(AllergyIntolerance::getVerificationStatusEnum, VerificationStatus.CONFIRMED) - .eq(AllergyIntolerance::getDeleteFlag, '0'); - // 根据服务请求id,获取皮试结果 - AllergyIntolerance allergyIntolerance = baseMapper.selectOne(queryWrapper); - if (allergyIntolerance == null) { - //没查到默认返回 未知 - return ClinicalStatus.UNKNOWN.getValue(); - } - return allergyIntolerance.getVerificationStatusEnum(); - } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionDefinitionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionDefinitionServiceImpl.java index 4005a35e..c17ce9fc 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionDefinitionServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionDefinitionServiceImpl.java @@ -15,7 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.clinical.domain.ConditionDefinition; import com.openhis.clinical.mapper.ConditionDefinitionMapper; import com.openhis.clinical.service.IConditionDefinitionService; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.utils.HisQueryUtils; import lombok.AllArgsConstructor; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionServiceImpl.java index 32edaacb..f81d7a34 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ConditionServiceImpl.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.List; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ProcedureServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ProcedureServiceImpl.java index 65138da0..72fae0c3 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ProcedureServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/clinical/service/impl/ProcedureServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; import com.core.common.utils.DateUtils; import com.core.common.utils.SecurityUtils; import com.openhis.clinical.domain.Procedure; @@ -16,7 +17,6 @@ import com.openhis.clinical.mapper.ProcedureMapper; import com.openhis.clinical.service.IProcedurePerformerService; import com.openhis.clinical.service.IProcedureService; import com.openhis.common.constant.CommonConstants; -import com.openhis.common.enums.DelFlag; import com.openhis.common.enums.EventStatus; import com.openhis.common.enums.ProcedureCategory; import com.openhis.medication.domain.MedicationRequest; @@ -60,15 +60,16 @@ public class ProcedureServiceImpl extends ServiceImpl { + /** + * 根据病历ID、病人ID和体温单ID获取温度单信息 + * + * @param encounterId 病历ID + * @param patientId 病人ID + * @param tempId 体温单ID + * @param source 来源 + * @return 体温单信息 + */ + List getTempList(@Param("encounterId") Long encounterId, @Param("patientId") Long patientId, + @Param("tempId") Long tempId, @Param("source") String source); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/IDocInventoryItemStaticService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/IDocInventoryItemStaticService.java index 88066375..420f1f22 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/IDocInventoryItemStaticService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/IDocInventoryItemStaticService.java @@ -3,6 +3,8 @@ */ package com.openhis.document.service; +import java.util.List; + import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.document.domain.DocInventoryItemStatic; @@ -12,4 +14,15 @@ import com.openhis.document.domain.DocInventoryItemStatic; * @author zwh * @date 2025-11-04 */ -public interface IDocInventoryItemStaticService extends IService {} +public interface IDocInventoryItemStaticService extends IService { + + /** + * 获取物品的库存备份信息 + * + * @param itemIdList 物品id + * @param busNo 备份单据号 + * @param locationId 库房id + * @return 库存备份信息 + */ + List getInventoryItemStaticByItemId(List itemIdList, String busNo, Long locationId); +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/impl/DocInventoryItemStaticServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/impl/DocInventoryItemStaticServiceImpl.java index 33017c3a..4ba05066 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/impl/DocInventoryItemStaticServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/document/service/impl/DocInventoryItemStaticServiceImpl.java @@ -3,9 +3,13 @@ */ package com.openhis.document.service.impl; +import java.util.List; + import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; import com.openhis.document.domain.DocInventoryItemStatic; import com.openhis.document.mapper.DocInventoryItemStaticMapper; import com.openhis.document.service.IDocInventoryItemStaticService; @@ -18,4 +22,24 @@ import com.openhis.document.service.IDocInventoryItemStaticService; */ @Service public class DocInventoryItemStaticServiceImpl extends ServiceImpl - implements IDocInventoryItemStaticService {} + implements IDocInventoryItemStaticService { + + /** + * 根据物品id获取物品的库存备份信息 + * + * @param itemIdList 物品id + * @return 库存备份信息 + */ + @Override + public List getInventoryItemStaticByItemId(List itemIdList, String busNo, + Long locationId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (itemIdList != null && !itemIdList.isEmpty()) { + queryWrapper.in(DocInventoryItemStatic::getItemId, itemIdList); + } + queryWrapper.eq(DocInventoryItemStatic::getBusNo, busNo) + .eq(DocInventoryItemStatic::getDeleteFlag, DelFlag.NO.getCode()) + .eq(DocInventoryItemStatic::getLocationId, locationId).orderByDesc(DocInventoryItemStatic::getCreateTime); + return baseMapper.selectList(queryWrapper); + } +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/domain/ThreePartPayCallBack.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/domain/ThreePartPayCallBack.java index a6bd5ffc..2fc2b956 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/domain/ThreePartPayCallBack.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/domain/ThreePartPayCallBack.java @@ -3,6 +3,9 @@ package com.openhis.financial.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -11,15 +14,16 @@ import lombok.experimental.Accessors; import java.math.BigDecimal; /** - * 第三方支付回调实体(下方备注信息以中银支付为模板) + * 第三方支付回调实体(下方备注信息以中银支付为模板,其中会产生冗余字段或者重复字段,这些字段均以第三方平台返回内容为主) */ @Data @TableName("fin_three_part_pay_call_back") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) -public class ThreePartPayCallBack { +public class ThreePartPayCallBack extends HisBaseEntity { @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private BigDecimal id; /** @@ -130,15 +134,82 @@ public class ThreePartPayCallBack { /** * 付款主键ID */ + @JsonSerialize(using = ToStringSerializer.class) private Long paymentId; /** * 前台UI序号 */ - private Long index; + private Long payIndex; /** * 时间戳(中银建议) */ - private Long time; + private Long payTime; + + /** + * 交易日 + */ + private String settleDate; + /** + * 交易时间 + */ + private String settleTime; + /** + * 清算时间 + */ + private String clearDate; + /** + * 校验数据 + */ + private String secretKey; + /** + * 卡类型 + */ + private String cardType; + /** + * 第三方优惠说明 + */ + private String otherMsg; + /** + * 第三方平台 + */ + private String otherPlatform; + /** + * 支付方式 + */ + private String payMethod; + /** + * 查询结果 + */ + private String queryResult; + /** + * 查询结果 + */ + private String queryResultMsg; + /** + * 请求执行结果 + */ + private String executeResult; + /** + * 支付结果 + */ + private String payResult; + /** + * 卡号 + */ + private String accountNo; + /** + * 凭证号 + */ + private String receiptNo; + /** + * 错误信息 + */ + private String errMsg; + /** + * 批次号 + */ + private String lotNo; + } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/mapper/PaymentRecDetailMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/mapper/PaymentRecDetailMapper.java index e88abe59..e049d411 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/mapper/PaymentRecDetailMapper.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/mapper/PaymentRecDetailMapper.java @@ -24,5 +24,5 @@ public interface PaymentRecDetailMapper extends BaseMapper { * @param paymentIdList 集合 * @return 集合 */ - List getListByReconciliationIds(@Param("paymentIdList") List paymentIdList); + List getListByReconciliationIds(@Param("paymentIdList") List paymentIdList,@Param("kindEnum") Integer kindEnum); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/IPaymentRecDetailService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/IPaymentRecDetailService.java index 8be403be..0e87842e 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/IPaymentRecDetailService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/IPaymentRecDetailService.java @@ -29,6 +29,6 @@ public interface IPaymentRecDetailService extends IService { * @param paymentIdList 集合 * @return 集合 */ - List getListByReconciliationIds(List paymentIdList); + List getListByReconciliationIds(List paymentIdList,Integer kindEnum); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/ThreePartPayCallBackService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/ThreePartPayCallBackService.java index 35138711..f610febe 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/ThreePartPayCallBackService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/ThreePartPayCallBackService.java @@ -4,4 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.financial.domain.ThreePartPayCallBack; public interface ThreePartPayCallBackService extends IService { + + ThreePartPayCallBack getByPayment(Long paymentId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ContractServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ContractServiceImpl.java index b2ab9295..c6291f31 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ContractServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ContractServiceImpl.java @@ -14,7 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.core.common.core.redis.RedisCache; -import com.core.common.enums.DeleteFlag; +import com.core.common.enums.DelFlag; import com.core.common.utils.SecurityUtils; import com.openhis.common.constant.YbCommonConstants; import com.openhis.common.enums.Whether; @@ -56,7 +56,7 @@ public class ContractServiceImpl extends ServiceImpl i @Override public IPage getTenantContractPage(Integer tenantId, Integer pageNum, Integer pageSize) { return baseMapper.selectPage(new Page<>(pageNum, pageSize), new LambdaQueryWrapper() - .eq(Contract::getTenantId, tenantId).eq(Contract::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode())); + .eq(Contract::getTenantId, tenantId).eq(Contract::getDeleteFlag, DelFlag.NO.getCode())); } /** @@ -99,7 +99,7 @@ public class ContractServiceImpl extends ServiceImpl i @Override public void delTenantContract(Long id) { baseMapper.update(new Contract(), new LambdaUpdateWrapper().eq(Contract::getId, id) - .set(Contract::getDeleteFlag, DeleteFlag.DELETED.getCode())); + .set(Contract::getDeleteFlag, DelFlag.YES.getCode())); } /** diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentRecDetailServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentRecDetailServiceImpl.java index 3f2bf19a..c7af6273 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentRecDetailServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentRecDetailServiceImpl.java @@ -41,7 +41,7 @@ public class PaymentRecDetailServiceImpl extends ServiceImpl getListByReconciliationIds(List paymentIdList) { - return baseMapper.getListByReconciliationIds(paymentIdList); + public List getListByReconciliationIds(List paymentIdList,Integer kindEnum) { + return baseMapper.getListByReconciliationIds(paymentIdList,kindEnum); } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentReconciliationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentReconciliationServiceImpl.java index 21526634..68d64942 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentReconciliationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/PaymentReconciliationServiceImpl.java @@ -32,7 +32,7 @@ import com.openhis.administration.service.impl.PatientServiceImpl; import com.openhis.administration.service.impl.PatientStudentServiceImpl; import com.openhis.common.constant.CommonConstants; import com.openhis.common.constant.YbCommonConstants; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.ItemType; import com.openhis.common.enums.PaymentKind; import com.openhis.common.enums.PaymentStatus; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ThreePartPayCallBackServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ThreePartPayCallBackServiceImpl.java index c300feb2..58c9ca59 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ThreePartPayCallBackServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/financial/service/impl/ThreePartPayCallBackServiceImpl.java @@ -1,11 +1,22 @@ package com.openhis.financial.service.impl; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; +import com.openhis.common.constant.YbCommonConstants; import com.openhis.financial.domain.ThreePartPayCallBack; import com.openhis.financial.mapper.ThreePartPayCallBackMapper; import com.openhis.financial.service.ThreePartPayCallBackService; -import org.springframework.stereotype.Service; @Service -public class ThreePartPayCallBackServiceImpl extends ServiceImpl implements ThreePartPayCallBackService { +public class ThreePartPayCallBackServiceImpl extends ServiceImpl + implements ThreePartPayCallBackService { + @Override + public ThreePartPayCallBack getByPayment(Long paymentId) { + return baseMapper + .selectOne(new LambdaQueryWrapper().eq(ThreePartPayCallBack::getPaymentId, paymentId) + .eq(ThreePartPayCallBack::getDeleteFlag, DelFlag.NO.getCode()).last(YbCommonConstants.sqlConst.LIMIT1)); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefDeviceDef.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefDeviceDef.java new file mode 100644 index 00000000..1923feab --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefDeviceDef.java @@ -0,0 +1,61 @@ +package com.openhis.lab.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 耗材和设备定义Entity实体 + * + * @author system + * @date 2025-10-10 + */ +@Data +@TableName("lab_activity_def_device_def") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class ActivityDefDeviceDef extends HisBaseEntity { + + /** $column.columnComment */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 测试定义ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long activityDefinitionId; + + /** 耗材id */ + @JsonSerialize(using = ToStringSerializer.class) + private Long deviceDefinitionId; + + /** 耗材名称 */ + private String deviceDefinitionName; + + /** 仪器id */ + @JsonSerialize(using = ToStringSerializer.class) + private Long instrumentId; + + /** 仪器名称 */ + private String instrumentName; + + /** 耗材使用数量 */ + private Integer deviceQuantity; + + /** 删除状态 */ + private String deleteFlag; + + /** $column.columnComment */ + private String activityDefinitionName; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefObservationDef.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefObservationDef.java new file mode 100644 index 00000000..da73e551 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefObservationDef.java @@ -0,0 +1,55 @@ +package com.openhis.lab.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 观测指标定义Entity实体 + * + * @author system + * @date 2025-10-10 + */ +@Data +@TableName("lab_activity_def_observation_def") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class ActivityDefObservationDef extends HisBaseEntity { + + /** $column.columnComment */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Integer id; + + /** 活动定义ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long activityDefinitionId; + + /** 活动名称 */ + private String activityDefinitionName; + + /** 观测定义ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long observationDefinitionId; + + /** 观测指标名称(如ALT、AST等) */ + private String observationName; + + + /** 观测编码(如ALT、AST等) */ + private String observationCode; + + /** 删除状态 */ + private String deleteFlag; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefSpecimenDef.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefSpecimenDef.java new file mode 100644 index 00000000..87a91efa --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/ActivityDefSpecimenDef.java @@ -0,0 +1,59 @@ +package com.openhis.lab.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 样本定义Entity实体 + * + * @author system + * @date 2025-10-10 + */ +@Data +@TableName("lab_activity_def_specimen_def") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class ActivityDefSpecimenDef extends HisBaseEntity { + + /** $column.columnComment */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Integer id; + + /** 测试定义ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long activityDefinitionId; + + /** $column.columnComment */ + private String activityDefinitionName; + + /** 测试定义ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long specimenDefinitionId; + + /** 样本量 */ + private Integer specimenVolume; + /** 样本名称 */ + private String specimenName; + + /** 样本量单位 */ + private String specimenUnit; + + /** 采样方法 */ + private String samplingMethod; + + /** 删除状态,N为未删除,Y为已删除 */ + private String deleteFlag; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Observation.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Observation.java new file mode 100644 index 00000000..1615ca4f --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Observation.java @@ -0,0 +1,60 @@ +package com.openhis.lab.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import com.core.common.core.domain.HisBaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 【请填写功能名称】Entity实体 + * + * @author system + * @date 2025-10-10 + */ +@Data +@TableName("lab_observation") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class Observation extends HisBaseEntity { + + /** 观察记录的唯一标识符 */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 患者ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long patientId; + + /** 就诊ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long encounterId; + + /** 关联的样本ID */ + private Long specimenId; + + /** 观察定义ID */ + private Long observationDefinitionId; + + /** 观察结果,可能是文本描述或数值 */ + private String observationResult; + + /** 观察的日期和时间 */ + private Date observationDate; + + /** 执行观察的技术员ID */ + private Long technicianId; + + /** 删除状态,默认为未删除 */ + private String deleteFlag; + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Specimen.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Specimen.java new file mode 100644 index 00000000..67140179 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/domain/Specimen.java @@ -0,0 +1,68 @@ +package com.openhis.lab.domain; + +import java.math.BigDecimal; +import java.util.Date; + + +import com.baomidou.mybatisplus.annotation.*; +import com.core.common.core.domain.HisBaseEntity; + + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 【请填写功能名称】Entity实体 + * + * @author system + * @date 2025-10-10 + */ +@Data +@TableName("lab_specimen") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class Specimen extends HisBaseEntity { + + /** 样本的唯一标识符 */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 与该样本相关的患者ID */ + private Long patientId; + + /** 与该样本相关的ENCounterID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long encounterId; + + /** 与该样本相关的申请服务id */ + @JsonSerialize(using = ToStringSerializer.class) + private Long serviceId; + + /** 样本定义ID,对应 adm_specimen_definition 表的 id */ + private Long specimenDefinitionId; + + @TableField(updateStrategy = FieldStrategy.IGNORED) + /* 样本的采集日期和时间 */ + private Date collectionDate; + +// private String chargeName; // 项目名称 +// private String specimenName; // 样本名称 +// private String doctorName; // 开单医生 + + private Integer specimenVolume; //样本量 + private String specimenUnit; //样本单位 + + /** 样本接收日期 */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date receivedDate; + + /** 采集状态,默认为待采集 */ + private Integer collectionStatusEnum; + + + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefDeviceDefMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefDeviceDefMapper.java new file mode 100644 index 00000000..e9139bbe --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefDeviceDefMapper.java @@ -0,0 +1,17 @@ +package com.openhis.lab.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.lab.domain.ActivityDefDeviceDef; + +/** + * 耗材和设备定义Mapper接口 + * + * @author system + * @date 2025-10-10 + */ +@Repository +public interface ActivityDefDeviceDefMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefObservationDefMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefObservationDefMapper.java new file mode 100644 index 00000000..01317de9 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefObservationDefMapper.java @@ -0,0 +1,17 @@ +package com.openhis.lab.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.lab.domain.ActivityDefObservationDef; + +/** + * 观测指标定义Mapper接口 + * + * @author system + * @date 2025-10-10 + */ +@Repository +public interface ActivityDefObservationDefMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefSpecimenDefMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefSpecimenDefMapper.java new file mode 100644 index 00000000..382603ac --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ActivityDefSpecimenDefMapper.java @@ -0,0 +1,17 @@ +package com.openhis.lab.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.lab.domain.ActivityDefSpecimenDef; + +/** + * 样本定义Mapper接口 + * + * @author system + * @date 2025-10-10 + */ +@Repository +public interface ActivityDefSpecimenDefMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ObservationMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ObservationMapper.java new file mode 100644 index 00000000..42537c24 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/ObservationMapper.java @@ -0,0 +1,17 @@ +package com.openhis.lab.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.lab.domain.Observation; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author system + * @date 2025-10-10 + */ +@Repository +public interface ObservationMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java new file mode 100644 index 00000000..5d37bd94 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/mapper/SpecimenMapper.java @@ -0,0 +1,18 @@ +package com.openhis.lab.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.lab.domain.Specimen; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author system + * @date 2025-10-10 + */ +@Mapper +public interface SpecimenMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefDeviceDefService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefDeviceDefService.java new file mode 100644 index 00000000..5f349b4e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefDeviceDefService.java @@ -0,0 +1,14 @@ +package com.openhis.lab.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.lab.domain.ActivityDefDeviceDef; + +/** + * 耗材和设备定义Service接口 + * + * @author system + * @date 2025-10-10 + */ +public interface IActivityDefDeviceDefService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefObservationDefService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefObservationDefService.java new file mode 100644 index 00000000..76e140a9 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefObservationDefService.java @@ -0,0 +1,14 @@ +package com.openhis.lab.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.lab.domain.ActivityDefObservationDef; + +/** + * 观测指标定义Service接口 + * + * @author system + * @date 2025-10-10 + */ +public interface IActivityDefObservationDefService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefSpecimenDefService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefSpecimenDefService.java new file mode 100644 index 00000000..d5aee671 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IActivityDefSpecimenDefService.java @@ -0,0 +1,14 @@ +package com.openhis.lab.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.lab.domain.ActivityDefSpecimenDef; + +/** + * 样本定义Service接口 + * + * @author system + * @date 2025-10-10 + */ +public interface IActivityDefSpecimenDefService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IObservationService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IObservationService.java new file mode 100644 index 00000000..1fe4b354 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/IObservationService.java @@ -0,0 +1,14 @@ +package com.openhis.lab.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.lab.domain.Observation; + +/** + * 【请填写功能名称】Service接口 + * + * @author system + * @date 2025-10-10 + */ +public interface IObservationService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/ISpecimenService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/ISpecimenService.java new file mode 100644 index 00000000..4dc18b2e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/ISpecimenService.java @@ -0,0 +1,14 @@ +package com.openhis.lab.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.lab.domain.Specimen; + +/** + * Service接口 + * + * @author system + * @date 2025-10-10 + */ +public interface ISpecimenService extends IService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefDeviceDefServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefDeviceDefServiceImpl.java new file mode 100644 index 00000000..2f952ca0 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefDeviceDefServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.lab.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.lab.domain.ActivityDefDeviceDef; +import com.openhis.lab.mapper.ActivityDefDeviceDefMapper; +import com.openhis.lab.service.IActivityDefDeviceDefService; + +/** + * 耗材和设备定义Service业务层处理 + * + * @author system + * @date 2025-10-10 + */ +@Service +public class ActivityDefDeviceDefServiceImpl extends ServiceImpl implements IActivityDefDeviceDefService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefObservationDefServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefObservationDefServiceImpl.java new file mode 100644 index 00000000..12082ea9 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefObservationDefServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.lab.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.lab.domain.ActivityDefObservationDef; +import com.openhis.lab.mapper.ActivityDefObservationDefMapper; +import com.openhis.lab.service.IActivityDefObservationDefService; + +/** + * 观测指标定义Service业务层处理 + * + * @author system + * @date 2025-10-10 + */ +@Service +public class ActivityDefObservationDefServiceImpl extends ServiceImpl implements IActivityDefObservationDefService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefSpecimenDefServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefSpecimenDefServiceImpl.java new file mode 100644 index 00000000..800babf9 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ActivityDefSpecimenDefServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.lab.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.lab.domain.ActivityDefSpecimenDef; +import com.openhis.lab.mapper.ActivityDefSpecimenDefMapper; +import com.openhis.lab.service.IActivityDefSpecimenDefService; + +/** + * 样本定义Service业务层处理 + * + * @author system + * @date 2025-10-10 + */ +@Service +public class ActivityDefSpecimenDefServiceImpl extends ServiceImpl implements IActivityDefSpecimenDefService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ObservationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ObservationServiceImpl.java new file mode 100644 index 00000000..02ae1898 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/ObservationServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.lab.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.lab.domain.Observation; +import com.openhis.lab.mapper.ObservationMapper; +import com.openhis.lab.service.IObservationService; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author system + * @date 2025-10-10 + */ +@Service +public class ObservationServiceImpl extends ServiceImpl implements IObservationService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/SpecimenServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/SpecimenServiceImpl.java new file mode 100644 index 00000000..2133b755 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/lab/service/impl/SpecimenServiceImpl.java @@ -0,0 +1,19 @@ +package com.openhis.lab.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.lab.domain.Specimen; +import com.openhis.lab.mapper.SpecimenMapper; +import com.openhis.lab.service.ISpecimenService; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author system + * @date 2025-10-10 + */ +@Service +public class SpecimenServiceImpl extends ServiceImpl implements ISpecimenService { + +} \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationDispenseServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationDispenseServiceImpl.java index c080d451..80b76fca 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationDispenseServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationDispenseServiceImpl.java @@ -17,7 +17,7 @@ import com.core.common.utils.AssignSeqUtil; import com.core.common.utils.DateUtils; import com.openhis.common.enums.AssignSeqEnum; import com.openhis.common.enums.DbOpType; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.DispenseStatus; import com.openhis.medication.domain.MedicationDispense; import com.openhis.medication.domain.MedicationRequest; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationRequestServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationRequestServiceImpl.java index 1930ba28..354158d2 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationRequestServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationRequestServiceImpl.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.RequestStatus; import com.openhis.medication.domain.MedicationRequest; import com.openhis.medication.mapper.MedicationRequestMapper; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationServiceImpl.java index e8516f81..a4fcbecc 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/medication/service/impl/MedicationServiceImpl.java @@ -2,8 +2,6 @@ package com.openhis.medication.service.impl; import java.util.List; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.openhis.medication.dto.AdjustPriceMedListDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,7 +10,7 @@ import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.core.common.utils.bean.BeanUtils; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.medication.domain.Medication; import com.openhis.medication.domain.MedicationDetail; import com.openhis.medication.mapper.MedicationMapper; @@ -46,7 +44,7 @@ public class MedicationServiceImpl extends ServiceImpl() - .eq(Medication::getDeleteFlag, DelFlag.NO.getValue()).in(Medication::getId, medicationIdList)); + .eq(Medication::getDeleteFlag, DelFlag.NO.getCode()).in(Medication::getId, medicationIdList)); } return null; } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/nenu/service/impl/GfRatioServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/nenu/service/impl/GfRatioServiceImpl.java index 7628cc7d..7e8afa41 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/nenu/service/impl/GfRatioServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/nenu/service/impl/GfRatioServiceImpl.java @@ -12,8 +12,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.core.common.enums.DeleteFlag; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.GfRatioType; import com.openhis.common.enums.ItemType; import com.openhis.common.enums.ybenums.YbChrgitmLv; @@ -87,7 +86,7 @@ public class GfRatioServiceImpl extends ServiceImpl impl // 查询DB中的所有大项比例 List gfRatioList = this.list(new LambdaQueryWrapper().eq(GfRatio::getRatioType, GfRatioType.TYPE_RATIO.getValue()) - .eq(GfRatio::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode())); + .eq(GfRatio::getDeleteFlag, DelFlag.NO.getCode())); // 做成医保分项+医保等级拼接的Map Map gfRatioMap = gfRatioList.stream().collect(Collectors.toMap(e -> e.getYbClass() + e.getYbLv(), Function.identity())); diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/EncounterAutoRoll.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/EncounterAutoRoll.java new file mode 100644 index 00000000..41124047 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/EncounterAutoRoll.java @@ -0,0 +1,58 @@ +package com.openhis.template.domain; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.core.common.core.domain.HisBaseEntity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 住院就诊滚方绑定 + */ +@Data +@TableName("tmp_encounter_auto_roll") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class EncounterAutoRoll extends HisBaseEntity { + + /** ID */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 状态 */ + private Integer statusEnum; + + /** + * 就诊id + */ + private Long encounterId; + + /** + * 实例表名 + */ + private String instanceTable; + + /** + * 实例id + */ + private Long instanceId; + + /** 数量 */ + private BigDecimal quantity; + + /** + * 参与者id + */ + private Long practitionerId; + + /** + * 参与者科室id + */ + private Long organizationId; + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/mapper/EncounterAutoRollMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/mapper/EncounterAutoRollMapper.java new file mode 100644 index 00000000..ab6533db --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/mapper/EncounterAutoRollMapper.java @@ -0,0 +1,18 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.template.mapper; + +import org.springframework.stereotype.Repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.template.domain.EncounterAutoRoll; + +/** + * 住院就诊滚方绑定 + * + * @author zwh + * @date 2025-04-09 + */ +@Repository +public interface EncounterAutoRollMapper extends BaseMapper {} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/IEncounterAutoRollService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/IEncounterAutoRollService.java new file mode 100644 index 00000000..8ad69e2b --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/IEncounterAutoRollService.java @@ -0,0 +1,15 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.template.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.template.domain.EncounterAutoRoll; + +/** + * 住院就诊滚方绑定 + * + * @author zwh + * @date 2025-04-09 + */ +public interface IEncounterAutoRollService extends IService {} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/impl/EncounterAutoRollServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/impl/EncounterAutoRollServiceImpl.java new file mode 100644 index 00000000..d98a5cb2 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/service/impl/EncounterAutoRollServiceImpl.java @@ -0,0 +1,21 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.template.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.template.domain.EncounterAutoRoll; +import com.openhis.template.mapper.EncounterAutoRollMapper; +import com.openhis.template.service.IEncounterAutoRollService; + +/** + * 住院就诊滚方绑定 + * + * @author zwh + * @date 2025-04-09 + */ +@Service +public class EncounterAutoRollServiceImpl extends ServiceImpl + implements IEncounterAutoRollService {} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IActivityDefinitionService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IActivityDefinitionService.java index 1203ba68..7522931f 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IActivityDefinitionService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IActivityDefinitionService.java @@ -43,18 +43,40 @@ public interface IActivityDefinitionService extends IService /** * Desc: 根据 项目id数组 加载 诊疗数据集合 + * * @param itemIds * @Author raymond * @Date 12:20 2025/10/18 * @return java.util.List **/ List searchActivityDefinitionByIds(@Param("itemIds") List itemIds); + /** * Desc: 根据关键字查询 如果关键字为空,查询10条,否则返回查询到的所有 + * * @param keyWord * @Author raymond * @Date 07:53 2025/10/22 * @return java.util.List **/ List searchActivityListByKeyWord(String keyWord); + + /** + * 查询某一类的服务 + * + * @param productIdList id集合 + * @param activityDefCategory 类型 + * @return 查询结果 + */ + List getListByIds(List productIdList, Integer activityDefCategory); + + /** + * 查询某一类的服务 + * + * @param productIdList id集合 + * @param typeEnum 类型 + * @return 查询结果 + */ + List getListByTypeEnum(List productIdList, Integer typeEnum); + } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IDeviceDispenseService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IDeviceDispenseService.java index 7a9e9591..ec00b12a 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IDeviceDispenseService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IDeviceDispenseService.java @@ -6,6 +6,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.administration.domain.Practitioner; +import com.openhis.medication.domain.MedicationDispense; import com.openhis.workflow.domain.DeviceDispense; import com.openhis.workflow.domain.DeviceRequest; @@ -128,4 +129,12 @@ public interface IDeviceDispenseService extends IService { * @param medDispenseId 发放id列表 */ void updateDispenseStatusSummarized(List medDispenseId, String busNo); + + /** + * 通过请求id获取耗材发放信息 + * + * @param requestIdList 请求id + * @return 发放信息 + */ + List selectByRequestIdList(List requestIdList); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IServiceRequestService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IServiceRequestService.java index 9f5cb880..594e54c3 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IServiceRequestService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/IServiceRequestService.java @@ -118,4 +118,12 @@ public interface IServiceRequestService extends IService { * @return 请求信息列表 */ List getServiceRequestByActivityId(Long activityId); + + /** + * 查询诊疗对应的服务申请 + * + * @param encounterId 就诊id + * @return 请求信息列表 + */ + List getServiceRequestListByEncounterId(Long encounterId); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ActivityDefinitionServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ActivityDefinitionServiceImpl.java index ab9f0410..88fa52de 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ActivityDefinitionServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ActivityDefinitionServiceImpl.java @@ -2,15 +2,16 @@ package com.openhis.workflow.service.impl; import java.util.List; -import com.openhis.medication.dto.AdjustPriceMedListDto; -import com.openhis.workflow.dto.ActivityDto; +import com.core.common.enums.DelFlag; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.common.enums.PublicationStatus; +import com.openhis.medication.dto.AdjustPriceMedListDto; import com.openhis.workflow.domain.ActivityDefinition; +import com.openhis.workflow.dto.ActivityDto; import com.openhis.workflow.mapper.ActivityDefinitionMapper; import com.openhis.workflow.service.IActivityDefinitionService; @@ -80,4 +81,25 @@ public class ActivityDefinitionServiceImpl extends ServiceImpl getListByIds(List productIdList, Integer activityDefCategory) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (activityDefCategory != null) { + queryWrapper.eq(ActivityDefinition::getCategoryCode, activityDefCategory); + } + queryWrapper.in(ActivityDefinition::getId, productIdList).eq(ActivityDefinition::getDeleteFlag, + DelFlag.NO.getCode()); + return baseMapper.selectList(queryWrapper); + } + + @Override + public List getListByTypeEnum(List productIdList, Integer typeEnum) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (typeEnum != null) { + queryWrapper.eq(ActivityDefinition::getTypeEnum, typeEnum); + } + queryWrapper.in(ActivityDefinition::getId, productIdList).eq(ActivityDefinition::getDeleteFlag, + DelFlag.NO.getCode()); + return baseMapper.selectList(queryWrapper); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceDispenseServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceDispenseServiceImpl.java index c56436e9..e786959d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceDispenseServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceDispenseServiceImpl.java @@ -13,11 +13,11 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; import com.core.common.utils.AssignSeqUtil; import com.openhis.administration.domain.Practitioner; import com.openhis.common.enums.AssignSeqEnum; import com.openhis.common.enums.DbOpType; -import com.openhis.common.enums.DelFlag; import com.openhis.common.enums.DispenseStatus; import com.openhis.workflow.domain.DeviceDispense; import com.openhis.workflow.domain.DeviceRequest; @@ -335,4 +335,16 @@ public class DeviceDispenseServiceImpl extends ServiceImpl selectByRequestIdList(List requestIdList) { + return baseMapper.selectList(new LambdaQueryWrapper() + .in(DeviceDispense::getDeviceReqId, requestIdList).eq(DeviceDispense::getDeleteFlag, DelFlag.NO.getCode())); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceRequestServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceRequestServiceImpl.java index 2405b0fd..3d697395 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceRequestServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/DeviceRequestServiceImpl.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.administration.domain.Practitioner; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.RequestStatus; import com.openhis.workflow.domain.DeviceRequest; import com.openhis.workflow.mapper.DeviceRequestMapper; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/InventoryItemServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/InventoryItemServiceImpl.java index 17b4dc15..13919c7f 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/InventoryItemServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/InventoryItemServiceImpl.java @@ -3,18 +3,16 @@ package com.openhis.workflow.service.impl; import java.math.BigDecimal; import java.util.Date; import java.util.List; -import java.util.Set; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.openhis.workflow.dto.AdjustPriceDto; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.PublicationStatus; import com.openhis.workflow.domain.InventoryItem; +import com.openhis.workflow.dto.AdjustPriceDto; import com.openhis.workflow.mapper.InventoryItemMapper; import com.openhis.workflow.service.IInventoryItemService; @@ -70,7 +68,7 @@ public class InventoryItemServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper() .eq(InventoryItem::getItemId, itemId).eq(InventoryItem::getLotNumber, lotNumber) - .eq(InventoryItem::getTenantId, tenantId).eq(InventoryItem::getDeleteFlag, DelFlag.NO.getValue()) + .eq(InventoryItem::getTenantId, tenantId).eq(InventoryItem::getDeleteFlag, DelFlag.NO.getCode()) .eq(InventoryItem::getInventoryStatusEnum, PublicationStatus.ACTIVE.getValue()); if (locationId != null) { queryWrapper.eq(InventoryItem::getLocationId, locationId); @@ -90,7 +88,7 @@ public class InventoryItemServiceImpl extends ServiceImpl selectInventoryByItemIdList(List itemIdList, Integer tenantId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().in(InventoryItem::getItemId, itemIdList) - .eq(InventoryItem::getTenantId, tenantId).eq(InventoryItem::getDeleteFlag, DelFlag.NO.getValue()) + .eq(InventoryItem::getTenantId, tenantId).eq(InventoryItem::getDeleteFlag, DelFlag.NO.getCode()) .eq(InventoryItem::getInventoryStatusEnum, PublicationStatus.ACTIVE.getValue()); // 查询取库房信息 return baseMapper.selectList(queryWrapper); @@ -104,7 +102,7 @@ public class InventoryItemServiceImpl extends ServiceImpl selectAllInventory() { LambdaQueryWrapper queryWrapper = - new LambdaQueryWrapper().eq(InventoryItem::getDeleteFlag, DelFlag.NO.getValue()); + new LambdaQueryWrapper().eq(InventoryItem::getDeleteFlag, DelFlag.NO.getCode()); // 查询取库房信息 return baseMapper.selectList(queryWrapper); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ServiceRequestServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ServiceRequestServiceImpl.java index ddfe71b4..763508f6 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ServiceRequestServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/ServiceRequestServiceImpl.java @@ -13,7 +13,7 @@ import com.core.common.utils.DateUtils; import com.core.common.utils.SecurityUtils; import com.openhis.administration.domain.Practitioner; import com.openhis.common.constant.CommonConstants; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.RequestStatus; import com.openhis.workflow.domain.ServiceRequest; import com.openhis.workflow.mapper.ServiceRequestMapper; @@ -225,4 +225,15 @@ public class ServiceRequestServiceImpl extends ServiceImpl() .eq(ServiceRequest::getActivityId, activityId).eq(ServiceRequest::getDeleteFlag, DelFlag.NO.getCode())); } + + /** + * 获取执行过的诊疗数据 + * + * @param encounterId ID + */ + @Override + public List getServiceRequestListByEncounterId(Long encounterId) { + return baseMapper.selectList(new LambdaQueryWrapper() + .eq(ServiceRequest::getEncounterId, encounterId).eq(ServiceRequest::getDeleteFlag, DelFlag.NO.getCode())); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/SupplyDeliveryServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/SupplyDeliveryServiceImpl.java index 8bc99799..d6f72880 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/SupplyDeliveryServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/workflow/service/impl/SupplyDeliveryServiceImpl.java @@ -13,7 +13,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.core.common.utils.DateUtils; import com.core.common.utils.SecurityUtils; import com.openhis.common.constant.CommonConstants; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.common.enums.DispenseStatus; import com.openhis.common.enums.SupplyType; import com.openhis.workflow.domain.SupplyDelivery; @@ -159,7 +159,7 @@ public class SupplyDeliveryServiceImpl extends ServiceImpl yb2402InputInpatientDiseInfo; + List diseinfo; /** * 出院信息 */ - Yb2402InputInpatientDscgInfo yb2402InputInpatientDscgInfo; + Yb2402InputInpatientDscgInfo dscginfo; } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2404InputInpatient.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2404InputInpatient.java index b018a616..e847b5a3 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2404InputInpatient.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2404InputInpatient.java @@ -33,4 +33,10 @@ public class Yb2404InputInpatient { */ @JSONField(name = "exp_content") private String expContent; + + /** + * 字段扩展 + */ + @JSONField(name = "insuplc_admdvs") + private String insuplcAdmdvs; } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2601InputParam.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2601InputParam.java new file mode 100644 index 00000000..0a31001c --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb2601InputParam.java @@ -0,0 +1,20 @@ +package com.openhis.yb.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +@Data +public class Yb2601InputParam { + + @JSONField(name = "psn_no") + private String psnNo; + + @JSONField(name = "oinfno") + private String oinfno; + + @JSONField(name = "omsgid") + private String omsgid; + + @JSONField(name = "insuplc_admdvs") + private String insuplcAdmdvs; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputData.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputData.java new file mode 100644 index 00000000..9d789a2d --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputData.java @@ -0,0 +1,46 @@ +package com.openhis.yb.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class Yb4101AInputData { + + /** + * 结算清单信息 + */ + Yb4101AInputSetlinfo setlinfo; + + /** + * 门诊慢特病诊断信息 + */ + List opspdiseinfo; + + /** + * 住院诊断信息 + */ + List diseinfo; + + /** + * 手术操作信息 + */ + List oprninfo; + + /** + * 住院ICU信息 + */ + List icuinfo; + + /** + * 住院血Press信息 + */ + List bldinfo; + + /** + * 住院项目信息 + */ + List iteminfo; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputIteminfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputIteminfo.java new file mode 100644 index 00000000..ca55bb30 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputIteminfo.java @@ -0,0 +1,61 @@ +package com.openhis.yb.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + +/** + * 【4101A】收费项目信息(节点标识:iteminfo) + * + * @author Thanking + */ +@Data +@Accessors(chain = true) +public class Yb4101AInputIteminfo { + + /** + * 医疗收费项目 + */ + @NotBlank + @Length(max = 6) + @JSONField(name = "med_chrgitm") + private String medChrgitm; + + /** + * 金额 + */ + @NotBlank + @JSONField(name = "amt") + private String amt; + + /** + * 甲类费用合计 + */ + @JSONField(name = "claa_sumfee") + private String claaSumfee; + + /** + * 乙类金额 + */ + @JSONField(name = "clab_amt") + private Date clabAmt; + + /** + * 全自费金额 + */ + @Length(max = 6) + @JSONField(name = "fulamt_ownpay_amt") + private String fulamtOwnpayAmt; + + /** + * 其他金额 + */ + @JSONField(name = "oth_amt") + private String othAmt; + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputOprninfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputOprninfo.java index 0701ae4b..c988e688 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputOprninfo.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101AInputOprninfo.java @@ -45,6 +45,13 @@ public class Yb4101AInputOprninfo { @JSONField(name = "oprn_oprt_code") private String oprnOprtCode; + /** + * 手术操作代码 + */ + @JSONField(name = "oprn_oprt_begntime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date oprnOprtDate; + /** * 麻醉方式:参照麻醉-方法代码 */ diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputData.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputData.java new file mode 100644 index 00000000..6a652c7c --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputData.java @@ -0,0 +1,46 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class Yb4101InputData { + + /** + * 住院结算信息 + */ + Yb4101InputSetlinfo setlinfo; + + /** + * 重症监护信息 + */ + List icuinfo; + + /** + * 手术操作信息 + */ + List oprninfo; + + /** + * 收费项目信息 + */ + List iteminfo; + + /** + * 住院诊断信息 + */ + List diseinfo; + + /** + * 门诊慢特病诊断信息 + */ + List opspdiseinfo; + + /** + * 基金支付信息 + */ + List payinfo; + + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputDiseinfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputDiseinfo.java new file mode 100644 index 00000000..881ba38b --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputDiseinfo.java @@ -0,0 +1,21 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +@Data +public class Yb4101InputDiseinfo { + /** 诊断类别 */ + private String diagType; + + /** 诊断代码 */ + private String diagCode; + + /** 诊断名称 */ + private String diagName; + + /** 入院病情类型 */ + private String admCondType; + + /** 主诊断标志 */ + private String maindiagFlag; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIcuinfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIcuinfo.java new file mode 100644 index 00000000..a01fcc7d --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIcuinfo.java @@ -0,0 +1,22 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.util.Date; + +@Data +public class Yb4101InputIcuinfo { + + /** 重症监护病房类型 */ + private String scsCutdWardType; + + /** 重症监护进入时间 */ + private Date scsCutdInpoolTime; + + /** 重症监护退出时间 */ + private Date scsCutdExitTime; + + /** 重症监护合计时长 - 格式:天数/小时数/分钟数,例:1/13/24 */ + private String scsCutdSumDura; + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIteminfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIteminfo.java new file mode 100644 index 00000000..92f69c13 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputIteminfo.java @@ -0,0 +1,24 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class Yb4101InputIteminfo { + + /** 医疗收费项目 - 参照医疗收费项目类别 */ + private String medChrgitm; + + /** 金额 */ + private BigDecimal amt; + + /** 甲类费用合计 */ + private BigDecimal claaSumfee; + + /** 乙类金额 */ + private BigDecimal clabAmt; + + /** 全自费金额 */ + private BigDecimal fulamtOwnpayAmt; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOprninfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOprninfo.java new file mode 100644 index 00000000..d9bdbc8b --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOprninfo.java @@ -0,0 +1,37 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.util.Date; + +@Data +public class Yb4101InputOprninfo { + + /** 手术操作类别 */ + private String oprnOprtType; + + /** 手术操作名称 */ + private String oprnOprtName; + + /** 手术操作代码 */ + private String oprnOprtCode; + + /** 手术操作日期 */ + private Date oprnOprtDate; + + /** 麻醉方式 - 参照麻醉-方法代码 */ + private String anstWay; + + /** 术者医师姓名 */ + private String operDrName; + + /** 术者医师代码 */ + private String operDrCode; + + /** 麻醉医师姓名 */ + private String anstDrName; + + /** 麻醉医师代码 */ + private String anstDrCode; + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOpspdiseinfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOpspdiseinfo.java new file mode 100644 index 00000000..7b8a6230 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputOpspdiseinfo.java @@ -0,0 +1,22 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +@Data +public class Yb4101InputOpspdiseinfo { + + /** 诊断名称 - 与结算时慢特病种保持一致 */ + private String diagName; + + /** 诊断代码 - 与结算时慢特病种保持一致 */ + private String diagCode; + + /** 手术操作名称 */ + private String oprnOprtName; + + /** 手术操作代码 */ + private String oprnOprtCode; + + /** 主诊断标志 */ + private String maindiagFlag; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputPayinfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputPayinfo.java new file mode 100644 index 00000000..0e04650f --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputPayinfo.java @@ -0,0 +1,17 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class Yb4101InputPayinfo { + /** + * 基金支付类别 + */ + private String fundPayType; + /** + * 基金支付金额 + */ + private BigDecimal fundPayamt; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputSetlinfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputSetlinfo.java new file mode 100644 index 00000000..56543d71 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4101InputSetlinfo.java @@ -0,0 +1,256 @@ +package com.openhis.yb.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class Yb4101InputSetlinfo { + + /** 就诊ID */ + private String mdtrtId; + + /** 结算ID */ + private String setlId; + + /** 定点医药机构名称 */ + private String fixmedinsName; + + /** 定点医药机构编号 */ + private String fixmedinsCode; + + /** 医保结算等级 */ + private String hiSetlLv; + + /** 医保编号 */ + private String hiNo; + + /** 病案号 */ + private String medcasno; + + /** 申报时间 */ + private Date dclaTime; + + /** 人员姓名 */ + private String psnName; + + /** 性别 */ + private String gend; + + /** 出生日期 */ + private Date brdy; + + /** 年龄 */ + private BigDecimal age; + + /** 国籍 */ + private String ntly; + + /** (年龄不足1周岁)年龄 */ + private Integer nwbAge; + + /** 民族 */ + private String naty; + + /** 患者证件类别 */ + private String patnCertType; + + /** 证件号码 */ + private String certno; + + /** 职业 */ + private String prfs; + + /** 现住址 */ + private String currAddr; + + /** 单位名称 */ + private String empName; + + /** 单位地址 */ + private String empAddr; + + /** 单位电话 */ + private String empTel; + + /** 邮编 */ + private String poscode; + + /** 联系人姓名 */ + private String conerName; + + /** 与患者关系 */ + private String patnRlts; + + /** 联系人地址 */ + private String conerAddr; + + /** 联系人电话 */ + private String conerTel; + + /** 医保类型 */ + private String hiType; + + /** 参保地 */ + private String insuplc; + + /** 特殊人员类型 */ + private String spPsnType; + + /** 新生儿入院类型 */ + private String nwbAdmType; + + /** 新生儿出生体重 */ + private BigDecimal nwbBirWt; + + /** 新生儿入院体重 */ + private BigDecimal nwbAdmWt; + + /** 门诊慢特病诊断科别 */ + private String opspDiagCaty; + + /** 门诊慢特病就诊日期 */ + private Date opspMdtrtDate; + + /** 住院医疗类型 */ + private String iptMedType; + + /** 入院途径 */ + private String admWay; + + /** 治疗类别 */ + private String trtType; + + /** 入院时间 */ + private Date admTime; + + /** 入院科别 */ + private String admCaty; + + /** 转科科别 */ + private String refldeptDept; + + /** 出院时间 */ + private Date dscgTime; + + /** 出院科别 */ + private String dscgCaty; + + /** 实际住院天数 */ + private Integer actIptDays; + + /** 门(急)诊西医诊断 */ + private String otpWmDise; + + /** 西医诊断疾病代码 */ + private String wmDiseCode; + + /** 门(急)诊中医诊断 */ + private String otpTcmDise; + + /** 中医诊断代码 */ + private String tcmDiseCode; + + /** 诊断代码计数 */ + private Integer diagCodeCnt; + + /** 主诊断标志 */ + private String maindiagFlag; + + /** 手术操作代码计数 */ + private Integer oprnOprtCodeCnt; + + /** 呼吸机使用时长 */ + private String ventUsedDura; + + /** 颅脑损伤患者入院前昏迷时长 */ + private String pwcryBfadmComaDura; + + /** 颅脑损伤患者入院后昏迷时长 */ + private String pwcryAfadmComaDura; + + /** 输血品种 */ + private String bldCat; + + /** 输血量 */ + private BigDecimal bldAmt; + + /** 输血计量单位 */ + private String bldUnt; + + /** 特级护理天数 */ + private Integer spgaNurscareDays; + + /** 一级护理天数 */ + private Integer lv1NurscareDays; + + /** 二级护理天数 */ + private Integer scdNurscareDays; + + /** 三级护理天数 */ + private Integer lv3NurscareDays; + + /** 离院方式 */ + private String dscgWay; + + /** 拟接收机构名称 */ + private String acpMedinsName; + + /** 拟接收机构代码 */ + private String acpOptinsCode; + + /** 票据代码 */ + private String billCode; + + /** 票据号码 */ + private String billNo; + + /** 业务流水号 */ + private String bizSn; + + /** 出院31天内再住院计划标志 */ + private String daysRinpFlag31; + + /** 出院31天内再住院目的 */ + private String daysRinpPup31; + + /** 主诊医师姓名 */ + private String chfpdrName; + + /** 主诊医师代码 */ + private String chfpdrCode; + + /** 结算开始日期 */ + private Date setlBegnDate; + + /** 结算结束日期 */ + private Date setlEndDate; + + /** 个人自付 */ + private BigDecimal psnSelfpay; + + /** 个人自费 */ + private BigDecimal psnOwnpay; + + /** 个人账户支出 */ + private BigDecimal acctPay; + + /** 个人现金支付 */ + private BigDecimal psnCashpay; + + /** 医保支付方式 */ + private String hiPaymtd; + + /** 医保机构 */ + private String hsorg; + + /** 医保机构经办人 */ + private String hsorgOpter; + + /** 医疗机构填报部门 */ + private String medinsFillDept; + + /** 医疗机构填报人 */ + private String medinsFillPsn; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4102InputStastInfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4102InputStastInfo.java new file mode 100644 index 00000000..d193cea9 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4102InputStastInfo.java @@ -0,0 +1,23 @@ +package com.openhis.yb.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +@Data +public class Yb4102InputStastInfo { + /** + * 患者编号 + */ + @JSONField(name = "psn_no") + private String psnNo; + /** + * 结算单编号 + */ + @JSONField(name = "setl_id") + private String setlId; + /** + * 统计类别 + */ + @JSONField(name = "stas_type") + private String stasType; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4104InputDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4104InputDto.java new file mode 100644 index 00000000..112492e8 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4104InputDto.java @@ -0,0 +1,49 @@ +package com.openhis.yb.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +@Data +public class Yb4104InputDto { + + /** + * 患者编号 + */ + @JSONField(name = "setl_ym", format = "yyyyMM") + private String setlYm; + /** + * 患者编号 + */ + @JSONField(name = "psn_no") + private String psnNo; + /** + * 结算单编号 + */ + @JSONField(name = "setl_id") + private String setlId; + /** + * 错误等级 + */ + @JSONField(name = "err_lv") + private String errLv; + /** + * 回退标志 + */ + @JSONField(name = "retn_flag") + private String retnFlag; + /** + * 统计类别 + */ + @JSONField(name = "stas_type") + private String stasType; + /** + * 当前页数 + */ + @JSONField(name = "page_num") + private String pageNum; + /** + * 本页数据量 + */ + @JSONField(name = "page_size") + private String pageSize; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputBaseInfoDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputBaseInfoDto.java new file mode 100644 index 00000000..b5f9c797 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputBaseInfoDto.java @@ -0,0 +1,695 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.yb.dto; + +import java.math.BigDecimal; +import java.util.Date; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 【4401】基本信息 + * + * @author SunJQ + * @date 2025-11-17 + */ +@Data +@Accessors(chain = true) +public class Yb4401InputBaseInfoDto { + + /** + * 格式:定点医药机构编号+院内唯一流水号 + */ + private String mdtrtSn; + + /** + * 就诊ID + */ + private String mdtrtId; + + /** + * 人员编号 + */ + private String psnNo; + + /** + * 患者住院次数 + */ + private String patnIptCnt; + + /** + * 住院号 + */ + private String iptNo; + + /** + * 病案号 + */ + private String medcasno; + + /** + * 人员姓名 + */ + private String psnName; + + /** + * 性别 + */ + private String gend; + + /** + * 出生日期 + */ + private String brdy; + + /** + * 国籍 + */ + private String ntly; + + /** + * 国籍名称 + */ + private String ntlyName; + + /** + * 新生儿出生体重 + */ + private String nwbBirWt; + + /** + * 新生儿入院体重 + */ + private String nwbAdmWt; + + /** + * 出生地 + */ + private String birplc; + + /** + * 籍贯 + */ + private String napl; + + /** + * 民族名称 + */ + private String natyName; + + /** + * 民族 + */ + private String naty; + + /** + * 证件号码 + */ + private String certno; + + /** + * 职业 + */ + private String prfs; + + /** + * 婚姻状态 + */ + private String mrgStas; + + /** + * 现住址-邮政编码 + */ + private String currAddrPoscode; + + /** + * 现住址 + */ + private String currAddr; + + /** + * 个人联系电话 + */ + private String psnTel; + + /** + * 户口地址-省(自治区、直辖市) + */ + private String resdAddrProv; + + /** + * 户口地址-市(地区) + */ + private String resdAddrCity; + + /** + * 户口地址-县(区) + */ + private String resdAddrCoty; + + /** + * 户口地址-乡(镇、街道办事处) + */ + private String resdAddrSubd; + + /** + * 户口地址-村(街、路、弄等) + */ + private String resdAddrVil; + + /** + * 户口地址-门牌号码 + */ + private String resdAddrHousnum; + + /** + * 户口地址-邮政编码 + */ + private String resdAddrPoscode; + + /** + * 户口地址 + */ + private String resdAddr; + + /** + * 工作单位联系电话 + */ + private String emprTel; + + /** + * 工作单位-邮政编码 + */ + private String emprPoscode; + + /** + * 工作单位及地址 + */ + private String emprAddr; + + /** 联系人电话 */ + private String conerTel; + + /** + * 联系人姓名 + */ + private String conerName; + + /** + * 联系人地址 + */ + private String conerAddr; + + /** + * 与联系人关系代码 + */ + private String conerRltsCode; + + /** + * 入院途径名称 + */ + private String admWayName; + + /** + * 入院途径代码 + */ + private String admWayCode; + + /** + * 治疗类别名称 + */ + private String trtTypeName; + + /** + * 治疗类别 + */ + private String trtType; + + /** + * 入院科别 + */ + private String admCaty; + + /** + * 入院病房 + */ + private String admWard; + + /** + * 入院日期 + */ + private Date admDate; + + /** + * 出院日期 + */ + private Date dscgDate; + + /** + * 出院科别 + */ + private String dscgCaty; + + /** + * 转科科别名称 + */ + private String refldeptCatyName; + + /** + * 出院病房 + */ + private String dscgWard; + + /** + * 住院天数 + */ + private Integer iptDays; + + /** 药物过敏标志 */ + private String drugDicmFlag; + + /** + * 过敏药物名称 + */ + private String dicmDrugName; + + /** + * 死亡患者尸检标志 + */ + private String dieAutpFlag; + + /** ABO血型代码 */ + private String aboCode; + + /** + * ABO血型名称 + */ + private String aboName; + + /** + * Rh血型代码 + */ + private String rhCode; + + /** + * RH血型 + */ + private String rhName; + + /** + * 死亡标志 + */ + private String dieFlag; + + /** + * 科主任姓名 + */ + private String deptdrtName; + + /** + * 主任(副主任)医师姓名 + */ + private String chfdrName; + + /** + * 主治医生姓名 + */ + private String atddrName; + + /** + * 主诊医师姓名 + */ + private String chfpdrName; + + /** + * 住院医师姓名 + */ + private String iptDrName; + + /** + * 责任护士姓名 + */ + private String respNursName; + + /** + * 进修医师姓名 + */ + private String trainDrName; + + /** + * 实习医师姓名 + */ + private String intnDrName; + + /** + * 编码员姓名 + */ + private String codrName; + + /** + * 质控医师姓名 + */ + private String qltctrlDrName; + + /** + * 质控护士姓名 + */ + private String qltctrlNursName; + + /** + * 病案质量名称 + */ + private String medcasQltName; + + /** + * 病案质量代码 + */ + private String medcasQltCode; + + /** + * 质控日期 + */ + private Date qltctrlDate; + + /** + * 离院方式名称 + */ + private String dscgWayName; + + /** + * 离院方式 + */ + private String dscgWay; + + /** + * 拟接收医疗机构代码 + */ + private String acpMedinsCode; + + /** + * 拟接收医疗机构名称 + */ + private String acpMedinsName; + + /** + * 出院31天内再住院计划标志 + */ + private String dscg31daysRinpFlag; + + /** + * 出院31天内再住院目的 + */ + private String dscg31daysRinpPup; + + /** + * 损伤、中毒的外部原因 + */ + private String damgIntxExtRea; + + /** + * 损伤、中毒的外部原因疾病编码 + */ + private String damgIntxExtReaDisecode; + + /** + * 颅脑损伤患者入院前昏迷时长 + */ + private String brnDamgBfadmComaDura; + + /** + * 颅脑损伤患者入院后昏迷时长 + */ + private String brnDamgAfadmComaDura; + + /** + * 呼吸机使用时长 + */ + private String ventUsedDura; + + /** + * 确诊日期 + */ + private Date cnfmDate; + + /** + * 患者疾病诊断对照 + */ + private String patnDiseDiagCrsp; + + /** + * 住院患者疾病诊断对照代码 + */ + private String patnDiseDiagCrspCode; + + /** + * 住院患者诊断符合情况 + */ + private String iptPatnDiagInscp; + + /** + * 住院患者诊断符合情况代码 + */ + private String iptPatnDiagInscpCode; + + /** + * 出院治疗结果 + */ + private String dscgTrtRslt; + + /** + * 出院治疗结果代码 + */ + private String dscgTrtRsltCode; + + /** + * 医疗机构组织机构代码 + */ + private String medinsOrgcode; + + /** + * 年龄 + */ + private BigDecimal age; + + /** + * 过敏源 + */ + private String aise; + + /** + * 研究生实习医师姓名 + */ + private String poteIntnDrName; + + /** + * 乙肝表面抗原(HBsAg) + */ + private String hbsag; + + /** + * 丙型肝炎抗体(HCV-Ab) + */ + private String hcvAb; + + /** + * 艾滋病毒抗体(hiv-ab) + */ + private String hivAb; + + /** + * 抢救次数 + */ + private Integer rescCnt; + + /** + * 抢救成功次数 + */ + private Integer rescSuccCnt; + + /** + * 手术、治疗、检查、诊断为本院第一例 + */ + private String hospDiseFsttime; + + /** + * 医保基金付费方式名称 + */ + private String hifPayWayName; + + /** + * 医保基金付费方式代码 + */ + private String hifPayWayCode; + + /** + * 医疗费用支付方式名称 + */ + private String medFeePaymtdName; + + /** + * 医疗费用支付方式代码 + */ + private String medfeePaymtdCode; + + /** + * 自付金额 + */ + private BigDecimal selfpayAmt; + + /** + * 医疗费总额 + */ + private BigDecimal medfeeSumamt; + + /** + * 一般医疗服务费 + */ + private BigDecimal ordnMedServfee; + + /** + * 一般治疗操作费 + */ + private BigDecimal ordnTrtOprtFee; + + /** + * 护理费 + */ + private BigDecimal nursFee; + + /** + * 综合医疗服务类其他费用 + */ + private BigDecimal comMedServOthFee; + + /** + * 病理诊断费 + */ + private BigDecimal palgDiagFee; + + /** + * 实验室诊断费 + */ + private BigDecimal labDiagFee; + + /** + * 影像学诊断费 + */ + private BigDecimal rdhyDiagFee; + + /** + * 临床诊断项目费 + */ + private BigDecimal clncDiseFee; + + /** + * 非手术治疗项目费 + */ + private BigDecimal nsrgtrtItemFee; + + /** + * 临床物理治疗费 + */ + private BigDecimal clncPhysTrtFee; + + /** + * 手术治疗费 + */ + private BigDecimal rgtrtTrtFee; + + /** + * 麻醉费 + */ + private BigDecimal anstFee; + + /** + * 手术费 + */ + private BigDecimal rgtrtFee; + + /** + * 康复费 + */ + private BigDecimal rhabFee; + + /** + * 中医治疗费 + */ + private BigDecimal tcmTrtFee; + + /** + * 西药费 + */ + private BigDecimal wmFee; + + /** + * 抗菌药物费用 + */ + private BigDecimal abtlMednFee; + + /** + * 中成药费 + */ + private BigDecimal tcmpatFee; + + /** + * 中药饮片费 + */ + private BigDecimal tcmherbFee; + + /** + * 血费 + */ + private BigDecimal bloFee; + + /** + * 白蛋白类制品费 + */ + private BigDecimal albuFee; + + /** + * 球蛋白类制品费 + */ + private BigDecimal glonFee; + + /** + * 凝血因子类制品费 + */ + private BigDecimal clotfacFee; + + /** + * 细胞因子类制品费 + */ + private BigDecimal cykiFee; + + /** + * 检查用一次性医用材料费 + */ + private BigDecimal examDspoMatlFee; + + /** + * 治疗用一次性医用材料费 + */ + private BigDecimal trtDspoMatlFee; + + /** + * 手术用一次性医用材料费 + */ + private BigDecimal oprnDspoMatlFee; + + /** + * 其他费 + */ + private BigDecimal othFee; + + /** + * 有效标志 + */ + private String valiFlag; + + /** + * 定点医药机构编号 + */ + private String fixmedinsCode; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDiseInfoDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDiseInfoDto.java new file mode 100644 index 00000000..e62921ad --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDiseInfoDto.java @@ -0,0 +1,113 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.yb.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 【4401】诊断信息 + * + * @author SunJQ + * @date 2025-11-17 + */ +@Data +@Accessors(chain = true) +public class Yb4401InputDiseInfoDto { + + /** + * 病理号 + */ + private String palgNo; + + /** + * 住院患者疾病诊断类型代码 + */ + private String iptPatnDisediagTypeCode; + + /** + * 疾病诊断类型 + */ + private String disediagType; + + /** + * 主诊断标志 + */ + private String maindiagFlag; + + /** + * 诊断代码 + */ + private String diagCode; + + /** + * 诊断名称 + */ + private String diagName; + + /** + * 院内诊断代码 + */ + private String inhospDiagCode; + + /** + * 院内诊断名称 + */ + private String inhospDiagName; + + /** + * 入院疾病病情名称 + */ + private String admDiseCondName; + + /** + * 入院疾病病情代码 + */ + private String admDiseCondCode; + + /** + * 入院病情 + */ + private String admCond; + + /** + * 入院时病情代码 + */ + private String admCondCode; + + /** + * 最高诊断依据 + */ + private String highDiagEvid; + + /** + * 分化程度 + */ + private String bkupDeg; + + /** + * 分化程度代码 + */ + private String bkupDegCode; + + /** + * 有效标志 + */ + private String valiFlag; + + /** + * 住院病案首页流水号 + */ + private String iptMedcasHmpgSn; + + /** + * 就医流水号 + */ + private String mdtrtSn; + + /** + * 定点医药机构编号 + */ + private String fixmedinsCode; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDto.java new file mode 100644 index 00000000..0c5d5b1f --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputDto.java @@ -0,0 +1,27 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.yb.dto; + +import java.util.List; + +import lombok.Data; + +/** + * 【4401】 + * + * @author SunJQ + * @date 2025-11-17 + */ +@Data +public class Yb4401InputDto { + + private Yb4401InputBaseInfoDto baseinfo; + + private List diseinfo; + + private List oprninfo; + + private List icuinfo; + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputIcuInfoDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputIcuInfoDto.java new file mode 100644 index 00000000..e9bdb002 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputIcuInfoDto.java @@ -0,0 +1,74 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.yb.dto; + +import java.util.Date; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 【4401】重症监护信息 + * + * @author SunJQ + * @date 2025-11-17 + */ +@Data +@Accessors(chain = true) +public class Yb4401InputIcuInfoDto { + /** + * 重症监护室代码 + */ + private String icuCodeid; + + /** + * 进入监护室时间 + */ + private Date inpoolIcuTime; + + /** + * 退出监护室时间 + */ + private Date outIcuTime; + + /** + * 医疗机构组织机构代码 + */ + private String medinsOrgcode; + + /** + * 护理等级代码 + */ + private String nurscareLvCode; + + /** + * 护理等级名称 + */ + private String nurscareLvName; + + /** + * 护理天数 + */ + private Integer nurscareDays; + + /** + * 重返重症监护室标志 + */ + private String backIcu; + + /** + * 有效标志 + */ + private String valiFlag; + + /** + * 住院病案首页流水号 + */ + private String iptMedcasHmpgSn; + + /** + * 就医流水号 + */ + private String mdtrtSn; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputOprnInfoDto.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputOprnInfoDto.java new file mode 100644 index 00000000..4ed4097e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/dto/Yb4401InputOprnInfoDto.java @@ -0,0 +1,215 @@ +/* + * Copyright ©2023 CJB-CNIT Team. All rights reserved + */ +package com.openhis.yb.dto; + +import java.util.Date; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 【4401】手术信息 + * + * @author SunJQ + * @date 2025-11-17 + */ +@Data +@Accessors(chain = true) +public class Yb4401InputOprnInfoDto { + + /** + * 手术操作日期 + */ + private Date oprnOprtDate; + + /** + * 手术操作名称 + */ + private String oprnOprtName; + + /** + * 手术操作代码 + */ + private String oprnOprtCode; + + /** + * 手术操作序列号 + */ + private String oprnOprtSn; + + /** + * 手术级别代码 + */ + private String oprnLvCode; + + /** + * 手术级别名称 + */ + private String oprnLvName; + + /** + * 手术者姓名 + */ + private String operName; + + /** + * 助手Ⅰ姓名 + */ + private String asit1Name; + + /** + * 助手Ⅱ姓名 + */ + private String asitName2; + + /** + * 手术切口愈合等级 + */ + private String sincHealLv; + + /** + * 手术切口愈合等级代码 + */ + private String sincHealLvCode; + + /** + * 麻醉-方法名称 + */ + private String anstMtdName; + + /** + * 麻醉-方法代码 + */ + private String anstMtdCode; + + /** + * 麻醉医师姓名 + */ + private String anstDrName; + + /** + * 手术操作部位 + */ + private String oprnOperPart; + + /** + * 手术操作部位代码 + */ + private String oprnOperPartCode; + + /** + * 手术持续时间 + */ + private String oprnConTime; + + /** + * 麻醉分级名称 + */ + private String anstLvName; + + /** + * 麻醉分级代码 + */ + private String anstLvCode; + + /** + * 手术患者类型 + */ + private String oprnPatnType; + + /** + * 手术患者类型代码 + */ + private String oprnPatnTypeCode; + + /** + * 主要手术标志 + */ + private String mainOprnFlag; + + /** + * 麻醉ASA分级代码 + */ + private String anstAsaLvCode; + + /** + * 麻醉ASA分级名称 + */ + private String anstAsaLvName; + + /** + * 麻醉药物代码 + */ + private String anstMednCode; + + /** + * 麻醉药物名称 + */ + private String anstMednName; + + /** + * 麻醉药物剂量 + */ + private String anstMednDos; + + /** + * 计量单位 + */ + private String unt; + + /** + * 麻醉开始时间 + */ + private Date anstBegntime; + + /** + * 麻醉结束时间 + */ + private Date anstEndtime; + + /** + * 麻醉合并症代码 + */ + private String anstCopnCode; + + /** + * 麻醉合并症名称 + */ + private String anstCopnName; + + /** + * 麻醉合并症描述 + */ + private String anstCopnDscr; + + /** + * 复苏室开始时间 + */ + private Date pacuBegntime; + + /** + * 复苏室结束时间 + */ + private Date pacuEndtime; + + /** + * 取消手术标志 + */ + private String cancOprnFlag; + + /** + * 有效标志 + */ + private String valiFlag; + + /** + * 住院病案首页流水号 + */ + private String iptMedcasHmpgSn; + + /** + * 就医流水号 + */ + private String mdtrtSn; +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientPreSettleMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientPreSettleMapper.java new file mode 100644 index 00000000..cd36d3b3 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientPreSettleMapper.java @@ -0,0 +1,10 @@ +package com.openhis.yb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.yb.domain.InpatientPreSettle; +import com.openhis.yb.domain.InpatientSettle; +import org.springframework.stereotype.Repository; + +@Repository +public interface InpatientPreSettleMapper extends BaseMapper { +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientRegMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientRegMapper.java index 6baffce4..43676fb4 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientRegMapper.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/mapper/InpatientRegMapper.java @@ -6,6 +6,7 @@ package com.openhis.yb.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.openhis.yb.domain.FinancialReconcileRecord; import com.openhis.yb.domain.InpatientReg; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; /** @@ -16,4 +17,6 @@ import org.springframework.stereotype.Repository; */ @Repository public interface InpatientRegMapper extends BaseMapper { + + InpatientReg selectInpatientInfoByEncounterId(@Param("encounterId") String encounterId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientDischargeService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientDischargeService.java index 5f696bc5..8a76eb84 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientDischargeService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientDischargeService.java @@ -8,7 +8,7 @@ import com.openhis.yb.domain.InpatientDischarge; import com.openhis.yb.domain.InpatientReg; /** - * TODO:请概括描述当前接口的主要用途和注意事项 + * 出院办理服务接口 * * @author SunJQ * @date 2025-07-31 @@ -17,4 +17,5 @@ import com.openhis.yb.domain.InpatientReg; public interface IInpatientDischargeService extends IService { + InpatientDischarge getByMdtrtId(String mdtrtId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientFeeDetailService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientFeeDetailService.java index 80bee252..0c7c21b2 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientFeeDetailService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientFeeDetailService.java @@ -4,5 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.yb.domain.InfoPerson; import com.openhis.yb.domain.InpatientFeeDetail; +import java.util.List; + public interface IInpatientFeeDetailService extends IService { + /** + * 获取住院费用明细列表 + * @param mdtrtId 医保就诊id + * @return 集合 + */ + List getFeeDetailList(String mdtrtId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientPreSettleService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientPreSettleService.java new file mode 100644 index 00000000..63b241b0 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientPreSettleService.java @@ -0,0 +1,11 @@ +package com.openhis.yb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.yb.domain.InpatientPreSettle; +import com.openhis.yb.domain.InpatientSettle; + +import java.util.List; + +public interface IInpatientPreSettleService extends IService { + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientRegService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientRegService.java index 79d69e5a..7045465d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientRegService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientRegService.java @@ -22,4 +22,18 @@ public interface IInpatientRegService extends IService { * @return 医保住院挂号信息 */ InpatientReg getInpatientRegByIptNo(String busNo); + + /** + * 根据mdtrtId查询住院挂号信息 + * @param mdtrtId 业务流水号 + * @return 医保住院挂号信息 + */ + InpatientReg getInpatientRegByMdtrtId(String mdtrtId); + + /** + * 根据encounterId查询住院挂号信息 + * @param mdtrtId 业务流水号 + * @return 医保住院挂号信息 + */ + InpatientReg getInpatientRegByEncounterId(String mdtrtId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientSettleService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientSettleService.java index 58545a98..621686d2 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientSettleService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/IInpatientSettleService.java @@ -1,14 +1,24 @@ package com.openhis.yb.service; +import java.util.List; + import com.baomidou.mybatisplus.extension.service.IService; import com.openhis.yb.domain.InpatientSettle; public interface IInpatientSettleService extends IService { /** * 根据医保结算id找到住院结算id + * * @param ybSettleIds * @return */ InpatientSettle getBySettleId(String ybSettleIds); + /** + * 根据就诊id查询到患者结算信息集合 + * + * @param mdtrtId + * @return + */ + List getByMdtrtId(String mdtrtId); } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbDao.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbDao.java index 5aae9af7..4df3c050 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbDao.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbDao.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotNull; +import com.core.common.enums.DelFlag; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -161,6 +162,8 @@ public class YbDao { @Autowired private IInpatientFeeDetailService inpatientFeeDetailService; @Autowired + private IInpatientPreSettleService inpatientPreSettleService; + @Autowired private YbParamBuilderUtil ybUtil; @Autowired private IMedicationDispenseService medicationDispenseService; @@ -1249,7 +1252,7 @@ public class YbDao { public PatientInfoDto getPatent(Info1101Output perInfo) { // 查患者信息 Patient patient = - iPatientService.getOne(new LambdaQueryWrapper().eq(Patient::getIdCard, perInfo.getCertno())); + iPatientService.getOne(new LambdaQueryWrapper().eq(Patient::getIdCard, perInfo.getCertno()).last(YbCommonConstants.sqlConst.LIMIT1)); if (patient == null) { patient = new Patient(); // 处理性别字段 @@ -2186,7 +2189,7 @@ public class YbDao { chargeItemBaseInfoDtosList.add(chargeItemBaseInfoDto); } } - // 计算医疗总费用 + // 计算医疗总费用(这里总费用的计算方式很多种,现在用的是最老笨的,除了这个还可以去2303和2302去取值) BigDecimal medfee_sumamt = BigDecimal.ZERO; for (ChargeItemBaseInfoDto chargeItemBaseInfoDto : chargeItemBaseInfoDtosList) { medfee_sumamt = medfee_sumamt.add(chargeItemBaseInfoDto.getTotalPrice()); @@ -2516,8 +2519,8 @@ public class YbDao { } // 拼装参数 - yb2402InputParam.setYb2402InputInpatientDiseInfo(yb2402InputInpatientDiseInfos); - yb2402InputParam.setYb2402InputInpatientDscgInfo(yb2402InputInpatientDscgInfo); + yb2402InputParam.setDiseinfo(yb2402InputInpatientDiseInfos); + yb2402InputParam.setDscginfo(yb2402InputInpatientDscgInfo); return yb2402InputParam; } @@ -2860,4 +2863,101 @@ public class YbDao { inpatientRegInfoUpdateRecordeService.save(inpatientRegInfoUpdateRecorde); } + + public void updateInpatientRegById(InpatientReg inpatientReg) { + inpatientRegService.updateById(inpatientReg); + } + + public void save2301YbFeeDetail(List yb2301OutputResults,List feedetail,Long encounterId) { + + List feeDetailList = new ArrayList<>(); + InpatientFeeDetail inpatientFeeDetail; + for (Yb2301OutputResult yb2301OutputResult : yb2301OutputResults) { + Optional first = feedetail.stream().filter(yb2301InputFeeDetail -> yb2301InputFeeDetail.getFeedetlSn().equals(yb2301OutputResult.getFeedetlSn())).findFirst(); + if (!first.isPresent()) { + continue; + } + Yb2301InputFeeDetail yb2301InputFeeDetail = first.get(); + inpatientFeeDetail = new InpatientFeeDetail(); + inpatientFeeDetail.setFeedetlSn(yb2301OutputResult.getFeedetlSn()) + .setDetItemFeeSumamt(yb2301OutputResult.getDetItemFeeSumamt()) + .setInitFeedetlSn(yb2301InputFeeDetail.getInitFeedetlSn()) + .setMdtrtId(yb2301InputFeeDetail.getMdtrtId()) + .setDrordNo(yb2301InputFeeDetail.getDrordNo()) + .setPsnNo(yb2301InputFeeDetail.getPsnNo()) + .setMedType(yb2301InputFeeDetail.getMedType()) + .setFeeOcurTime(yb2301InputFeeDetail.getFeeOcurTime()) + .setMedinsListCodg(yb2301InputFeeDetail.getMedinsListCodg()) + .setDetItemFeeSumamt(yb2301OutputResult.getDetItemFeeSumamt()) + .setCnt(yb2301InputFeeDetail.getCnt()) + .setPric(yb2301InputFeeDetail.getPric()) + .setBilgDeptCodg(yb2301InputFeeDetail.getBilgDeptCodg()) + .setBilgDeptName(yb2301InputFeeDetail.getBilgDeptName()) + .setBilgDrCodg(yb2301InputFeeDetail.getBilgDrCodg()) + .setBilgDrName(yb2301InputFeeDetail.getBilgDrName()) + .setPricUplmtAmt(yb2301OutputResult.getPricUplmtAmt()) + .setSelfpayProp(yb2301OutputResult.getSelfpayProp()) + .setFulamtOwnpayAmt(yb2301OutputResult.getFulamtOwnpayAmt()) + .setOverlmtAmt(yb2301OutputResult.getOverlmtAmt()) + .setPreselfpayAmt(yb2301OutputResult.getPreselfpayAmt()) + .setInscpScpAmt(yb2301OutputResult.getInscpScpAmt()) + .setChrgitmLv(yb2301OutputResult.getChrgitmLv()) + .setMedChrgitmType(yb2301OutputResult.getMedChrgitmType()) + .setBasMednFlag(yb2301OutputResult.getBasMednFlag()) + .setHiNegoDrugFlag(yb2301OutputResult.getHiNegoDrugFlag()) + .setChldMedcFlag(yb2301OutputResult.getChldMedcFlag()) + .setListSpItemFlag(yb2301OutputResult.getListSpItemFlag()) + .setLmtUsedFlag(yb2301OutputResult.getLmtUsedFlag()) + .setDrtReimFlag(yb2301OutputResult.getDrtReimFlag()) + .setEncounterId(encounterId); + // + + feeDetailList.add(inpatientFeeDetail); + } + + inpatientFeeDetailService.saveBatch(feeDetailList); + + } + + public void save2303InpatientPreSettle(Yb2303OutputSetInfo yb2303OutputSetInfo) { + InpatientPreSettle inpatientPreSettle = new InpatientPreSettle(); + + inpatientPreSettle.setPsnNo(yb2303OutputSetInfo.getPsnNo()) + .setPsnName(yb2303OutputSetInfo.getPsnName()) + .setPsnCertType(yb2303OutputSetInfo.getPsnCertType()) + .setCertno(yb2303OutputSetInfo.getCertno()) + .setGend(yb2303OutputSetInfo.getGend()) + .setNaty(yb2303OutputSetInfo.getNaty()) + .setBrdy(yb2303OutputSetInfo.getBrdy()) + .setAge(yb2303OutputSetInfo.getAge()) + .setPsnType(yb2303OutputSetInfo.getPsnType()) + .setCvlservFlag(yb2303OutputSetInfo.getCvlservFlag()) + .setSetlTime(yb2303OutputSetInfo.getSetlTime()) + .setMedType(yb2303OutputSetInfo.getMedType()) + .setActPayDedc(yb2303OutputSetInfo.getActPayDedc()) + .setHifpPay(yb2303OutputSetInfo.getHifpPay()) + .setPoolPropSelfpay(yb2303OutputSetInfo.getPoolPropSelfpay()) + .setCvlservPay(yb2303OutputSetInfo.getCvlservPay()) + .setHifesPay(yb2303OutputSetInfo.getHifesPay()) + .setHifmiPay(yb2303OutputSetInfo.getHifmiPay()) + .setHifobPay(yb2303OutputSetInfo.getHifobPay()) + .setMafPay(yb2303OutputSetInfo.getMafPay()) + .setOthPay(yb2303OutputSetInfo.getOthPay()) + .setFundPaySumamt(yb2303OutputSetInfo.getFundPaySumamt()) + .setPsnPartAmt(yb2303OutputSetInfo.getPsnPartAmt()) + .setAcctPay(yb2303OutputSetInfo.getAcctPay()) + .setPsnCashPay(yb2303OutputSetInfo.getPsnCashPay()) + .setHospPartAmt(yb2303OutputSetInfo.getHospPartAmt()) + .setBalc(yb2303OutputSetInfo.getBalc()) + .setAcctMulaidPay(yb2303OutputSetInfo.getAcctMulaidPay()) + .setMedinsSetlId(yb2303OutputSetInfo.getMedinsSetlId()) + .setClrOptins(yb2303OutputSetInfo.getClrOptins()) + .setClrWay(yb2303OutputSetInfo.getClrWay()) + .setClrType(yb2303OutputSetInfo.getClrType()) + .setHifdmPay(yb2303OutputSetInfo.getHifdmPay()); + //inpatientPreSettle.setInputParam(JSON.toJSONString(yb2303OutputSetInfo)); + inpatientPreSettle.setOutputResult(JSON.toJSONString(yb2303OutputSetInfo)); + + inpatientPreSettleService.save(inpatientPreSettle); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbHttpUtils.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbHttpUtils.java index 2d505be9..590381d7 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbHttpUtils.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbHttpUtils.java @@ -11,8 +11,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import com.openhis.yb.domain.InpatientDischarge; -import com.openhis.yb.domain.InpatientReg; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; @@ -50,6 +48,7 @@ import com.openhis.financial.domain.Contract; import com.openhis.financial.service.IContractService; import com.openhis.financial.service.impl.ContractServiceImpl; import com.openhis.yb.domain.ClinicReg; +import com.openhis.yb.domain.InpatientReg; import com.openhis.yb.dto.*; import com.openhis.yb.model.Clinic2207OrderModel; import com.openhis.yb.model.Clinic2207OrderParam; @@ -589,10 +588,10 @@ public class YbHttpUtils { return result; } - public Result merchandise(Medical3505Param medical3505Param) { + public Result merchandise(Medical3505Param medical3505Param, Contract contract) { // 发送请求 String s = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/merchandise", - medical3505Param, null); + medical3505Param, contract); if (StringUtils.isEmpty(s)) { throw new ServiceException("未接收到医保返回参数"); } @@ -607,10 +606,10 @@ public class YbHttpUtils { return result; } - public Result cancelMerchandise(Medical3506Param medical3506Param) { + public Result cancelMerchandise(Medical3506Param medical3506Param, Contract contract) { // 发送请求 String s = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/cancel-merchandise", - medical3506Param, null); + medical3506Param, contract); if (StringUtils.isEmpty(s)) { throw new ServiceException("未接收到医保返回参数"); } @@ -708,6 +707,42 @@ public class YbHttpUtils { return result; } + public Result query3512(MedicalInventory3512Param inventory3512Param, Contract contract) { + // 发送请求 + String s = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/query-3512-info", + inventory3512Param, contract); + if (StringUtils.isEmpty(s)) { + throw new ServiceException("未接收到医保返回参数"); + } + // 参数处理 + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(s, Result.class); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public Result query3513(MedicalInventory3513Param inventory3513Param, Contract contract) { + // 发送请求 + String s = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/query-3513-info", + inventory3513Param, contract); + if (StringUtils.isEmpty(s)) { + throw new ServiceException("未接收到医保返回参数"); + } + // 参数处理 + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(s, Result.class); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** * 发送http请求(2025/05/02经测试,若以自带的工具类发送请求失败,故使用原peis系统中成功调用的写法重新封装) * @@ -722,8 +757,8 @@ public class YbHttpUtils { baseParam.setBaseInfo(ybParamBuilderUtil.getBaseInfo(parseObject(JSON.toJSONString(o)), contract)).setData(o); logger.info("【请求路径】:" + url + ";【入参】: " + JSON.toJSONString(baseParam)); // 创建Http请求 - RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setConnectionRequestTimeout(30000) - .setSocketTimeout(30000).build(); + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(300000) + .setConnectionRequestTimeout(300000).setSocketTimeout(300000).build(); CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); CloseableHttpResponse response = null; // 发送请求 @@ -1095,18 +1130,18 @@ public class YbHttpUtils { Result result = null; try { result = mapper.readValue(resultString, Result.class); - if (result == null) { - throw new ServiceException("未接收到医保返回参数"); - } else if (result.getCode() == 200) { - System.out.println(result.getResult().toString()); - return JSON.parseObject(JSON.toJSONString(result.getResult()), FileResult.class); - } else { - throw new ServiceException(result.getMessage()); - } } catch (Exception e) { logger.error(e.getMessage(), e); } - return null; + + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return JSON.parseObject(JSON.toJSONString(result.getResult()), FileResult.class); + } else { + return new FileResult().setErrMsg(result.getMessage()); + } } /** @@ -1115,7 +1150,7 @@ public class YbHttpUtils { * @param fileResult * @return */ - public FileResult downLoadFile(FileResult fileResult) { + public String downLoadFile(FileResult fileResult) { String resultString = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/download", fileResult, null); if (StringUtils.isEmpty(resultString)) { @@ -1131,7 +1166,7 @@ public class YbHttpUtils { throw new ServiceException("未接收到医保返回参数"); } else if (result.getCode() == 200) { System.out.println(result.getResult().toString()); - return JSON.parseObject(JSON.toJSONString(result.getResult()), FileResult.class); + return result.getResult().toString(); } else { throw new ServiceException(result.getMessage()); } @@ -1144,13 +1179,13 @@ public class YbHttpUtils { /** * 【2401】住院办理 * - * @param yb2401InputInpatientMdtrtInfo 入參 + * @param jsonObject 入參 * @return 結果 */ - public InpatientReg inpatientReg(Yb2401InputInpatientMdtrtInfo yb2401InputInpatientMdtrtInfo) { + public InpatientReg inpatientReg(JSONObject jsonObject, String contractNo) { String resultString = - httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/inpatient-reg", - yb2401InputInpatientMdtrtInfo, contractServiceImpl.getContract(yb2401InputInpatientMdtrtInfo.getMdtrtareaAdmvs())); + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/inpatient-reg", jsonObject, + contractServiceImpl.getContract(contractNo)); if (StringUtils.isEmpty(resultString)) { throw new ServiceException("未接收到医保返回参数"); } @@ -1174,10 +1209,49 @@ public class YbHttpUtils { return null; } - public InpatientDischarge inpatientCheckOut(Contract contract,Yb2402InputParam yb2402InputInpatientDscgInfo) { + /** + * 【2404】住院办理撤销 + * + * @param yb2404InputInpatient 入參 + * @return 結果 + */ + public void cancelInpatientReg(Yb2404InputInpatient yb2404InputInpatient, String contractNo) { String resultString = - httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/discharge-patient", - yb2402InputInpatientDscgInfo, contract); + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/cancel-inpatient-reg", + yb2404InputInpatient, contractServiceImpl.getContract(contractNo)); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【2404】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【2404】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 【2402】出院办理 + * + * @param yb2402InputInpatientDscgInfo 参数 + * @param contractNo 合同编号 + * @return 结果 + */ + public Yb2402InputParam inpatientCheckOut(Yb2402InputParam yb2402InputInpatientDscgInfo, String contractNo) { + String resultString = + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/discharge-patient", + yb2402InputInpatientDscgInfo, iContractService.getContract(contractNo)); if (StringUtils.isEmpty(resultString)) { throw new ServiceException("未接收到医保返回参数"); } @@ -1191,7 +1265,7 @@ public class YbHttpUtils { throw new ServiceException("未接收到医保返回参数"); } else if (result.getCode() == 200) { System.out.println(result.getResult().toString()); - return JSON.parseObject(result.getResult().toString(), InpatientDischarge.class); + return JSON.parseObject(result.getResult().toString(), Yb2402InputParam.class); } else { throw new ServiceException(result.getMessage()); } @@ -1201,10 +1275,48 @@ public class YbHttpUtils { return null; } - public void updateInpatientInfo(Yb2403InputParam yb2405InputInpatient) { + /** + * 【2405】出院办理撤销 + * + * @param yb2405InputInpatient 入參 + * @return 結果 + */ + public void cancelInpatientCheckOut(Yb2405InputInpatient yb2405InputInpatient, String contractNo) { + String resultString = + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/cancel-discharge-patient", + yb2405InputInpatient, contractServiceImpl.getContract(contractNo)); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【2404】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【2404】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 【2403】 更改住院信息 + * + * @param yb2403InputInpatient 参数 + * @param contractNo 结果 + */ + public void updateInpatientInfo(Yb2403InputParam yb2403InputInpatient, String contractNo) { String resultString = - httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/change-inpatient-info", - yb2405InputInpatient, null); + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/change-inpatient-info", + yb2403InputInpatient, iContractService.getContract(contractNo)); if (StringUtils.isEmpty(resultString)) { throw new ServiceException("未接收到医保返回参数"); } @@ -1224,6 +1336,148 @@ public class YbHttpUtils { } } catch (Exception e) { logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); } } + + public void emrUp(Yb4401InputDto yb4401InputDto) { + String resultString = + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/emr-up", yb4401InputDto, null); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【4401】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【4401】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return; + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 【2601】冲正交易 + * + * @param toReverse 冲正参数 + * @param contract 省市医保 + */ + public void ybToReverse(Yb2601InputParam toReverse, Contract contract) { + String resultString = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/to-reverse", + toReverse, contract); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【4401】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【4401】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return; + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + public void yb4101Up(Yb4101AInputData yb4101AInputData, Contract contract) { + + String resultString = httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/setl-up", + yb4101AInputData, contract); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【4101A】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【4101A】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return; + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + } + + public void yb4102Up(Yb4102InputStastInfo yb4102InputStastInfo) { + String resultString = + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/setl-status-up", + yb4102InputStastInfo, null); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【4102】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【4102】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return; + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + + } + + public void cancel2302FeeDetailUp(Yb2302InpatientParam yb2302InpatientParam, Contract contract) { + String resultString = + httpPost(SecurityUtils.getLoginUser().getOptionJson().getString("ybUrl") + "/cancel-2302-fee-detail", + yb2302InpatientParam, contract); + if (StringUtils.isEmpty(resultString)) { + throw new ServiceException("未接收到医保返回参数"); + } + System.out.println("【2302】返回参数:" + JSON.toJSONString(resultString)); + logger.info("【2302】返回参数:" + resultString); + ObjectMapper mapper = new ObjectMapper(); + Result result = null; + try { + result = mapper.readValue(resultString, Result.class); + if (result == null) { + throw new ServiceException("未接收到医保返回参数"); + } else if (result.getCode() == 200) { + System.out.println(result.getResult().toString()); + return; + } else { + throw new ServiceException(result.getMessage()); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException(e.getMessage()); + } + + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbManager.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbManager.java index 1457c5c8..0c86ff87 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbManager.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/YbManager.java @@ -4,8 +4,12 @@ package com.openhis.yb.service; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -700,9 +704,9 @@ public class YbManager { * @param medical3505Param 发药详细信息 * @return 结果 */ - public R merchandise(Medical3505Param medical3505Param) { + public R merchandise(Medical3505Param medical3505Param, Contract contract) { - Result result = ybHttpService.merchandise(medical3505Param); + Result result = ybHttpService.merchandise(medical3505Param, contract); Medical3505Result medical3505Result = JSON.parseObject(JSON.toJSONString(result.getResult()), Medical3505Result.class); if ("1".equals(medical3505Result.getRetRslt())) { @@ -717,10 +721,11 @@ public class YbManager { * 【3506】商品销售退货 * * @param medical3506Param 退货详细信息 + * @param contract 合同信息 * @return 结果 */ - public R cancelMerchandise(Medical3506Param medical3506Param) { - Result result = ybHttpService.cancelMerchandise(medical3506Param); + public R cancelMerchandise(Medical3506Param medical3506Param, Contract contract) { + Result result = ybHttpService.cancelMerchandise(medical3506Param, contract); Medical3505Result medical3505Result = JSON.parseObject(JSON.toJSONString(result.getResult()), Medical3505Result.class); if ("1".equals(medical3505Result.getRetRslt())) { @@ -915,28 +920,62 @@ public class YbManager { Yb2301InputFeeDetail yb2301InputFeeDetail; List yb2301InputFeeDetailList = new ArrayList(); - // int i = 1; - for (ChargeItemBaseInfoDto chargeItemBaseInfoDto : chargeItemBaseInfoDtosList) { - yb2301InputFeeDetail = new Yb2301InputFeeDetail(); - yb2301InputFeeDetail.setFeedetlSn(chargeItemBaseInfoDto.getBusNo()).setMdtrtId(inpatientReg.getMdtrtId()) - .setPsnNo(inpatientReg.getPsnNo()).setMedType(String.valueOf(encounter.getYbClassEnum())) - .setFeeOcurTime(chargeItemBaseInfoDto.getEnteredDate()).setMedListCodg(chargeItemBaseInfoDto.getYbNo()) - .setMedinsListCodg(chargeItemBaseInfoDto.getBaseBusNo()) - .setDetItemFeeSumamt(chargeItemBaseInfoDto.getTotalPrice()) - .setCnt(chargeItemBaseInfoDto.getQuantityValue()).setPric(chargeItemBaseInfoDto.getUnitPrice()) - .setBilgDeptName(chargeItemBaseInfoDto.getDeptName()).setBilgDrName(chargeItemBaseInfoDto.getDoctName()) - .setBilgDeptCodg(chargeItemBaseInfoDto.getDeptYbNo()) - .setBilgDrCodg(chargeItemBaseInfoDto.getDoctYbNo()); - - yb2301InputFeeDetailList.add(yb2301InputFeeDetail); + BigDecimal quantity = BigDecimal.ZERO; + // 分组分类 + Map> groupByTable = + chargeItemBaseInfoDtosList.stream().collect(Collectors.groupingBy(ChargeItemBaseInfoDto::getServiceTable)); + for (Map.Entry> stringListEntry : groupByTable.entrySet()) { + Map> groupById = + stringListEntry.getValue().stream().collect(Collectors.groupingBy(ChargeItemBaseInfoDto::getServiceId)); + for (Map.Entry> longListEntry : groupById.entrySet()) { + quantity = BigDecimal.ZERO; + for (ChargeItemBaseInfoDto chargeItemBaseInfoDto : longListEntry.getValue()) { + quantity = quantity.add(chargeItemBaseInfoDto.getQuantityValue()); + } + + ChargeItemBaseInfoDto chargeItemBaseInfoDto = longListEntry.getValue().get(0); + + yb2301InputFeeDetail = new Yb2301InputFeeDetail(); + yb2301InputFeeDetail.setFeedetlSn(chargeItemBaseInfoDto.getBusNo()) + .setMdtrtId(inpatientReg.getMdtrtId()).setPsnNo(inpatientReg.getPsnNo()) + .setMedType(String.valueOf(encounter.getYbClassEnum())) + .setFeeOcurTime(chargeItemBaseInfoDto.getEnteredDate()) + .setMedListCodg(chargeItemBaseInfoDto.getYbNo()) + .setMedinsListCodg(chargeItemBaseInfoDto.getBaseBusNo()) + // 2025-11-13 李方案住院部分的totalprice不可直接用,要用单价乘以数量,并且比如患者一天一袋氯化钠注射液,预结算的时候要根据同表同id进行归类计算 + .setDetItemFeeSumamt(quantity.multiply(chargeItemBaseInfoDto.getUnitPrice())).setCnt(quantity) + .setPric(chargeItemBaseInfoDto.getUnitPrice()).setBilgDeptName(chargeItemBaseInfoDto.getDeptName()) + .setBilgDrName(chargeItemBaseInfoDto.getDoctName()) + .setBilgDeptCodg(chargeItemBaseInfoDto.getDeptYbNo()) + .setBilgDrCodg(chargeItemBaseInfoDto.getDoctYbNo()); + + yb2301InputFeeDetailList.add(yb2301InputFeeDetail); + } } + // int i = 1; + // for (ChargeItemBaseInfoDto chargeItemBaseInfoDto : chargeItemBaseInfoDtosList) { + // yb2301InputFeeDetail = new Yb2301InputFeeDetail(); + // yb2301InputFeeDetail.setFeedetlSn(chargeItemBaseInfoDto.getBusNo()).setMdtrtId(inpatientReg.getMdtrtId()) + // .setPsnNo(inpatientReg.getPsnNo()).setMedType(String.valueOf(encounter.getYbClassEnum())) + // .setFeeOcurTime(chargeItemBaseInfoDto.getEnteredDate()).setMedListCodg(chargeItemBaseInfoDto.getYbNo()) + // .setMedinsListCodg(chargeItemBaseInfoDto.getBaseBusNo()) + // //2025-11-13 李方案住院部分的totalprice不可直接用,要用单价乘以数量,并且比如患者一天一袋氯化钠注射液,预结算的时候要根据同表同id进行归类计算 + // .setDetItemFeeSumamt(chargeItemBaseInfoDto.getQuantityValue().multiply(chargeItemBaseInfoDto.getUnitPrice())) + // .setCnt(chargeItemBaseInfoDto.getQuantityValue()).setPric(chargeItemBaseInfoDto.getUnitPrice()) + // .setBilgDeptName(chargeItemBaseInfoDto.getDeptName()).setBilgDrName(chargeItemBaseInfoDto.getDoctName()) + // .setBilgDeptCodg(chargeItemBaseInfoDto.getDeptYbNo()) + // .setBilgDrCodg(chargeItemBaseInfoDto.getDoctYbNo()); + // yb2301InputFeeDetailList.add(yb2301InputFeeDetail); + // } + Yb2301InputFeeDetailModel yb2301InputFeeDetailModel = new Yb2301InputFeeDetailModel(); yb2301InputFeeDetailModel.setFeedetail(yb2301InputFeeDetailList) .setInsuplcAdmdvs(inpatientReg.getInsuplcAdmdvs()); List yb2301OutputResults = ybHttpService.upload2301FeeDetail(yb2301InputFeeDetailModel); // todo :数据保存 + ybBaseService.save2301YbFeeDetail(yb2301OutputResults, yb2301InputFeeDetailList, encounter.getId()); // for (ChargeItemBaseInfoDto chargeItemBaseInfoDto : chargeItemBaseInfoDtos) { // if (chargeItemBaseInfoDto.getContractNo().equals(CommonConstants.BusinessName.DEFAULT_CONTRACT_NO)) { @@ -974,6 +1013,7 @@ public class YbManager { throw new ServiceException("医保预结算失败"); } // todo:数据保存 + ybBaseService.save2303InpatientPreSettle(yb2303OutputSetInfo); return yb2303OutputSetInfo; } @@ -1012,6 +1052,5 @@ public class YbManager { return yb2305OutputSetlInfo; } - public void hospitalAdmission() { - } + public void hospitalAdmission() {} } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/ClinicUnSettleServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/ClinicUnSettleServiceImpl.java index 933831a2..2bf0b58d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/ClinicUnSettleServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/ClinicUnSettleServiceImpl.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.yb.domain.ClinicUnSettle; import com.openhis.yb.mapper.ClinicUnSettleMapper; import com.openhis.yb.service.IClinicUnSettleService; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientDischargeServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientDischargeServiceImpl.java index 871014f5..12b72eff 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientDischargeServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientDischargeServiceImpl.java @@ -5,17 +5,15 @@ package com.openhis.yb.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; +import com.openhis.common.constant.YbCommonConstants; import com.openhis.yb.domain.InpatientDischarge; -import com.openhis.yb.domain.InpatientReg; import com.openhis.yb.mapper.InpatientDischargeMapper; -import com.openhis.yb.mapper.InpatientRegMapper; import com.openhis.yb.service.IInpatientDischargeService; -import com.openhis.yb.service.IInpatientRegService; import org.springframework.stereotype.Service; /** - * TODO:请概括描述当前类的主要用途和注意事项 + * 医保出院Mapper * * @author SunJQ * @date 2025-07-31 @@ -23,6 +21,9 @@ import org.springframework.stereotype.Service; @Service public class InpatientDischargeServiceImpl extends ServiceImpl implements IInpatientDischargeService { - - + @Override + public InpatientDischarge getByMdtrtId(String mdtrtId) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(InpatientDischarge::getMdtrtId, mdtrtId) + .eq(InpatientDischarge::getDeleteFlag, DelFlag.NO.getCode()).last(YbCommonConstants.sqlConst.LIMIT1)); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientFeeDetailServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientFeeDetailServiceImpl.java index 88ac2528..dd2a71ae 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientFeeDetailServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientFeeDetailServiceImpl.java @@ -1,11 +1,18 @@ package com.openhis.yb.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.yb.domain.InpatientFeeDetail; import com.openhis.yb.mapper.InpatientFeeDetailMapper; import com.openhis.yb.service.IInpatientFeeDetailService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class InpatientFeeDetailServiceImpl extends ServiceImpl implements IInpatientFeeDetailService { + @Override + public List getFeeDetailList(String mdtrtId) { + return baseMapper.selectList(new LambdaQueryWrapper().eq(InpatientFeeDetail::getMdtrtId, mdtrtId)); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientPreSettleServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientPreSettleServiceImpl.java new file mode 100644 index 00000000..f6971c7e --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientPreSettleServiceImpl.java @@ -0,0 +1,21 @@ +package com.openhis.yb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.core.common.enums.DelFlag; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.yb.domain.InpatientPreSettle; +import com.openhis.yb.domain.InpatientSettle; +import com.openhis.yb.mapper.InpatientPreSettleMapper; +import com.openhis.yb.mapper.InpatientSettleMapper; +import com.openhis.yb.service.IInpatientPreSettleService; +import com.openhis.yb.service.IInpatientSettleService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class InpatientPreSettleServiceImpl extends ServiceImpl + implements IInpatientPreSettleService { + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientRegServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientRegServiceImpl.java index 0ba8e4e8..a0d9db0c 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientRegServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientRegServiceImpl.java @@ -5,7 +5,7 @@ package com.openhis.yb.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.openhis.common.enums.DelFlag; +import com.core.common.enums.DelFlag; import com.openhis.yb.domain.InpatientReg; import com.openhis.yb.mapper.InpatientRegMapper; import com.openhis.yb.service.IInpatientRegService; @@ -26,4 +26,15 @@ public class InpatientRegServiceImpl extends ServiceImpl().eq(InpatientReg::getIptNo, busNo) .eq(InpatientReg::getDeleteFlag, DelFlag.NO.getCode())); } + + @Override + public InpatientReg getInpatientRegByMdtrtId(String mdtrtId) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(InpatientReg::getMdtrtId, mdtrtId) + .eq(InpatientReg::getDeleteFlag, DelFlag.NO.getCode())); + } + + @Override + public InpatientReg getInpatientRegByEncounterId(String encounterId) { + return baseMapper.selectInpatientInfoByEncounterId(encounterId); + } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientSettleServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientSettleServiceImpl.java index 3646a739..2b613af5 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientSettleServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/service/impl/InpatientSettleServiceImpl.java @@ -1,18 +1,30 @@ package com.openhis.yb.service.impl; +import java.util.List; + +import org.springframework.stereotype.Service; + import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.openhis.common.constant.YbCommonConstants; -import com.openhis.common.enums.Whether; +import com.core.common.enums.DelFlag; import com.openhis.yb.domain.InpatientSettle; import com.openhis.yb.mapper.InpatientSettleMapper; import com.openhis.yb.service.IInpatientSettleService; -import org.springframework.stereotype.Service; @Service -public class InpatientSettleServiceImpl extends ServiceImpl implements IInpatientSettleService { +public class InpatientSettleServiceImpl extends ServiceImpl + implements IInpatientSettleService { @Override public InpatientSettle getBySettleId(String ybSettleIds) { - return baseMapper.selectOne(new LambdaQueryWrapper().eq(InpatientSettle::getSetlId,ybSettleIds).eq(InpatientSettle::getDeleteFlag, Whether.NO.getValue()).last(YbCommonConstants.sqlConst.LIMIT1)); + return baseMapper + .selectOne(new LambdaQueryWrapper().eq(InpatientSettle::getSetlId, ybSettleIds) + .eq(InpatientSettle::getDeleteFlag, DelFlag.NO.getCode()).last(YbCommonConstants.sqlConst.LIMIT1)); + } + + @Override + public List getByMdtrtId(String mdtrtId) { + return baseMapper.selectList(new LambdaQueryWrapper().eq(InpatientSettle::getMdtrtId, mdtrtId) + .eq(InpatientSettle::getDeleteFlag, DelFlag.NO.getCode())); } } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/util/YbParamBuilderUtil.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/util/YbParamBuilderUtil.java index 667b3467..539ca6a7 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/util/YbParamBuilderUtil.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/yb/util/YbParamBuilderUtil.java @@ -271,8 +271,9 @@ public class YbParamBuilderUtil { List encounterDiagnosis = iEncounterDiagnosisService.list(new LambdaQueryWrapper() .eq(EncounterDiagnosis::getEncounterId, encounterId).eq(EncounterDiagnosis::getTenantId, tenantId) - .eq(EncounterDiagnosis::getMedTypeCode, ybMedType.getValue()));// 2025/08/05 - // 农大患者结算慢病时会上传普通门诊的疾病,医保回复该参保人未做该病种的门慢门特备案,故此修正根据门诊类型去上传 + .eq(EncounterDiagnosis::getMedTypeCode, ybMedType.getValue())); + // 2025/08/05 + // 农大患者结算慢病时会上传普通门诊的疾病,医保回复该参保人未做该病种的门慢门特备案,故此修正根据门诊类型去上传 for (EncounterDiagnosis diagnosis : encounterDiagnosis) { if (Objects.equals(Whether.YES.getValue(), diagnosis.getMaindiseFlag())) { mainEncounterDiagnosis = diagnosis; @@ -2369,6 +2370,9 @@ public class YbParamBuilderUtil { if (jsonObj != null && jsonObj.get("insuplc_admdvs") != null) { baseInfo.setInsuplcAdmdvs(String.valueOf(jsonObj.get("insuplc_admdvs"))); } + if (jsonObj != null && jsonObj.get("filePath") != null) { + baseInfo.setFilePath(String.valueOf(jsonObj.get("filePath"))); + } // 异地患者问题 // if (contract.getBusNo() != null) { // baseInfo.setInsuplcAdmdvs(contract.getBusNo()); diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogDrugInfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogDrugInfo.java index c4f61d04..480c97f8 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogDrugInfo.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogDrugInfo.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,294 +27,391 @@ public class CatalogDrugInfo { /** 医疗目录编码 */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String medicalCatalogCode; /** 药品商品名 */ + @CsvBindByPosition(position = 1) private String drugTradeName; /** 通用名编号 */ + @CsvBindByPosition(position = 2) private String genericNameId; /** 药品通用名 */ + @CsvBindByPosition(position = 3) private String drugGenericName; /** 化学名称 */ + @CsvBindByPosition(position = 4) private String chemicalName; /** 别名 */ + @CsvBindByPosition(position = 5) private String alias; /** 英文名称 */ + @CsvBindByPosition(position = 6) private String englishName; /** 注册名称 */ + @CsvBindByPosition(position = 7) private String registeredName; /** 药监本位码 */ + @CsvBindByPosition(position = 8) private String drugSupervisionCode; /** 药品剂型 */ + @CsvBindByPosition(position = 9) private String drugForm; /** 药品剂型名称 */ + @CsvBindByPosition(position = 10) private String drugFormName; /** 药品类别 */ + @CsvBindByPosition(position = 11) private String drugCategory; /** 药品类别名称 */ + @CsvBindByPosition(position = 12) private String drugCategoryName; /** 药品规格 */ + @CsvBindByPosition(position = 13) private String drugSpecification; /** 药品规格代码 */ + @CsvBindByPosition(position = 14) private String drugSpecCode; /** 注册剂型 */ + @CsvBindByPosition(position = 15) private String registeredForm; /** 注册规格 */ + @CsvBindByPosition(position = 16) private String registeredSpec; /** 注册规格代码 */ + @CsvBindByPosition(position = 17) private String registeredSpecCode; /** 每次用量 */ + @CsvBindByPosition(position = 18) private String dosage; /** 使用频次 */ + @CsvBindByPosition(position = 19) private String frequency; /** 酸根盐基 */ + @CsvBindByPosition(position = 20) private String acidBase; /** 国家药品编号 */ + @CsvBindByPosition(position = 21) private String nationalDrugCode; /** 用法 */ + @CsvBindByPosition(position = 22) private String usage; /** 中成药标志 */ + @CsvBindByPosition(position = 23) private String tcmFlag; /** 生产地类别 */ + @CsvBindByPosition(position = 24) private String productionAreaType; /** 生产地类别名称 */ + @CsvBindByPosition(position = 25) private String productionAreaName; /** 计价单位类型 */ + @CsvBindByPosition(position = 26) private String pricingUnitType; /** 非处方药标志 */ + @CsvBindByPosition(position = 27) private String otcFlag; /** 非处方药标志名称 */ + @CsvBindByPosition(position = 28) private String otcFlagName; /** 包装材质 */ + @CsvBindByPosition(position = 29) private String packagingMaterial; /** 包装材质名称 */ + @CsvBindByPosition(position = 30) private String packagingMaterialName; /** 包装规格 */ + @CsvBindByPosition(position = 31) private String packagingSpec; /** 包装数量 */ + @CsvBindByPosition(position = 32) private String packagingQuantity; /** 功能主治 */ + @CsvBindByPosition(position = 33) private String functionIndication; /** 给药途径 */ + @CsvBindByPosition(position = 34) private String administrationRoute; /** 说明书 */ + @CsvBindByPosition(position = 35) private String instructions; /** 开始日期 */ + @CsvBindByPosition(position = 36) private String startDate; /** 结束日期 */ + @CsvBindByPosition(position = 37) private String endDate; /** 最小使用单位 */ + @CsvBindByPosition(position = 38) private String minUseUnit; /** 最小销售单位 */ + @CsvBindByPosition(position = 39) private String minSaleUnit; /** 最小计量单位 */ + @CsvBindByPosition(position = 40) private String minMeasurementUnit; /** 最小包装数量 */ + @CsvBindByPosition(position = 41) private String minPackageQuantity; /** 最小包装单位 */ + @CsvBindByPosition(position = 42) private String minPackageUnit; /** 最小制剂单位 */ + @CsvBindByPosition(position = 43) private String minPreparationUnit; /** 最小包装单位名称 */ + @CsvBindByPosition(position = 44) private String minPackageUnitName; /** 最小制剂单位名称 */ + @CsvBindByPosition(position = 45) private String minPreparationUnitName; /** 转换比 */ + @CsvBindByPosition(position = 46) private String conversionRatio; /** 药品有效期 */ + @CsvBindByPosition(position = 47) private String shelfLife; /** 最小计价单位 */ + @CsvBindByPosition(position = 48) private String minPricingUnit; /** 五笔助记码 */ + @CsvBindByPosition(position = 49) private String wubiCode; /** 拼音助记码 */ + @CsvBindByPosition(position = 50) private String pinyinCode; /** 分包装厂家 */ + @CsvBindByPosition(position = 51) private String repackager; /** 生产企业编号 */ + @CsvBindByPosition(position = 52) private String manufacturerCode; /** 生产企业名称 */ + @CsvBindByPosition(position = 53) private String manufacturerName; /** 特殊限价药品标志 */ + @CsvBindByPosition(position = 54) private String specialPriceLimitFlag; /** 特殊药品标志 */ + @CsvBindByPosition(position = 55) private String specialDrugFlag; /** 限制使用范围 */ + @CsvBindByPosition(position = 56) private String useRestriction; /** 限制使用标志 */ + @CsvBindByPosition(position = 57) private String useRestrictionFlag; /** 药品注册证号 */ + @CsvBindByPosition(position = 58) private String registrationCertNo; /** 药品注册证号开始日期 */ + @CsvBindByPosition(position = 59) private String regCertStartDate; /** 药品注册证号结束日期 */ + @CsvBindByPosition(position = 60) private String regCertEndDate; /** 批准文号 */ + @CsvBindByPosition(position = 61) private String approvalNo; /** 批准文号开始日期 */ + @CsvBindByPosition(position = 62) private String approvalStartDate; /** 批准文号结束日期 */ + @CsvBindByPosition(position = 63) private String approvalEndDate; /** 市场状态 */ + @CsvBindByPosition(position = 64) private String marketStatus; /** 市场状态名称 */ + @CsvBindByPosition(position = 65) private String marketStatusName; /** 药品注册批件电子档案 */ + @CsvBindByPosition(position = 66) private String regDocumentArchive; /** 药品补充申请批件电子档案 */ + @CsvBindByPosition(position = 67) private String suppApplicationArchive; /** 国家医保药品目录备注 */ + @CsvBindByPosition(position = 68) private String nationalInsuranceNotes; /** 基本药物标志名称 */ + @CsvBindByPosition(position = 69) private String essentialDrugFlagName; /** 基本药物标志 */ + @CsvBindByPosition(position = 70) private String essentialDrugFlag; /** 增值税调整药品标志 */ + @CsvBindByPosition(position = 71) private String vatAdjustmentFlag; /** 增值税调整药品名称 */ + @CsvBindByPosition(position = 72) private String vatAdjustmentName; /** 上市药品目录集药品 */ + @CsvBindByPosition(position = 73) private String listedDrugFlag; /** 医保谈判药品标志 */ + @CsvBindByPosition(position = 74) private String negotiationDrugFlag; /** 医保谈判药品名称 */ + @CsvBindByPosition(position = 75) private String negotiationDrugName; /** 卫健委药品编码 */ + @CsvBindByPosition(position = 76) private String nhcDrugCode; /** 备注 */ + @CsvBindByPosition(position = 77) private String remarks; /** 有效标志 */ + @CsvBindByPosition(position = 78) private String validFlag; /** 唯一记录号 */ + @CsvBindByPosition(position = 79) private String uniqueRecordId; /** 数据创建时间 */ + @CsvBindByPosition(position = 80) private String createdAt; /** 数据更新时间 */ + @CsvBindByPosition(position = 81) private String updatedAt; /** 版本号 */ + @CsvBindByPosition(position = 82) private String version; /** 版本名称 */ + @CsvBindByPosition(position = 83) private String versionName; /** 儿童用药 */ + @CsvBindByPosition(position = 84) private String pediatricUse; /** 公司名称 */ + @CsvBindByPosition(position = 85) private String companyName; /** 仿制药一致性评价药品 */ + @CsvBindByPosition(position = 86) private String genericEvaluationFlag; /** 经销企业 */ + @CsvBindByPosition(position = 87) private String distributionCompany; /** 经销企业联系人 */ + @CsvBindByPosition(position = 88) private String distributionContact; /** 经销企业授权书电子档案 */ + @CsvBindByPosition(position = 89) private String distributionAuthArchive; /** 国家医保药品目录剂型 */ + @CsvBindByPosition(position = 90) private String insuranceForm; /** 国家医保药品目录甲乙类标识 */ + @CsvBindByPosition(position = 91) private String insuranceClass; /** 上市许可证持有人 */ + @CsvBindByPosition(position = 92) private String marketingAuthorizationHolder; /** 下发标志 */ + @CsvBindByPosition(position = 93) private String releaseFlag; /** 传输数据ID */ + @CsvBindByPosition(position = 94) private String transmissionDataId; /** 生效时间 */ + @CsvBindByPosition(position = 95) private String validFrom; /** 失效时间 */ + @CsvBindByPosition(position = 96) private String validTo; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalConsumables.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalConsumables.java index ee71a46b..432de918 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalConsumables.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalConsumables.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,216 +27,287 @@ public class CatalogMedicalConsumables { /** 医疗目录编码 */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String medicalCatalogCode; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String consumableName; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String deviceUniqueId; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String insuranceGenericCode; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String insuranceGenericName; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String productModel; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String specCode; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String specification; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String consumableCategory; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String specModel; /** $column.columnComment */ + @CsvBindByPosition(position = 10) private String materialCode; /** $column.columnComment */ + @CsvBindByPosition(position = 11) private String materialType; /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String packageSpec; /** $column.columnComment */ + @CsvBindByPosition(position = 13) private String packageQuantity; /** $column.columnComment */ + @CsvBindByPosition(position = 14) private String packageMaterial; /** $column.columnComment */ + @CsvBindByPosition(position = 15) private String packageUnit; /** $column.columnComment */ + @CsvBindByPosition(position = 16) private String conversionRatio; /** $column.columnComment */ + @CsvBindByPosition(position = 17) private String minUsageUnit; /** $column.columnComment */ + @CsvBindByPosition(position = 18) private String productionAreaType; /** $column.columnComment */ + @CsvBindByPosition(position = 19) private String productionAreaName; /** $column.columnComment */ + @CsvBindByPosition(position = 20) private String productStandard; /** $column.columnComment */ + @CsvBindByPosition(position = 21) private String expiryDate; /** $column.columnComment */ + @CsvBindByPosition(position = 22) private String structureComposition; /** $column.columnComment */ + @CsvBindByPosition(position = 23) private String applicableScope; /** $column.columnComment */ + @CsvBindByPosition(position = 24) private String usageMethod; /** $column.columnComment */ + @CsvBindByPosition(position = 25) private String imageCode; /** $column.columnComment */ + @CsvBindByPosition(position = 26) private String qualityStandard; /** $column.columnComment */ + @CsvBindByPosition(position = 27) private String instructions; /** $column.columnComment */ + @CsvBindByPosition(position = 28) private String proofMaterials; /** $column.columnComment */ + @CsvBindByPosition(position = 29) private String specialDeviceFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 30) private String specialDeviceName; /** $column.columnComment */ + @CsvBindByPosition(position = 31) private String kitName; /** $column.columnComment */ + @CsvBindByPosition(position = 32) private String kitFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 33) private String usageRestrictionFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 34) private String insuranceRestriction; /** $column.columnComment */ + @CsvBindByPosition(position = 35) private String minSaleUnit; /** 高值耗材标志(true:是 false:否) */ + @CsvBindByPosition(position = 36) private String highValueFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 37) private String medicalMaterialCode; /** $column.columnComment */ + @CsvBindByPosition(position = 38) private String implantFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 39) private String sterilizationFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 40) private String sterilizationName; /** $column.columnComment */ + @CsvBindByPosition(position = 41) private String implantInterventionFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 42) private String implantInterventionName; /** $column.columnComment */ + @CsvBindByPosition(position = 43) private String disposableFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 44) private String disposableFlagName; /** $column.columnComment */ + @CsvBindByPosition(position = 45) private String registrantName; /** $column.columnComment */ + @CsvBindByPosition(position = 46) private String startDate; /** $column.columnComment */ + @CsvBindByPosition(position = 47) private String endDate; /** $column.columnComment */ + @CsvBindByPosition(position = 48) private String deviceManagementCategory; /** $column.columnComment */ + @CsvBindByPosition(position = 49) private String deviceCategoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 50) private String registrationNo; /** $column.columnComment */ + @CsvBindByPosition(position = 51) private String registeredProductName; /** $column.columnComment */ + @CsvBindByPosition(position = 52) private String structureDetails; /** $column.columnComment */ + @CsvBindByPosition(position = 53) private String otherContent; /** $column.columnComment */ + @CsvBindByPosition(position = 54) private String approvalDate; /** $column.columnComment */ + @CsvBindByPosition(position = 55) private String registrantAddress; /** $column.columnComment */ + @CsvBindByPosition(position = 56) private String certEffectiveStart; /** $column.columnComment */ + @CsvBindByPosition(position = 57) private String certEffectiveEnd; /** $column.columnComment */ + @CsvBindByPosition(position = 58) private String manufacturerCode; /** $column.columnComment */ + @CsvBindByPosition(position = 59) private String manufacturerName; /** $column.columnComment */ + @CsvBindByPosition(position = 60) private String productionAddress; /** $column.columnComment */ + @CsvBindByPosition(position = 61) private String agentCompany; /** $column.columnComment */ + @CsvBindByPosition(position = 62) private String agentAddress; /** $column.columnComment */ + @CsvBindByPosition(position = 63) private String productionCountry; /** $column.columnComment */ + @CsvBindByPosition(position = 64) private String serviceAgency; /** $column.columnComment */ + @CsvBindByPosition(position = 65) private String certArchivePath; /** $column.columnComment */ + @CsvBindByPosition(position = 66) private String productImages; /** 有效标志(true:有效 false:无效) */ + @CsvBindByPosition(position = 67) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 68) private String uniqueRecordId; /** $column.columnComment */ + @CsvBindByPosition(position = 69) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 70) private String versionName; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalHerbInfo.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalHerbInfo.java index a3b6147d..89fb69ac 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalHerbInfo.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalHerbInfo.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,96 +27,135 @@ public class CatalogMedicalHerbInfo { /** 医疗目录编码 */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String medicalCatalogCode; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String singleDrugName; /** 单复方标志(true:复方 false:单方) */ + @CsvBindByPosition(position = 2) private String singleCompoundFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String qualityGrade; /** 中草药年份 */ + @CsvBindByPosition(position = 4) private String herbalYear; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String medicinalPart; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String safeDosage; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String conventionalUsage; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String propertiesTaste; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String meridianAttribution; /** $column.columnComment */ + @CsvBindByPosition(position = 10) private String species; /** $column.columnComment */ + @CsvBindByPosition(position = 11) private String startDate; /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String endDate; /** 有效标志(true:有效 false:无效) */ + @CsvBindByPosition(position = 13) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 14) private String uniqueRecordId; + /** 数据创建时间 - 新增 */ + @CsvBindByPosition(position = 15) + private String createTime; + + /** 数据更新时间 - 新增 */ + @CsvBindByPosition(position = 16) + private String updateTime; + /** $column.columnComment */ + @CsvBindByPosition(position = 17) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 18) private String versionName; /** $column.columnComment */ + @CsvBindByPosition(position = 19) private String herbName; /** $column.columnComment */ + @CsvBindByPosition(position = 20) private String indications; /** $column.columnComment */ + @CsvBindByPosition(position = 21) private String processingMethod; /** $column.columnComment */ + @CsvBindByPosition(position = 22) private String efficacyClassification; /** $column.columnComment */ + @CsvBindByPosition(position = 23) private String herbSource; /** $column.columnComment */ + @CsvBindByPosition(position = 24) private String nationalInsurancePolicy; /** $column.columnComment */ + @CsvBindByPosition(position = 25) private String provincialInsurancePolicy; /** $column.columnComment */ + @CsvBindByPosition(position = 26) private String standardName; /** $column.columnComment */ + @CsvBindByPosition(position = 27) private String standardPage; /** $column.columnComment */ + @CsvBindByPosition(position = 28) private String electronicRecord; /** $column.columnComment */ + @CsvBindByPosition(position = 29) private String issuanceFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 30) private String transferDataId; /** $column.columnComment */ + @CsvBindByPosition(position = 31) private String effectiveTime; /** $column.columnComment */ + @CsvBindByPosition(position = 32) private String expiryTime; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalService.java index e09a5cd3..179ba391 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogMedicalService.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,63 +27,83 @@ public class CatalogMedicalService { /** 医疗目录编码 */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String medicalCatalogCode; /** 计价单位 */ + @CsvBindByPosition(position = 1) private String billingUnit; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String billingUnitName; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String medicalItemDesc; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String exclusionContent; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String medicalItemConnotation; /** 有效标志(true:有效 false:无效) */ + @CsvBindByPosition(position = 6) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String remarks; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String serviceCategory; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String medicalServiceName; /** $column.columnComment */ + @CsvBindByPosition(position = 10) private String projectDescription; /** $column.columnComment */ + @CsvBindByPosition(position = 11) private String startDate; /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String endDate; /** 唯一记录号(UUID) */ + @CsvBindByPosition(position = 13) private String uniqueRecordId; /** $column.columnComment */ + @CsvBindByPosition(position = 14) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 15) private String versionName; /** $column.columnComment */ + @CsvBindByPosition(position = 16) private String issuanceFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 17) private String transferDataId; /** $column.columnComment */ + @CsvBindByPosition(position = 18) private String effectiveTime; /** $column.columnComment */ + @CsvBindByPosition(position = 19) private String expiryTime; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSpecialInsuranceDisease.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSpecialInsuranceDisease.java index 08881c0d..efeed1f7 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSpecialInsuranceDisease.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSpecialInsuranceDisease.java @@ -1,6 +1,9 @@ package com.openhis.ybcatalog.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -11,20 +14,37 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = false) public class CatalogSpecialInsuranceDisease { + @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String diseaseCode; // 门慢门特病种目录代码 + @CsvBindByPosition(position = 1) private String diseaseCategoryName; // 门慢门特病种大类名称 + @CsvBindByPosition(position = 2) private String diseaseSubcategoryName; // 门慢门特病种细分类名称 + @CsvBindByPosition(position = 3) private String medicalInsuranceZone; // 医保区划 + @CsvBindByPosition(position = 4) private String remark; // 备注 + @CsvBindByPosition(position = 5) private String validFlag; // 有效标志 + @CsvBindByPosition(position = 6) private String uniqueRecordId; // 唯一记录号 + @CsvBindByPosition(position = 7) private String dataCreateTime; // 数据创建时间 + @CsvBindByPosition(position = 8) private String dataUpdateTime; // 数据更新时间 + @CsvBindByPosition(position = 9) private String versionNumber; // 版本号 + @CsvBindByPosition(position = 10) private String diseaseDescription; // 病种内涵 + @CsvBindByPosition(position = 11) private String versionName; // 版本名称 + @CsvBindByPosition(position = 12) private String guidePageNumber; // 诊疗指南页码 + @CsvBindByPosition(position = 13) private String guideElectronicFile; // 诊疗指南电子档案 + @CsvBindByPosition(position = 14) private String diseaseName; // 门慢门特病种名称 + @CsvBindByPosition(position = 15) private String diseaseCategoryCode; // 门慢门特病种大类代码 } diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSurgeryStandardDirectory.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSurgeryStandardDirectory.java index 951b21a8..4ce61ceb 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSurgeryStandardDirectory.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogSurgeryStandardDirectory.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,69 +27,99 @@ public class CatalogSurgeryStandardDirectory { /** $column.columnComment */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String id; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String chapter; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String chapterCodeRange; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String chapterName; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String categoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String categoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String subcategoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String subcategoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String itemCode; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String itemName; /** $column.columnComment */ + @CsvBindByPosition(position = 10) private String operationCode; /** $column.columnComment */ + @CsvBindByPosition(position = 11) private String operationName; /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String usageFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 13) private String groupStandardOperationCode; /** $column.columnComment */ + @CsvBindByPosition(position = 14) private String groupStandardOperationName; /** $column.columnComment */ + @CsvBindByPosition(position = 15) private String clinicalVersionOperationCode; /** $column.columnComment */ + @CsvBindByPosition(position = 16) private String clinicalVersionOperationName; /** $column.columnComment */ + @CsvBindByPosition(position = 17) private String remarks; /** $column.columnComment */ + @CsvBindByPosition(position = 18) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 19) private String uniqueRecordId; + /** 数据创建时间 - 新增 */ + @CsvBindByPosition(position = 20) + private String createTime; + + /** 数据更新时间 - 新增 */ + @CsvBindByPosition(position = 21) + private String updateTime; + /** $column.columnComment */ + @CsvBindByPosition(position = 22) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 23) private String versionName; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogWesternDisease.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogWesternDisease.java index 98d89df3..28acdd24 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogWesternDisease.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogWesternDisease.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,69 +27,91 @@ public class CatalogWesternDisease { /** $column.columnComment */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String diseaseId; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String chapter; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String chapterCodeRange; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String chapterName; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String sectionCodeRange; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String sectionName; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String categoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String categoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String subcategoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String subcategoryName; /** 诊断代码 */ + @CsvBindByPosition(position = 10) private String diagnosisCode; /** $column.columnComment */ + @CsvBindByPosition(position = 11) private String diagnosisName; /** 使用标记(true:启用 false:停用) */ + @CsvBindByPosition(position = 12) private String usageFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 13) private String gbDiagnosisCode; /** $column.columnComment */ + @CsvBindByPosition(position = 14) private String gbDiagnosisName; /** $column.columnComment */ + @CsvBindByPosition(position = 15) private String clinicalCode; /** $column.columnComment */ + @CsvBindByPosition(position = 16) private String clinicalName; /** $column.columnComment */ + @CsvBindByPosition(position = 17) private String remarks; /** 有效标志(true:有效 false:无效) */ + @CsvBindByPosition(position = 18) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 19) private String uniqueRecordId; /** $column.columnComment */ + @CsvBindByPosition(position = 22) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 23) private String versionName; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZyDiseaseDiagnosis.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZyDiseaseDiagnosis.java index 33087520..ed255e8e 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZyDiseaseDiagnosis.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZyDiseaseDiagnosis.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,39 +27,51 @@ public class CatalogZyDiseaseDiagnosis { /** $column.columnComment */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String id; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String categoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String categoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String specialtySystemCategoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String specialtySystemCategoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String diseaseCategoryCode; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String diseaseCategoryName; /** $column.columnComment */ + @CsvBindByPosition(position = 7) private String remarks; /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String validFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String uniqueRecordId; /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String versionNumber; /** $column.columnComment */ + @CsvBindByPosition(position = 13) private String versionName; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZySyndrome.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZySyndrome.java index 97fa7a00..25fa4bce 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZySyndrome.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/domain/CatalogZySyndrome.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.core.common.core.domain.HisBaseEntity; +import com.opencsv.bean.CsvBindByPosition; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -26,39 +27,59 @@ public class CatalogZySyndrome { /** $column.columnComment */ @TableId(type = IdType.ASSIGN_ID) + @CsvBindByPosition(position = 0) private String tcmSyndromeId; /** $column.columnComment */ + @CsvBindByPosition(position = 1) private String syndromeClassCode; /** $column.columnComment */ + @CsvBindByPosition(position = 2) private String syndromeClassName; /** $column.columnComment */ + @CsvBindByPosition(position = 3) private String syndromePropertyCode; /** $column.columnComment */ + @CsvBindByPosition(position = 4) private String syndromeProperty; /** $column.columnComment */ + @CsvBindByPosition(position = 5) private String syndromeTypeCode; /** $column.columnComment */ + @CsvBindByPosition(position = 6) private String syndromeTypeName; /** $column.columnComment */ + @CsvBindByPosition(position = 7) + private String remark; + + /** $column.columnComment */ + @CsvBindByPosition(position = 8) private String activeFlag; /** $column.columnComment */ + @CsvBindByPosition(position = 9) private String uniqueRecordId; /** $column.columnComment */ + @CsvBindByPosition(position = 10) private String craetTime; /** $column.columnComment */ + @CsvBindByPosition(position = 11) + private String updateTime; + + /** $column.columnComment */ + @CsvBindByPosition(position = 12) private String version; /** $column.columnComment */ + @CsvBindByPosition(position = 13) private String versionName; } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialDiseaseMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialDiseaseMapper.java index 16c6a8a9..0b4c6645 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialDiseaseMapper.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialDiseaseMapper.java @@ -1,5 +1,6 @@ package com.openhis.ybcatalog.mapper; +import com.openhis.ybcatalog.domain.CatalogSpecialDisease; import org.springframework.stereotype.Repository; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -12,6 +13,6 @@ import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; * @date 2025-04-09 */ @Repository -public interface CatalogSpecialDiseaseMapper extends BaseMapper { +public interface CatalogSpecialDiseaseMapper extends BaseMapper { } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialInsuranceDiseaseMapper.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialInsuranceDiseaseMapper.java new file mode 100644 index 00000000..8a623d8b --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/mapper/CatalogSpecialInsuranceDiseaseMapper.java @@ -0,0 +1,10 @@ +package com.openhis.ybcatalog.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; +import org.springframework.stereotype.Repository; + +@Repository +public interface CatalogSpecialInsuranceDiseaseMapper extends BaseMapper { + +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogDrugInfoService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogDrugInfoService.java index 5c986199..565e982c 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogDrugInfoService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogDrugInfoService.java @@ -16,6 +16,9 @@ import java.util.List; * @date 2025-04-09 */ public interface ICatalogDrugInfoService extends IService { + + + CatalogDrugInfo getByYbNo(String medicalCatalogCode, String version); // /** // * 获取药品信息 // * diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalConsumablesService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalConsumablesService.java index 77b9a399..261410c1 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalConsumablesService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalConsumablesService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogMedicalConsumables; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogMedicalConsumables; * @date 2025-04-09 */ public interface ICatalogMedicalConsumablesService extends IService { - + CatalogMedicalConsumables getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalHerbInfoService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalHerbInfoService.java index ee5f75cc..0f5a9851 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalHerbInfoService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalHerbInfoService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogMedicalHerbInfo; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogMedicalHerbInfo; * @date 2025-04-09 */ public interface ICatalogMedicalHerbInfoService extends IService { - + CatalogMedicalHerbInfo getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalServiceService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalServiceService.java index d71c2dff..a8c8926d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalServiceService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogMedicalServiceService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogMedicalService; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogMedicalService; * @date 2025-04-09 */ public interface ICatalogMedicalServiceService extends IService { - + CatalogMedicalService getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialDiseaseService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialDiseaseService.java index a901a3e4..eaa6ffa1 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialDiseaseService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialDiseaseService.java @@ -1,6 +1,8 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; +import com.openhis.ybcatalog.domain.CatalogSpecialDisease; import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; /** @@ -9,6 +11,6 @@ import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; * @author system * @date 2025-04-09 */ -public interface ICatalogSpecialDiseaseService extends IService { - +public interface ICatalogSpecialDiseaseService extends IService { + CatalogSpecialDisease getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialInsuranceDiseaseService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialInsuranceDiseaseService.java new file mode 100644 index 00000000..5d3a7e5c --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSpecialInsuranceDiseaseService.java @@ -0,0 +1,9 @@ +package com.openhis.ybcatalog.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; +import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; + +public interface ICatalogSpecialInsuranceDiseaseService extends IService { + CatalogSpecialInsuranceDisease getByYbNo(String medicalCatalogCode, String version); +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSurgeryStandardDirectoryService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSurgeryStandardDirectoryService.java index 895c4492..6eec882d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSurgeryStandardDirectoryService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogSurgeryStandardDirectoryService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogSurgeryStandardDirectory; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogSurgeryStandardDirectory; * @date 2025-04-09 */ public interface ICatalogSurgeryStandardDirectoryService extends IService { - + CatalogSurgeryStandardDirectory getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogWesternDiseaseService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogWesternDiseaseService.java index 9665f44a..679a7bc4 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogWesternDiseaseService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogWesternDiseaseService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogWesternDisease; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogWesternDisease; * @date 2025-04-09 */ public interface ICatalogWesternDiseaseService extends IService { - + CatalogWesternDisease getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZyDiseaseDiagnosisService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZyDiseaseDiagnosisService.java index 6708fb82..f591b7fc 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZyDiseaseDiagnosisService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZyDiseaseDiagnosisService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogZyDiseaseDiagnosis; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogZyDiseaseDiagnosis; * @date 2025-04-09 */ public interface ICatalogZyDiseaseDiagnosisService extends IService { - + CatalogZyDiseaseDiagnosis getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZySyndromeService.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZySyndromeService.java index 19a6a2df..389a766d 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZySyndromeService.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/ICatalogZySyndromeService.java @@ -1,6 +1,7 @@ package com.openhis.ybcatalog.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.domain.CatalogZySyndrome; /** @@ -10,5 +11,5 @@ import com.openhis.ybcatalog.domain.CatalogZySyndrome; * @date 2025-04-09 */ public interface ICatalogZySyndromeService extends IService { - + CatalogZySyndrome getByYbNo(String medicalCatalogCode, String version); } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogDrugInfoServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogDrugInfoServiceImpl.java index 343dd4ce..50902adb 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogDrugInfoServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogDrugInfoServiceImpl.java @@ -3,6 +3,7 @@ package com.openhis.ybcatalog.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.openhis.common.constant.YbCommonConstants; import com.openhis.ybcatalog.domain.CatalogDrugInfo; import com.openhis.ybcatalog.mapper.CatalogDrugInfoMapper; import com.openhis.ybcatalog.service.ICatalogDrugInfoService; @@ -28,4 +29,8 @@ public class CatalogDrugInfoServiceImpl extends ServiceImpl page = new Page<>(pageNo, pageSize); // return (baseMapper.selectPage(page, new LambdaQueryWrapper().like(CatalogDrugInfo::getRegisteredName, searchKey).or().like(CatalogDrugInfo::getPinyinCode, searchKey).or().like(CatalogDrugInfo::getWubiCode, searchKey))); // } + + public CatalogDrugInfo getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogDrugInfo::getMedicalCatalogCode,medicalCatalogCode).eq(CatalogDrugInfo::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalConsumablesServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalConsumablesServiceImpl.java index ccaaad58..fdf27541 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalConsumablesServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalConsumablesServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogMedicalConsumablesService; */ @Service public class CatalogMedicalConsumablesServiceImpl extends ServiceImpl implements ICatalogMedicalConsumablesService { - + public CatalogMedicalConsumables getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogMedicalConsumables::getMedicalCatalogCode,medicalCatalogCode).eq(CatalogMedicalConsumables::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalHerbInfoServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalHerbInfoServiceImpl.java index d480d0ba..cc6796d0 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalHerbInfoServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalHerbInfoServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogMedicalHerbInfoService; */ @Service public class CatalogMedicalHerbInfoServiceImpl extends ServiceImpl implements ICatalogMedicalHerbInfoService { - + public CatalogMedicalHerbInfo getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogMedicalHerbInfo::getMedicalCatalogCode,medicalCatalogCode).eq(CatalogMedicalHerbInfo::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalServiceServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalServiceServiceImpl.java index d00089c9..dae9b8a1 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalServiceServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogMedicalServiceServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogMedicalServiceService; */ @Service public class CatalogMedicalServiceServiceImpl extends ServiceImpl implements ICatalogMedicalServiceService { - + public CatalogMedicalService getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogMedicalService::getMedicalCatalogCode,medicalCatalogCode).eq(CatalogMedicalService::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialDiseaseServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialDiseaseServiceImpl.java index 87e5f6eb..aa553165 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialDiseaseServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialDiseaseServiceImpl.java @@ -1,5 +1,9 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; +import com.openhis.ybcatalog.domain.CatalogSpecialDisease; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,6 +19,8 @@ import com.openhis.ybcatalog.service.ICatalogSpecialDiseaseService; */ @Service public class CatalogSpecialDiseaseServiceImpl extends - ServiceImpl implements ICatalogSpecialDiseaseService { - + ServiceImpl implements ICatalogSpecialDiseaseService { + public CatalogSpecialDisease getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogSpecialDisease::getDiseaseCatalogCode,medicalCatalogCode).eq(CatalogSpecialDisease::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialInsuranceDiseaseServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialInsuranceDiseaseServiceImpl.java new file mode 100644 index 00000000..310164cf --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSpecialInsuranceDiseaseServiceImpl.java @@ -0,0 +1,17 @@ +package com.openhis.ybcatalog.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; +import com.openhis.ybcatalog.domain.CatalogSpecialInsuranceDisease; +import com.openhis.ybcatalog.mapper.CatalogSpecialInsuranceDiseaseMapper; +import com.openhis.ybcatalog.service.ICatalogSpecialInsuranceDiseaseService; +import org.springframework.stereotype.Service; + +@Service +public class CatalogSpecialInsuranceDiseaseServiceImpl extends ServiceImpl implements ICatalogSpecialInsuranceDiseaseService { + public CatalogSpecialInsuranceDisease getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogSpecialInsuranceDisease::getDiseaseCode,medicalCatalogCode).eq(CatalogSpecialInsuranceDisease::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } +} diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSurgeryStandardDirectoryServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSurgeryStandardDirectoryServiceImpl.java index 46bf5e8f..10610ad5 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSurgeryStandardDirectoryServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogSurgeryStandardDirectoryServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogSurgeryStandardDirectoryService; */ @Service public class CatalogSurgeryStandardDirectoryServiceImpl extends ServiceImpl implements ICatalogSurgeryStandardDirectoryService { - + public CatalogSurgeryStandardDirectory getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogSurgeryStandardDirectory::getId,medicalCatalogCode).eq(CatalogSurgeryStandardDirectory::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogWesternDiseaseServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogWesternDiseaseServiceImpl.java index 47f3448f..0d5482a8 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogWesternDiseaseServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogWesternDiseaseServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogWesternDiseaseService; */ @Service public class CatalogWesternDiseaseServiceImpl extends ServiceImpl implements ICatalogWesternDiseaseService { - + public CatalogWesternDisease getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogWesternDisease::getDiseaseId,medicalCatalogCode).eq(CatalogWesternDisease::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZyDiseaseDiagnosisServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZyDiseaseDiagnosisServiceImpl.java index e62f8b59..b4627b02 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZyDiseaseDiagnosisServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZyDiseaseDiagnosisServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogZyDiseaseDiagnosisService; */ @Service public class CatalogZyDiseaseDiagnosisServiceImpl extends ServiceImpl implements ICatalogZyDiseaseDiagnosisService { - + public CatalogZyDiseaseDiagnosis getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogZyDiseaseDiagnosis::getId,medicalCatalogCode).eq(CatalogZyDiseaseDiagnosis::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZySyndromeServiceImpl.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZySyndromeServiceImpl.java index ab75747f..75f2c920 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZySyndromeServiceImpl.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/ybcatalog/service/impl/CatalogZySyndromeServiceImpl.java @@ -1,5 +1,8 @@ package com.openhis.ybcatalog.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.openhis.common.constant.YbCommonConstants; +import com.openhis.ybcatalog.domain.CatalogDrugInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -15,5 +18,7 @@ import com.openhis.ybcatalog.service.ICatalogZySyndromeService; */ @Service public class CatalogZySyndromeServiceImpl extends ServiceImpl implements ICatalogZySyndromeService { - + public CatalogZySyndrome getByYbNo(String medicalCatalogCode, String version) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(CatalogZySyndrome::getTcmSyndromeId,medicalCatalogCode).eq(CatalogZySyndrome::getVersionName,version).last(YbCommonConstants.sqlConst.LIMIT1)); + } } \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/InstrumentMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/InstrumentMapper.xml new file mode 100644 index 00000000..5bbc3154 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/InstrumentMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ObservationDefinitionMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ObservationDefinitionMapper.xml new file mode 100644 index 00000000..06ef4df6 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ObservationDefinitionMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/SpecimenDefinitionMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/SpecimenDefinitionMapper.xml new file mode 100644 index 00000000..f3773627 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/SpecimenDefinitionMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/document/DocStatisticsMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/document/DocStatisticsMapper.xml index a5c5ae2c..ed98a1e2 100644 --- a/openhis-server-new/openhis-domain/src/main/resources/mapper/document/DocStatisticsMapper.xml +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/document/DocStatisticsMapper.xml @@ -4,4 +4,20 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/financial/PaymentRecDetailMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/financial/PaymentRecDetailMapper.xml index de898048..a7b91206 100644 --- a/openhis-server-new/openhis-domain/src/main/resources/mapper/financial/PaymentRecDetailMapper.xml +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/financial/PaymentRecDetailMapper.xml @@ -40,13 +40,14 @@ FROM fin_payment_rec_detail T1 LEFT JOIN adm_account T2 ON T1.account_id = T2."id" + LEFT JOIN fin_payment_reconciliation T3 ON T3.ID = T1.reconciliation_id AND T2.delete_flag = '0' WHERE T1.reconciliation_id IN #{item} - AND T1.delete_flag = '0' + AND T3.kind_enum = #{kindEnum} AND T1.pay_enum NOT IN (310201,8,1,2,3,4,5,6,7,9,510100,340100,390100,390200,610100,640100,390400,620100,360100,999900,390300,9999981,360300) AND T1.delete_flag = '0'; diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefDeviceDefMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefDeviceDefMapper.xml new file mode 100644 index 00000000..75dd4a91 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefDeviceDefMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefObservationDefMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefObservationDefMapper.xml new file mode 100644 index 00000000..779ea708 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefObservationDefMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefSpecimenDefMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefSpecimenDefMapper.xml new file mode 100644 index 00000000..252b32c6 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ActivityDefSpecimenDefMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ObservationMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ObservationMapper.xml new file mode 100644 index 00000000..c18cec64 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/ObservationMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml new file mode 100644 index 00000000..d80d461a --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/lab/SpecimenMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/template/EncounterAutoRollMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/template/EncounterAutoRollMapper.xml new file mode 100644 index 00000000..f155920f --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/template/EncounterAutoRollMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientDischargeMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientDischargeMapper.xml new file mode 100644 index 00000000..a144804b --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientDischargeMapper.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientFeeDetailMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientFeeDetailMapper.xml new file mode 100644 index 00000000..f2844361 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientFeeDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientPreSettleMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientPreSettleMapper.xml new file mode 100644 index 00000000..df32e559 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientPreSettleMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegInfoUpdateRecordeMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegInfoUpdateRecordeMapper.xml new file mode 100644 index 00000000..88dc4020 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegInfoUpdateRecordeMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegMapper.xml new file mode 100644 index 00000000..7bcac503 --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientRegMapper.xml @@ -0,0 +1,51 @@ + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientSettleMapper.xml b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientSettleMapper.xml new file mode 100644 index 00000000..15937ace --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/resources/mapper/yb/InpatientSettleMapper.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-einvoiceapp/pom.xml b/openhis-server-new/openhis-einvoiceapp/pom.xml deleted file mode 100644 index 7294902a..00000000 --- a/openhis-server-new/openhis-einvoiceapp/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - openhis-server - com.openhis - 0.0.1-SNAPSHOT - - 4.0.0 - - openhis-einvoiceapp - - - 17 - 17 - - - - - - - - - - - - org.springframework.boot - spring-boot-starter - - - - com.alibaba.fastjson2 - fastjson2 - - - org.apache.httpcomponents - httpclient - - - - com.openhis - openhis-common - - - - - com.yomahub - liteflow-spring-boot-starter - - - org.springframework.boot - spring-boot-configuration-processor - true - - - cn.hutool - hutool-all - - - - org.bouncycastle - bcprov-jdk15on - - - - - com.itextpdf - kernel - - - org.apache.httpcomponents - httpmime - - - - - com.itextpdf - itextpdf - - - com.itextpdf - itext-asian - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - repackage - - - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - false - ${project.artifactId} - - - - ${project.artifactId} - - - \ No newline at end of file diff --git a/openhis-server-new/openhis-miniapp/pom.xml b/openhis-server-new/openhis-miniapp/pom.xml index 6f22ccc7..7b251573 100644 --- a/openhis-server-new/openhis-miniapp/pom.xml +++ b/openhis-server-new/openhis-miniapp/pom.xml @@ -21,6 +21,7 @@ com.openhis openhis-domain + 0.0.1-SNAPSHOT @@ -30,6 +31,7 @@ org.springframework.boot spring-boot-maven-plugin + 2.5.15 true @@ -44,12 +46,20 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} + 3.1.0 false ${project.artifactId} + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + ${project.artifactId} diff --git a/openhis-server-new/openhis-miniapp/src/main/java/com/openhis/OpenHisMiniApp.java b/openhis-server-new/openhis-miniapp/src/main/java/com/openhis/OpenHisMiniApp.java new file mode 100644 index 00000000..08547d6d --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/java/com/openhis/OpenHisMiniApp.java @@ -0,0 +1,26 @@ +package com.openhis; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.core", "com.openhis"}) +public class OpenHisMiniApp { + public static void main(String[] args) throws UnknownHostException { + // System.setProperty("spring.devtools.restart.enabled", "false"); + ConfigurableApplicationContext application = SpringApplication.run(OpenHisMiniApp.class, args); + Environment env = application.getEnvironment(); + String ip = InetAddress.getLocalHost().getHostAddress(); + String port = env.getProperty("server.port"); + String path = env.getProperty("server.servlet.context-path"); + System.out.println("\n----------------------------------------------------------\n\t" + + "Application OpenHis is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + + "/\n\t" + "External: \thttp://" + ip + ":" + port + path + "/\n" + + "----------------------------------------------------------"); + } +} diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/META-INF/spring-devtools.properties b/openhis-server-new/openhis-miniapp/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 00000000..37e7b580 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson2.*.jar \ No newline at end of file diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/application-druid.yml b/openhis-server-new/openhis-miniapp/src/main/resources/application-druid.yml new file mode 100644 index 00000000..aedc7639 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/application-druid.yml @@ -0,0 +1,61 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: org.postgresql.Driver + druid: + # 主库数据源 + master: + url: jdbc:postgresql://od32215110g.vicp.fun:15008/openhis?currentSchema=public&characterEncoding=UTF-8&client_encoding=UTF-8 + username: postgres + password: root + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 # FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: openhis + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/application.yml b/openhis-server-new/openhis-miniapp/src/main/resources/application.yml new file mode 100644 index 00000000..f07ee76f --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/application.yml @@ -0,0 +1,149 @@ +# 项目相关配置 +core: + # 名称 + name: OpenHis-MiniApp + # 版本 + version: 0.0.1 + # 版权年份 + copyrightYear: 2025 + # 文件路径 + profile: D:/home/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为18080,此服务为18081 + port: 18081 + servlet: + # 应用的访问路径 + context-path: /openhis + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.openhis: debug + org.springframework: warn + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + main: + allow-circular-references: true + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: 192.168.30.199 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: redis + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 文言 + messages: + basename: i18n/general_message/messages + encoding: utf-8 + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis-plus: + # 搜索指定包别名 + typeAliasesPackage: com.core.**.domain,com.openhis.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + #helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式 + auto-dialect: true + # 默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 + auto-runtime-dialect: true + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +# flowable相关表 +flowable: + # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) + database-schema-update: false + # 关闭定时任务JOB + async-executor-activate: false + + + diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/banner.txt b/openhis-server-new/openhis-miniapp/src/main/resources/banner.txt new file mode 100644 index 00000000..2e99e749 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + :::::::: ::::::::: :::::::::: :::: ::: ::: ::: ::::::::::: :::::::: ::: ::: ::::::::::: :::: ::: ::::::::::: ::: ::::::::: ::::::::: + :+: :+: :+: :+: :+: :+:+: :+: :+: :+: :+: :+: :+: :+:+: :+:+: :+: :+:+: :+: :+: :+: :+: :+: :+: :+: :+: + +:+ +:+ +:+ +:+ +:+ :+:+:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+:+ +:+ +:+ :+:+:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ + +#+ +:+ +#++:++#+ +#++:++# +#+ +:+ +#+ +#++:++#++ +#+ +#++:++#++ +#+ +:+ +#+ +#+ +#+ +:+ +#+ +#+ +#++:++#++: +#++:++#+ +#++:++#+ + +#+ +#+ +#+ +#+ +#+ +#+#+# +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+#+# +#+ +#+ +#+ +#+ +#+ +#+# #+# #+# #+# #+# #+#+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+#+# #+# #+# #+# #+# #+# +######## ### ########## ### #### ### ### ########### ######## ### ### ########### ### #### ########### ### ### ### ### + +Application Version: ${core.version} diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/i18n/messages.properties b/openhis-server-new/openhis-miniapp/src/main/resources/i18n/messages.properties new file mode 100644 index 00000000..4550ad81 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/i18n/messages.properties @@ -0,0 +1,46 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +login.blocked=很遗憾,访问IP已被列入系统黑名单 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] + + + +apl.common.M00001={0}添加成功 +apl.common.M00002={0}保存成功 +apl.common.M00003={0}已经存在 +apl.common.M00004={0}操作成功 +apl.common.M00005={0}删除成功 +apl.common.M00006=操作失败,该数据已被他人删除,请刷新后重试 +apl.common.M00007=操作失败,该数据已被他人更改,请刷新后重试 +apl.common.M00008=请勿重复提交 +apl.common.M00009=查询成功 +apl.common.M00010=操作失败,请联系管理员 diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/logback.xml b/openhis-server-new/openhis-miniapp/src/main/resources/logback.xml new file mode 100644 index 00000000..bc63c109 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/openhis-server-new/openhis-miniapp/src/main/resources/mybatis/mybatis-config.xml b/openhis-server-new/openhis-miniapp/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 00000000..c39d4382 --- /dev/null +++ b/openhis-server-new/openhis-miniapp/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/openhis-server-new/pom.xml b/openhis-server-new/pom.xml index a9bb21f4..2a9e65e1 100644 --- a/openhis-server-new/pom.xml +++ b/openhis-server-new/pom.xml @@ -4,13 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.5.15 - - - com.openhis openhis-server 0.0.1-SNAPSHOT @@ -23,13 +16,15 @@ 0.0.1-SNAPSHOT UTF-8 UTF-8 - 17 + 1.8 3.1.1 - 1.2.27 + 2.5.15 + 1.2.23 1.21 3.0.0 2.3.3 1.4.7 + 2.0.53 6.6.5 2.13.0 4.1.2 @@ -38,128 +33,17 @@ 9.0.96 1.2.13 + 5.7.12 + 5.3.39 1.18.26 3.5.3 6.8.0 42.2.27 - 5.3.3 - 1.5.21 - 2.0.58 - 1.6.2 - 2.5.1 - 2.12.4.1 - 5.3.8 - 1.69 - 7.1.2 - 5.5.12 - 5.2.0 - 9.4.0 - - - org.projectlombok - lombok - true - provided - - - - - com.mysql - mysql-connector-j - ${mysql-connector-j.version} - - - - - com.itextpdf - itextpdf - ${itextpdf.version} - - - com.itextpdf - itext-asian - ${itext-asian.version} - - - - cn.hutool - hutool-all - ${hutool-all.version} - - - - org.bouncycastle - bcprov-jdk15on - ${bcprov-jdk15on.version} - - - - - com.itextpdf - kernel - ${kernel.version} - - - - - - com.core - core-admin - ${project.version} - - - - - com.yomahub - liteflow-spring-boot-starter - ${liteflow-spring-boot-starter.version} - - - - - com.belerweb - pinyin4j - ${pinyin4j.version} - - - - - io.swagger - swagger-models - ${swagger-models.version} - - - - com.alibaba.fastjson2 - fastjson2 - ${fastjson2.version} - - - - com.alibaba - fastjson - ${fastjson2.version} - - - - - io.swagger - swagger-annotations - ${swagger-annotations.version} - - - - - - com.googlecode.aviator - aviator - ${aviator.version} - @@ -238,6 +122,68 @@ ${mybatis-plus.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + org.springframework + spring-framework-bom + ${spring-framework.version} + pom + import + + + + + org.springframework.security + spring-security-bom + ${spring-security.version} + pom + import + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + ch.qos.logback + logback-core + ${logback.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-el + ${tomcat.version} + + + org.apache.tomcat.embed + tomcat-embed-websocket + ${tomcat.version} + @@ -301,6 +247,13 @@ ${velocity.version} + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson.version} + + io.jsonwebtoken @@ -315,6 +268,14 @@ ${kaptcha.version} + + + io.swagger + swagger-annotations + 1.5.21 + compile + + org.flowable @@ -322,6 +283,13 @@ ${flowable.version} + + + com.googlecode.aviator + aviator + 5.3.3 + + org.postgresql postgresql @@ -336,6 +304,7 @@ openhis-application openhis-domain openhis-common + core-admin core-framework core-system @@ -343,7 +312,6 @@ core-generator core-common core-flowable - openhis-einvoiceapp pom @@ -352,10 +320,10 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} + 3.1 - ${java.version} - ${java.version} + 17 + 17 ${project.build.sourceEncoding} diff --git a/openhis-ui-vue3/HospitalRecordForm.vue b/openhis-ui-vue3/HospitalRecordForm.vue deleted file mode 100644 index 66fbfcad..00000000 --- a/openhis-ui-vue3/HospitalRecordForm.vue +++ /dev/null @@ -1,116 +0,0 @@ - -// 表单数据 -const formData = reactive({ - admission: { - confirmDate: '2023年10月28日', - dischargeTime: '2023年11月13日 08时14分', - hospitalDays: '17' - }, - diagnosis: { - mainDiagnosis: '腰椎间盘突出症(L4-5)', - otherDiagnosis: '' - } -}); - -// 打印表单 -const printForm = () => { - // 创建一个新的打印窗口 - const printWindow = window.open('', '_blank'); - - // 构建打印内容 - const printContent = ` - - - - 住院病案首页 - - - -
-
吉林大学第一医院
-
-
-
组织机构代码:(${formData.hospital.orgCode || ''})
-
医疗付费方式:(${formData.hospital.paymentMethod || ''})
-
-
- 住院病案首页 -
-
-
-
- - - - -
-
住院信息
-
-
- -
${formData.admission.admitTime || ''}
-
-
- -
${formData.admission.departmentAdmitTime || ''}
-
-
- -
${formData.admission.dischargeTime || ''}
-
-
-
-
- -
${formData.admission.hospitalDays || ''}
-
-
-
- - - - - - - - `; - - // 将内容写入打印窗口并打印 - printWindow.document.write(printContent); - printWindow.document.close(); -}; diff --git a/openhis-ui-vue3/index.html b/openhis-ui-vue3/index.html index 1c09afa3..b5577130 100644 --- a/openhis-ui-vue3/index.html +++ b/openhis-ui-vue3/index.html @@ -9,7 +9,7 @@ content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> - + 医院信息管理系统 +
+ +

一、基础信息

+ + +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ + +
+ +
+
+ +
+ +
+
+ + + + + + + +
+ +
+
+
+
+ +

二、诊断

+ + + + + + + + + + + + + + + + +
+
+ + + + + + diff --git a/openhis-ui-vue3/src/template/FallBedFallAssessment.vue b/openhis-ui-vue3/src/template/FallBedFallAssessment.vue index 0d680f04..f5b17944 100644 --- a/openhis-ui-vue3/src/template/FallBedFallAssessment.vue +++ b/openhis-ui-vue3/src/template/FallBedFallAssessment.vue @@ -1,7 +1,7 @@ - + -->
@@ -202,9 +202,17 @@ defineOptions({ }); import { ref, reactive, computed, onMounted } from 'vue'; import { ElMessage } from 'element-plus'; - -// import { webapp_ws_ajax_run, urlAddRandomNo } from '@/utils/grwebapp'; -// import { useRoute, useRouter } from 'vue-router'; +import { useRoute, useRouter } from 'vue-router'; +import { patientInfo } from '../views/doctorstation/components/store/patient'; + +// 定义props和emits +const props = defineProps({ + patientInfo: { + type: Object, + default: () => ({}), + }, +}); +const emits = defineEmits(['submitOk']); // 响应式数据 const route = useRoute(); @@ -515,29 +523,48 @@ const onSubmit = async () => { if (isFormEmpty.value) { ElMessage.error('请填写跌倒/坠床评估护理记录单后再进行操作'); - } else { - form.totalScore = totalScore.value; + return; + } - // 模拟保存数据,不再调用后端API - console.log('保存的数据:', form); + // 表单验证通过,收集数据 + form.totalScore = totalScore.value; + try { + // 准备保存的数据 + const saveData = { + ...form, + // 添加患者相关信息 + patientId: patientId.value, + visitId: visitId.value, + wardCode: wardCode.value, + // 确保选中项数组存在 + bedFallRiskAssessmentList: form.bedFallRiskAssessmentList || [], + patientCareSessionsCheckedList: form.patientCareSessionsCheckedList || [], + }; + + // 提交表单数据 + console.log('提交保存的数据:', saveData); + emits('submitOk', saveData); + + // 更新本地数据 if (updateFlag.value) { - // 模拟更新操作 + // 更新操作 const updatedIndex = tableDataSource.value.findIndex((item) => item.id === updateId.value); if (updatedIndex !== -1) { tableDataSource.value[updatedIndex].content = { ...form }; } - ElMessage.success('模拟更新成功'); + ElMessage.success('更新成功'); } else { - // 模拟新增操作 + // 新增操作 const newRecord = { id: Date.now().toString(), content: { ...form }, }; tableDataSource.value.unshift(newRecord); - ElMessage.success('模拟新增成功'); + ElMessage.success('保存成功'); } + // 处理返回逻辑 if (admissionDataForm.value !== undefined) { const admissionDataBack = JSON.parse(admissionDataForm.value); admissionDataBack.project2 = totalScore.value; @@ -558,7 +585,11 @@ const onSubmit = async () => { } } + // 重置表单 reset(); + } catch (error) { + console.error('保存失败:', error); + ElMessage.error('保存失败,请重试'); } }; @@ -815,7 +846,13 @@ onMounted(() => { wardCode.value = window.localStorage.getItem('wardInfo') || ''; admissionDataForm.value = route.params.admissionData; - // 自动初始化表格数据,不再依赖患者ID参数 + // 获取患者信息 + if (patientInfo.value) { + patientId.value = patientInfo.value.patientId || ''; + visitId.value = patientInfo.value.visitId || ''; + } + + // 自动初始化表格数据 // 延迟执行,确保所有数据都已初始化 setTimeout(() => { init(); @@ -828,6 +865,9 @@ onMounted(() => { }, 100); } }); + +// 暴露接口 +defineExpose({ form, submit: onSubmit, reset }); \ No newline at end of file + diff --git a/openhis-ui-vue3/src/template/ProgressNoteform.vue b/openhis-ui-vue3/src/template/ProgressNoteform.vue new file mode 100644 index 00000000..72eb0f73 --- /dev/null +++ b/openhis-ui-vue3/src/template/ProgressNoteform.vue @@ -0,0 +1,393 @@ + + + + + diff --git a/openhis-ui-vue3/src/template/img/logo.png b/openhis-ui-vue3/src/template/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..739c94d7895f75f1e7d2b0d64bea3969004ff98a GIT binary patch literal 21258 zcmWifQ-Cbn4u;1z_Sm*<+qP}nI%DrK_Sm*<+qP}oz7O5i^-^7_%F0Uqe2G+)mw<=C zh5-Tsf|rsMRR$d60Urk_2*CF;MKUtr0PLbHAq-SAgL@7*0kaU269NLNkB9v-0tcK! zJ4$M~00AKk{{I6!>QH711f-lNB`T!qsehc~;j23Q@w@Bd-e{Gz<3j|GB6%j4Kwdyt zPyq7cJ-pMY-%b7EZnx@wZ73#+EL!n2hmr(D6!f%nNxr_#(kn0{1)f4#_WJqRr4O6M zcRIyoal$hDIK?u{OH!1Q^gF1imiqA*!I>tLQ*mJ^C`lafi>jhtamVssIeKQbdzCvn z5+@~04LLX>hERSM%fBA^A&9m_q>GV0Ll0vR-FsIzQKgig){kF=gI{bfZd><-2b*`M z>g-f2^dgLvMI%TINT^3AqKVm5MF)#7zU(_@p1pnBq4oLy6a|4Q^oAFRtm-t&ZR(Zh z=fs_=!@i_p!`S4Sw9&I;l8zWTW~8Cb#ifx%NV*xZ;Qa`We|djS#|tZ{o2RdRy9@tA zTsdtl%|}i~4j21iBwq!;>I^0;>omk52vgLlgVgomL&aQxBYq5gR=l z7wl$+oL5gSJqM4Gny|QN8{!>3_KL>ZSVNy~)8%3MIVc5)aIbw^RZHtz zLmzi|8W!p|CkJpZwdo|n+r7u?FyEf;^obAm83L>+R17jE!oIHndF*e61PL`YWyDp-$$-}+^`)^R zQUd!-=D>52kVNGM_Qv4a7L0o4?%+&w9OZl|r1G;QQCHZ%0#W+Q#c4ET{^p<-WRTAL zXNo1H;KXR-6-~@L+R39IRo3C5Szd<|`!P}X?*bwPy=-2pYGl>vj@3cG0!e+_f=p_I3-l@695fk-o50M=Tw|P60-V5EB{$;&;h{Ekz z(-yW(U?HHxm6Hx#{pF4PX*nvltaBW<*?c=Tq{E1ZKl%5F@*l#Tp@=$o?N|D=LIzt| z4t)3=Y4915ev!MP%`E?@Ja~sJnHoh>aPS0H$ani?m1YU)d$P_>pUR~3o39Nt>S6cW z)!%wBPwrQ$vjE5do`*Hn)BwNaewN*1MyCE~3kE52uC3_2m(=^Cg>PGdg+M{q=2VCr zOg^%B>U$@)B-|T$aVr)zxt1G~0I;0pWvP*x3)GMAPZUhBq`w;fiL%*P1KSK0+)vc&_nP%m*tLCfK068b!>RUlS;&$eI@qNzH||`W z_LAk^t0ZfM-4ojogS>ffkH83WGX&C&l=OY;y90d$CPk4U)CD}TK}C2wYd;D4c7u5< zDjwEWKQ)`akkaB1Pv5~s5@2{A#K;M3X@@FaINNJK619`{xard;Da29m49(BujNNf- z%ohX$?B6*>2qJ%ja;qx^6`fFmtI|sE9}pwTY?|xO4oImlHtQ;=9ez?K)5^^>i-C*0 zpBjmgQDR_p-MqmRbUC3y2fFi$>pfkNU-NKgOLBX4=yPV8m zT*Sj0Xqyu@1$HE?3cp(=q?EzoY<)dxd#`Fsng_+(dTByHrc*fF9A_=C(3V@i>;HMD zeJHhkH3`yV<4sJ`#LvxHAKte+O?ewpAoq~}xJ)zhP9wzlc;dMm@j`fY5Rrnl^V~h4 zi*P!aLhW8tACLUr5KWDS!N<#vOs_A!CiUX|C_k9~S!UX=hbIlsd_O8-YHP=AyB=ia z-&K$Dro}nXOh8G{<)8}wCW}>NbH971BVnWlNgfYkbg;1hv}CybR$kyEzF;5?oH(;Y z{PF51)TX1BC+{!Qbil=f^Zk(F7cf(Go~`1n@$})4px$hXj+4Nr0tRntHSJ#`)NeP& zl>3W7??aMWl|;_|?ZPZ&r0-YzrL)gKGMlyu)AkgbqszjTjlm#CR9Kfgxw9rEueNz> zy(h>)!XY1BFj(TeJ|rpsy9xmpwRgZogr=^Oj(IzJfH!O_ur>F(fEu{emQRHbMs0ZX z?scESuBjNh7pz1Ch{Wj_8Yg&ptfL_*LmyoC_tPerxF;jqc{hjO@L|60hmQ2PIP0%h zz3@M-4`me-EW2h8YYVu!y`+gavzUDmy+0}YI=%@Kv+>74E~vkM-RJV80r9i_FuA*{mp=~?BhK*U4hdf~X@;iq z!If?KH3~Iiy{PW9TuPP0ZO&fJ%kSBU-E38HcPp-OT+*cz4?1A#WuB;rbYV0@!5(`i zl%j?3xVEg!UrDEZTadGP@Lg|N0Gbr9XIsYy#J(v@UuR8~#}ve>QqNR15;8l^?D^nB#6 zgM1ht;uC+;=k!1=NWJfu?GD#;6lbq6TAY^8jk>-#k^}=_ymGZ#;wjRO>z-z!++r(O+rzu)Z_I?a9C%sEEAKY`qGUTi__kLE%It0pA7n`|ldR`G>Tir> zR#|tCx>p7XsK0Y-6)lk^>;<`)K)*O2D0;zOGFOaK)sE7m_w<;+#rvm@^EIM4x}P=8 z#$tww5-S!98iPYuvkN)7p(@Z#?nmoLIM2A~V4>agH;D=ugX&RL+8j>e6`Q8AzWQei zJkfKzVuT7Z(#=OW++dH+S`|R^F+4Xn$uBy$4y$- zx}5AO4jyR81Q#BYVATh^`Z3i>Bv< zUnl5OI2Z%HwYU@C(TiSQX21q>1zk$RHA8#}ASFF|qe2 zAqFslsl03qk>=5<1DWhSyLvM%SJcAadRQ2jgVT$UbM}p>2ZvE<(Iny`6p=pZ;>w1} z?iV^$N2wf&4)u$3*2m?y2+Eqv6K|XZ=J1H5Q>&>2uPOVs%4H7C^Op4o#}|DPSy7g) z=iE&K?1}np5JdGJ9T41;f{v>(l7HwVPgW3L?}k@UVD$4MKMl?z`N@uy)KZlYYx~EA z>OT4-eOsCnaCT%Qic5!-kU{h_^M>Rs#9gjCecnA?>fNtehkBX{^Brdt15RS#PLk!o zaceA(SFo7ipjaDCZIA_uQ(5R|B4EWM82uy(g>q-0h?GQs2ZhN{%B>6Q9zNLBuW3#< zmy}z~R~^lrfmRiw%>$hHW&;BL0}e8$=b_6k?v&Q7Z^fosM)g2E1KW8&65Y|wnS|_3 zA@+$w0Ppg1V}>1(VEjIpb9L2Rzdw5FoeBh4;Po`g`qRiBkEbA8*f2kkLcuY=!BxJ! z{x1-xB=r6QU8Frg3fo0I)bZt!$I@z5f^9SyER=L=GBIK{+C;`3UZ7ON`IM_(^rP+n z>6JA0M!UZ>nucr)>DXeqP0413w5l55kx%VM{fV-nTVicp+$dqTFa;Vc@KsDPL6sp+ z>_8N6jA^ouqjE(TJxJC}{(rt4wrwv=K=6&@;0Hn>1+Fcw9{yzT=Y_M17_uMY4 zJ!=xzFsndJH8hnNMNaIi=jg#y zZ)!tS`>VTVMgddK+&3F$ryy@GqK^Lf+nww;EB7fgz$H)ZWm_TrR4u@0mLPEZV*;kp zlR9y5ZMI!uP{D}_hM0pR0|?QHJvA}^-4D%fXB>A*k5kzgN;@;c?rw{S=)@;LK+hoD zErmf}(N&#Z+7;9Gdho7xH)j2Hr+J;lAA?^kaB_AO6l>t9{d*d~Io6<;iisu(cY*nOZHsK2^=7)o^Ub?LG*$gdz97m@-@jt1fab{xm1=$yK^Qws;uL>*dG-TDS660K36$D70Gx5#*zLO|EV|CDRT!`)h#6z_-GpY`Ku->&-q zT5Iuz6C$94x+`P!Brdc%y3>&iFq~<$*L;e?(`qrpljr+f(nufsKXiZmjv0e_T?aKS zsqODulzXNKgBIB>Fr|aLI*-X3N25t!BOX@Hp{tF%#i-zY!p1;%?-eZ_!GhSWdqD3Tkw> zYA{c(LQ0C350zAEY7{`NY>^CXR{)CkuY9`OYgyKyDI;Qr;J@PSnJfW<{quJz-uG)E zfVodns&eQ#$tZmk9P#F_`_>45*`3dafO+qq`A=eC4h?oql{V&t#GRtuP4qs%+Hs_O zUf@>DQ(V?{d?>w4$bs<#^ktu<{-4gs23V6orKTcg&rB0s?dLp;J;jb`m{0ao_jK9O zM*hofa$S2n)yU|o=gvbwXUzb~rH9Dv;S9Pg8FFVUIkRzi3Zf<}kC>>Z5g!?T1Cc@LIEG=k`pbnOT-tqN3q>QS}TKCOQs=xoqe*F5A$wO+rYYE!D{KLc*vs!~aqov>= znp$`APby&J?6N4qLO~zi1Yc{mg@T+!jmL!G6MU12&uqi=sQ6GMorUu73 zs!cDL@X%YbNjRm5d;53HzE{8ZRPWCo>w9uIe5GB=iQ7!j!2 zKb{ovxjBORU#mygfvvTdcZ$xTshD8;S4Js_!D2p7#an)DUpJgTQ{?$*5N3c52T4?DR^Ue(hY1GIX zz2Be|_~m$gp7Npr@9w%_^P5ZXuj}>|1=ub87xJgfjGd~>`CL#rj~9?r#*Zux7fEFu zs`(l~$<=SO(FDotN)~sN!&6;rw}l}@vUh0bY4r~p5F9CrMc0t?%qFtBLFIn$Gos?_ zj0Pn^6e-@jxtYH6p(?^b>}Y32_jV={ysF+^q>4a2Ii5Ln8;-A_=;q+InR$~oS6efD zo@v%ewE--lLe`(c!5K((u$NGa-vpvS4@l=NZ)d}$b~xGRf(C3>BOjn{-KxtVH)Ok0c?GgIqXOCwJ}$LE8Ah%q4@pN?Qj`F|a5>uqSePd7t=4BMXC+1_>*)(R>G78^k&_2o%XiXp3lG=x=X0>j-3PA(qprsbM|O zVWSLAclmr<$_LoeZN{@&W`8xaCvONuC3tplDsEb@#%QYQ>n4mr_M$o7uOU5D(Be`# zn7?nA?wc|@-&**19hdrUH_Utc#^kZk+~x_o24;z){X^b=6_!pd*!Y8T^A(xKKrrB@ zV*Iqw6riT6e4`_0Ze^24^C?)X9zyKp?~l?t^`8ik9iID)mp>{fi0*$+9*33H!@5jd z!JYimOWUCvo6xGH5Y-j_mu{pn_=e_>CMxYG*Eyzt*y|q4Rc^h0M2b)UawO_6jp4Bz zt|zGdLp=pMaemq`adJXEGv0oF?nU1^h|xeP3{mrt!1AF$Ir6Y1a)u{N z49qMW1Q)fSsP3Kl?#Cs|N56P~+}MBhy^yHLa_z}`+Wcr07F>>YFy-%r(F{%MB7hQQm-7sLhJQS!ME z(Zxl5m}nP56k1af^t5a7M1-XKr;LQYT`8%{`uL&|@0MSPLsLk@+wQM|iKaeZ*~t+f z$mqvHBxV%mb_xWLm#Ur{0eIUp*9I=VIG z;zPUk88r-yB4om=F!+tC8{nk_Wo34*+Grh*AJvHE3*{7{EZp@ zs~`H=k%W69Boi_5pf{{XS3wEGBy?lz=ZpQ@Zp;{D-vRGRTp7G|FO=EHqI zm+kq}cmm}y8+CXn7pBWkRCTLH5%VyDuws_tIG@glkP6Tnwsu}qlEZh!a%)whBVRm- z$+jYDTQP{j?mgVl#U#T++Y>eHi3Uc)k~-AwvrEK2wmU^RRE2KWlfVy!BN1OXhf~f& zg9VMOlL%n$u4ftwx&I4M+V3a_UHhEE(&e4#HF%lmyo6czR?MO@;G_#r!iF{KnZc!Z zFt@GZD4Bs8{SofNC_gR|^=1TA0kta6K%FXqfV%z`N z+I#=_mHOqQ;254<@{BSwuE{$2K?1yB(Z2Qm3vu1A2014FnVf0~Hpp4kx>O}nsNY_a zH1^stzpduhNU*Up1_HEIHr{Bw+QgCRN8B@F$+m6#eHtL!AcYPL9}ZAfTamEOrQ&h1 z6`igYO7cx=3MehwlChOWu_S-5XYGo1UXzlwT!i>1Q}FfvNk$$S^=Tw8tO$T$1_BAn z5fZ9dQypJeLgC+0?R!=sX2JsBwPjd|J=#eZ;72Q#fSbt!XK0j~ErHPz8+GrpLXbup z=xZMgemjYq=fnyqw(iU|XgKS%wXMLzC=9wR6? z8S{TmSO_R>%$IYGNgV-FuD?7(VOLKq&W_w^_I{AJrp#|Wps`?1K{8mt`^Kb)IKeZ1 z#^I%2qQOi)5~5z2)70h7r)L-N59PpYV7^RI)x=1*i$N$?9!<5m?mpop;W9XdG^`Ef z?EI^AjhnFCzRvaAOoJz_Ur=qaw){-KysW$)5K`K1vo+5t?!cfxLwDT^Mq+KyUjL(0h*6Zf?_9sR?+Tfgt2xm^8qgznUG`i^l!Z)NlkaQ&eCB47F#~Dx76UM+~GQZ8$o1%cP(po z%|woq6C1F>5;O5!#BMc?K9{#qMfOxpSDE_;b8I50F_}mL0qx#a&*}F>Q)o9$?K#HZ zq#vq)Qz;dbwl-wAL0UiYh^Q47%fwPsxc<(JYXybO_XX780hSzZ+|trc^EUY#xtfaJ zVlwEucUctl{r|6R?3`q9`*HbI^UII`cjt0a-tKheY0MmTM((LC1S&GPeO3p3(YeB( z!}}D?+m0^R#tlUbx;0L1KWC!dWMWYa<~*OS$j-|fRNRViI^G`AW@rio`js7zJ%R}5 zaww=o_nsOX`ff#C4k+MSvS*N%Q1{%kCj`9aLQ8U5S8)fdZ+kSH+*)BCUER+< zesqw8T}($HJDo-|=KT;~gGC>{bDh!9gu8U1U!D5%1?{y+r2d)nm6T=)_TM1Tc6bt2 z-e3)8LXO@KZku4C+z6$ou^92sY_x;CU~nK|?FB`L@RBuNeG|_HC6N#K>N>Ix{B!2R z#Hq$04eNOP`4Hx|4L(gXb9zp3Bp>>GxSfPFxwwK?R&k-)$KT?o$#v6u&SqgnB5ERZ zk4`O=Bn~ok7}f9n#x7d=b7qyK@ag{*zwrz#WoE*2YezX!JZVJBrMa?ojD7d&xCDP; zQbstJ+amFP_S9?hLI^T7QM9rZ4WPnZ;cH|QWi6WhGvErJ+(hy#rIn!mBD)*ATuqQWHg4UX#wLRXwPz_*v!WP3Er@Wd%Uuz6! z8$UevKA-_11*oD89KD&_Udvbfx-tM|8{lsBT%Aeq>#4S!n*HIR=v6$5|12~Qnm5Siw$zXEn#qGIS)JgW4A}K8GT9fq^K_zE!ucD{v+pec9$;l!1 zPKt60bEqw?8-aHX^OHPy&?amuS9%-_WB#FOuIW@P|F5@Ub zzoSUI_Kv6D(&f7RpB;T`KjTUes+nWTwwzCZdgSPc$R?7bN5WZXCz9W5?M)nTF7_J;C@Hrh)w@WzK5AO7}m#TrlnaEm)9wznDjQW$Jt)2=M^n~piDGm}f|~Jh#GqL` zCoz}9Pf=ap)VY?3`F`_~IE9Z@BSj2`4o?Ty_D!K(Jvug9#nGRo0l)uIKCil@<+=Ar z%N&ivMK_Z*&DDH0?r^2VkW@-9yVnF}u%n$bxFiHzCQ0m@(|*(Khqi1*jaT~Ib4wuFOR69h3m)J>kx8pgyP=H%meg;A4;SlbvK&&%#J&>o$uD!- zKYaf68lIS$)?_0Jk?3#!K%;|+e<-379d-ufLF)Rc=&fFbe`NZ5EhLXoRWZ>x=^{i> z?uIJy>B{}ov7slKGUMV(3>SL`1XjsH4KSMoQ=l<&;{>6~Tedz#>EIy$-~z~=9MnDz zLKhDV1r$OxT}03c!ec-{r5^0 zftMpSWLA#k^WEyGi!pYPA*X-w@t}D=HN~?XQxfhGjLOSFPamUvgyJpXuK}d8nPgeU z2qJy{Psn5W?=7zNj}JZDZO-Jk%K@-ZT`Q`Pem9OTVLAtWSEmFns06i6qVk@Z`_Pdg z>DFdOL&u-sZoQ8(7XWrL;EM#S*?`JZzzwgZAITdBc!ahGxBx@st2yA+Ns@y<(?;n>A68z;&3Ab z_sqa!qST(XwdDHiIj<_U961CBiswGgGU);|j*dE*k-jJKUp(y3PMoJt`kgDwfj#@d zg)!mUXxJE#N49LRhClBDSw;!zhcPqM0xXVZbFFrArZO`NS0J7Qb_Y8V6Y+Yo#`LRC z^qOBAh?u0Ziw*Gjouonv|2NRylTc5(+^7+PqIT&z4TKm;LV~(=mhD>x-qY!2crq}4 zR@Ts|P86UKL?2~rc$%mkWwUA7VtJG(SXhkbK_P)n7f_#9+CCWGDAjL#sR|B6E&gxs z*qj(pcu9qTtmUdqGC)#8J)Pm%Q7AHTanBjn2QwPGvlBn56<@C$z7wH6R0fz7g8&55 ztm`mbT8F{$GRNI3u$?cih`_L2)HX-(evTi>u~-`D_InAG8%;UCX!P=mtq&t^GdXp+ zZo&*6YB;q4Kbe>F1-1TlD2o!XWcMO$#s3~Sk`2~}23{ArZjbc<0zOEkUIR<(pP-35 z%iBV19jKtrMpTkQKkx4yRCqe}P(`G`^>tt(SyrtLM@L@o_t=8KkaEcn5{(^u`At59)TF-q-AksT#q9%k1=B}eqsIY(U;L>)I!y3-t6!iJm zv_LvFroepVx)!4NRJ7zMqxjQ_xdMt*Ui=uW#GVvu7=C;3wlL0msJ{H}>2)276cEGu zcBd25{HKQL(N)okRG*4zVOAAliTef3MfedZ)bK)&Y7!oToji-HJVIB zwT)I{;rxGShRoEwolkt_roKk!0ax&#JgI|7%#E@5`|m zP1IPQ!Xvo7WP|ou9+Lb&zH};qrM(OV)DOQ1k&s!*!^nf73^g66q&hz5sNjC2N)pyb zctt9KFQ8#)e0CqQ-o(H1{uf0eWUo6Q=H%dh-%mcY#GU7~y9pg5nLM=!i4blr?99vr zzi>nz8(eg9nZD9W#hRE6Uvre{GaKZ zHNT?V6824{ihR@xy@#vUb|^3oSpI;HP`%;jzG{+6}-KCT5@8pc!&-WAvtM8`tYLNYlDoV)eZIgsGpv z^)6pl@5Wb@mkwDAMQv!*QopoA$8N=Xqg>gbH@HdVOAea~=T3`53j#iJiAVtXclCt5m1ykaf;%n92o*VfEE!i7u=>(9306%1 zHj=gCYa}1NWYl-H9RTUL;INr!1`N4ZPW1Ln|0^EcN%erF0+h0xnVV|acyghinb6Pd zsC)aNt(7DNo=CJB&Vub&}I4=5Z&#wkfU~ESD5F~HhZIx8;KI*YcMyg?Ren-L&?YxuBw|+|= zRntKAnt@|d{k$}>_L<@k?m@BG4b>j)h9hMusGp6po;56TKa zJ49ZT@E6KaF=fHEaa%6PR^FPd=5$6!j;y$EDL6X!2ms6q-pTuWw_fhl)`xyJ73 ztif}_ZAruvvsj7%yt82Ax@nE{pMG4*65e$Mr$?E9 z3W}d2bHQx4mD3KNk>J6;aZ$^#eBfuK!hJU72M6E%#GfubT+hSI{Wrbdm|QzA?=D0W z6J8+$T#7{2*7C0Q5=D}*IomAcMDuWQPbFO&BN=%OLxY7Z3n@a7FwuevejQZNMut8QEBS2eO- z@#k*dC(NX_c=`V3w6p0x-r(2dqV@MDiNE||t?Qh98lqbyF1NBJ>l=+J6xuUZUDMkd z^62aY?d8S&_mIQ&@g&N#yT$bHa&26&ckHq6z;z+&;%$Einslc->MH66ANj|5oXMYj1`lg0y7IxzsE7-eFB@&A#~ri0eK}oEHaiPtY|c^uz@r9n(3X~eW4Z`f zqMuw^AMMFl99&mSyOeuVQw9mX?1e1(pZB224f8#jkHHrAu&JjKpZU+!7?f?rq=NH8Zz1Cd%1@Ot;engD25cS6cB&qvZhX$x8*OLOK zf3(`}bqc`><6TNYtR8FcMAa~mVm@FP5}@$c+x=e9K{clQ0y!?Zn^Or;3b`41TYj_2 zfjteM8UUbJ+`kz7pEU8e56wJ)+4Y!;+7EIu_WVf_HIIiGoUNWs(j~IAY&2=qdA|)8 z-qB2*?8JdhScoe`CLbZ#)fa@S(6Qz1{mQrJl!5!$pbizZJb(zbuX4w_#s*e}29yV> zY_iHE`(>0Ke|EXmN#rdWWLVD&0xsDIkvs> zIkGFs#ZYk0giSW*zj@X+6H~1=+`*&z`Nk9R5=p*ukU`>9TNxRLs#oiigZvXM z4C{Ep*yx(dkqFLKCIxM->k_@oumu`Xuk8R42fI0)Ku^z2L~+-6v}VKWHXPZOZ>ilb zY2XUE|HD;q_OX))sp~@pA4^O-yODgZBTGJ6SRz2MuD31m%i8bfs%!)_LG+WS{;B5P zTb=3JfBV$K|5nR=cGm}&6M-~1+nLWyCXa*!!t>z9RFJs+pjwaC*8%bND@DXE`sVJE zRwGzQY0bGT7ZRYZj%8!oXZ;C_FGaofQ(qeb&p5A>imIT4gK@g`yCcmvIEsXJEnbFs zKb9j6cW2hBghCH{Q}oc+Oq?FvJ$ZOr0QGGvM+)K8hBy1mii&y^R3U7n7M*)5&g`Oz zG%`bbC81V#vSZmOWAEvJsJ>Y*K|4Bl5|WcO@Epdj4G`(;pW>LnytprAGCtMVC}RA? zo<~jB)~SRfNdbfzKyi9_Kp)4%#ar`glYfPEGeF%pGwp9fs$w7Ce=z@hOMfCz>Ea`+ zZX*eIPgvUp9E}bE_BEU|x;Tt15n^g!L^4Rs4cf^Q4+B75|ATkk@6Sl&<>U!J_J}pM zty)zQ)lAbGZz2s~x6okW-$_&ZoIn=LkAP)?_;qIy1Im0!bkS$g@7(XXLUpF zUInINf(m=BRUl`2S{0WLfXhLS-b7q};R{6yeiR1}Q3dGfF;4eAw)~o-Sdso!n+D6D zx_y?c^*pt?@$BdgJiS3o(Ehrt+*P07MPQ^<$oNI*Y{txGo*lTG|NW8xqBoit5!pbF zo>%iwgqM-~S-A-~58^5l>jaK~f`U2>MZ!3%u!C8BbXBd%#GFceFt5qN?Jqtg!NlE{ z(hkZ^m5W$6HB?N;=!{=VLfQA1R-St99Kss!x1FsX92O#KmzYqGEb3U7*B4{iy`lw_ z@X-ITL@g7%hnFWp{ZrK69a#ZD zW8FDct>r08&9CmdAoK_jq`^i^{BIfPs>>raSI+LZH%wtfhMGkbGvr}-Ty9g6H;4cD zrOtG+dLtW^LDm7-zl#rKGQ^9dC~1DbvB?2pKupv?rNGIL8Vl+rZ*B+7~G_h+;LCaWEI6@F;qw182nxu_IR^F(zHny z71(Yx67n*R4}w&lut!}dYL;{6xuLk=In!PGf=s9#qaE&)0CPIt7e+OoC~ z)KIXs25qRLCxavc(*sI$Cl}QYhf+kpyq|q2EAZ)~6gHHr^MM08aHu}Qy)c<%CU>b2 z6J%i;P*U~IqZfsj#=YiiRd!A9PzTol-fTSYW}W=bAjlKA3xk5&UFgn~t_Efah3-|k za7qCSfS*GP-@UJZ00e8wT8G0-D<;oQ>`z&GnXVl47ziOJIU0xB$ryWDriX`pVV%E-C^Dsfn@H2zJF*teWa3>bnz5kt<-*%Bdz3DSc}8rXXGR3TEJ zoi(!)N3V$!pOJjIlmj8Mw7uRdVJYzRJ4Uw8!sCMJ|JCkimI3b$QLz zlB_;3=pu!-NRC9Pj4e&WJBn*G@!ETo-7)Y8b^G**p8x}4z(AEpfY9&t=A692ojyDr zU05=wsO=ctN=pH_w;*zzvjW$uY}|#`l+^Go@ho8I0Jq$lxUen=0G&RGpSMt{7pXC^ z%|}Sg;PpKn5%O;~GP; zputt);0~2olZSwVD9|Y!qKNc3fH5K;8qGM!R5u2hhJ(4R7gl$dP|Qs|h>u@S6x%g* z{*fuK+BKLA48-rh|G4@HD;$($D5GetNNq0^_TgO~2iO(gx}Ml3$N?bq`%?OYz&c)M zWVY5ef|Qgzt=ExzHq?hwL<59wr^8;;G_cVX*+>)o5zb_?)MMUaPuED zqrS=YAO#1ku=OIyK!SKdzJESGDv#LdJ(j4&@N|I_|5-A0{|*$FhMBml%9jr%TIx{y zwN{4SzNlUdEz>3=AwueRTVqBgq%5^IoPFBfx?=x@5^8i!kH#l|6u#*lDWQb{yraQX zhbbz7787Hk@^w|`3Lup1&t%N&3eZK7pv&RXwlZ>0T$gR1ZP?vS*C?BlLf$_;*y`fJ zAN^&&D5MaQZo|0!B{@DrO4tn*R?@?nrJog-wu7!MEJ$@4Z(|Id`+JmYE7_D zIm>o?bMuc5oLuZ~K9&Uf!BJRk{{`{2!BCcR_lDM3Jc?kql93Ip~urylE;ICjLMC z6Lp4{zhhYsnDzj(NDh(=@c83EKX7J9I#ucL;yND1w;U7yYABe`a{Frn7Vq1g7wH4~PWeH5UCKP}X>xd`u=co^At(gZz7sOI@UPRRWjxS z;%bHUJwFN>DT8j(P>~R@WVxLq2F}sQ#+38l+X_?PE<}N%^Q<^mzO0v?TYJirk#i?m znFovc1zU2mkA`zayHZ1tCa{02vXRDS-dw5he@^0K&uEWQ_B@hDhv&!MNkZOcGkFg} zwzx>f6?|a3ogS%qB;y_qqV33h8>sSVD8!Mj_9czm@PT%Qfx#muPld{ETQU z;Gp+m^VcX2aaTN@B>pnMX;_VTo%H{msl4Puzu-)j?i&7{D`T#>ySoqgr z`)Ja*kws-CVU4-lvQ9Z_d1uQl&Hj!rK!0+PLy!{Gw)zr2{Q+wDNOW4s-BmEy&$Hc( z6241ef#dlb5;gXwRugZ8gGZY4=M-j)uq)zhvH7H&%mWG0+?0;ZBUgYZ68&f-4Yw8m z-vEAF6_cu(tRinL3gVfK6LH;O0YOUQleoadz8Q$MfXlC|NJOxKWC;g5Fh$!|K@#4i zFE48eSq;8vd4zPHujFY$k}WTv@UehDTAqY3QB@TjHVuRo2RppTck7iG z!J)c$RQEhj3Ig~{IFdG-0WW(}q7r_ouny6aV}5W2`HW^$ojag~#dy1H*W|vYR4fV=mNgr5 zJgFmoxPKM6OkZwWS9f(&4`2v~ERnhb{FoJ{c~w@e&f!*7O!UKI+)So&|fu z*?~|xE?Uo;@{rEz{}nQ=Tb#@fW+<^&{>n_+H&BRpFwxRm4dKq|5uZzh$GtR2EBi+4 z`f25Z147U53DcVNd@c~3YIk}sJ09g`77tlYMA~uVc`_+lUk1ErH3MzZ4z=3W=paHw z)Le6ka4~PBvwc}W`j=-LFX^V1ys?UF+RGUt1n>63;Esz<$(Ww-3(1s}!~!f3xOx+A_W}j2Be(SMVvvm)vn=z0Im3mixZ!msKGAlB&ZPHqYoU&!Nn#%Xq99s{l8s12Www>7*(MOC_X+%UnZFL)&+ zQcT$5=F2WFPwjG=HvH4m8n46z=u$l$)H^iHH|(Az5GqDOGnzDSzMXD~LcDQ5Y#~Mf zUef(DfGcx$S%@qr69%A1cN-VF{F~aMY9c%yv$%bS7zp!&N<1cTznC4BQZ{UA6~1jh zNU#2ha&|JWe^U{nCgc_iyuJoRb#r6`i%QC4qkp^cJR|_S9AZ)1%0QvP4J7DM%H?N~ zJ2w*9TN`GZjXG}aZ;DK4Jggla`^Bc}z<2hVXMRm*qm&~OwGMt>XaUp+e@77BZ|2Zk z*>10ke1N0!SfO2PH!xV0w<9sfw+F**4Z{+PwN>oZvFYCOWW?QUF+gI*ll2zj6R^1W z%qNfulN4&|B`GZAdpA-b`|aV*n1-ZYOVS&~XpJRfTB=^18Lm*RuXNYmP@9q$r)&PL zpZLZ*d)St|_7PVCt*xEdU#uo;+AOk1+05V`izq#%V4+>W33ZoKcOrSz-=27T1Cp1y zJ2*jPPG?$*_j{KEkhiW3j9{UvPR@z|GM}Vx8$jCttFpV^EytnA6C4euZBANRuRg$A zBa*+5ra=ApiNRP1G(uC62?(&hD?^AG(vU1`|xXX23v)IVtMakOXKi(KT(bk zaXOsD!5l2-J&aX0oSCr9U%Rc?fy>?62xQ=)>vs}IMhNWA4zLtDGGS>oT@l{ub0n<~ zhCK7NdP{<@Yqj^bMC}j#iw!0tYo-IpzynEi!~ZV}<3QGsp-K=Q_IuWyWaZ)J8g(t( zvjl#~@;?8RKJIyiSlZc~PA_}$atTE02uPN;<5ioumD2<%mBqxo5CWL)+ePbirZv<6 z1`5EKGhiSlJFmgIa|RshfwAHC+^P!D$TLrK9$ z0RwcyeW$Yps6+2T{n|Za1ZZBCRrFU!T01A+xhfaE%A{PtJ)awh2*F-yXO8}@gZ`)< zI5LwV2Fj^Lc9?;yB>Q^4ekAHXt5fIM(JUfdEQrpdvP*%1e#z2i<4>!|G;;9_r)@p3 zD?ehpx~VyVG<+R_ z(}$y0NUyiAAlog2@s@1u8F^?zu7RA0-l>vh>Q1}tnF@^HXz@2j%C+P!ZCHUT>cfq3 zN`-BaR5tBBeCagOouxGK3%{NO!kLjdXXHbO_Sv@3`Le{s;Hmb1 zS0}XgGzV7-AZC-ME`QM%4Hmq*{h{6c_6^{zkxyDCO99?Qu#|3+b2Kr-0YW~+G?BVF zu==~{=b9#YcsrQ8G+s6M+V=}{I&$$}EIC{jH?Fqfsl=%E4f_W!-5ki$BE#1YNrL|&Eh};V zY6etc*WySr;zHJxE^w2dJGh0(!wOS$eu(4jfzJgtne<#RuaaxbKlsN##u$$X*^ z*85J_Z@DR|kV#6|c&DVKvdYLkpLWmN##lf;`*XRQ6`xUMp|m(x$m5@ZF~$pRJB2Qx zL=vuB0V06JX(RV8eE8dSkcQsNGc4}WyF<2@FW!Cdw!)al5-(=cI(K*Q0{47MPqTL+ zbAeJ#;UL`(ztZ#tr}a-svz=2Y(9M zFKw}k_3Y$?KgV=rFS8v2(Ro&WKkFlH;jf&t(}P7uHK!A!#_}2a zJA{9hA~;!BaQa`-N*!Dds!Zwh>kN5lVp-qkFdm_O1BiBy36`I&*1u}#hl>yb7Gqc@ z470Mpfwj8%IJ2;(F3mBV4A|;H(Cz0IAzpCqS!(j@M8|XF%6dh9wV3SZb7>hb$9XXYKJjN0~=chtA%rsBFXq{ zC_9Bil^97S0gU~ZqJcZ~a^7D|pT`M|2A?0DL}|?w zqe)bQ(Awh>nKK}7m{l=0MiXO-O}vlwaqGdGDtR(y}cBn(Cp*hNjLImJMpGXwJrD&0Mkm+C(DFe~UsxwQ85WM-x0cEF&~-@xHuXF1tC|Mlq_l#E9$#~* z1kQA}?8fm35QbAGnH$0*aK2-{38}V2v1P#LM?q672Mx>!i6lV8+YF+B8JxDPltP)#Qbs#V}KOG8Q4g< zx}j(ZC;8g%D40Uq4PLX1U5GsBC?Yy?2CW8mBo=i?ySzory8H4x39M(jRQGms>RIq4^mnOs zYn@dy$<+!BL6Rx#`^9CDo3WyXfF4`uiN~vXB`SRpA@sjr&%X+i(PY&FuvdR@IWIk} z@{9_M$du)V)qL#G^nlgda9Ub%c=)9JTyfy)8W60-nlVCFovS^@Sd1e%+Y^u7x zq&kU4q9%W=dPeg@cPK1wtj4)aL+_bf22aHc5y=p}QYM5_VLYg9QP6c3Pi9S49x>VN zyb!$3j$>h3S83f5xA|QrwjFa~-&e5W&!}4YYdr?H@eD3J`P$<@FE|NMDzxY46wF== zIAcdO)ySp;fdkCfqFloSg$1_Z1RqZbcDe)|UmGDIM?V8I3i#a#fzU?0L4v~aI&CPdGy`y5!3ng`m#@*6ZK97KmApg>`bxd@nzo+Ip_1j zZphNUy?LkhXuXXs?vcr2x4Yx-R|s<~@AT9GdG6p9wgyOh0~_uWW>iA1&XKPn*Hy2f z3=bywNHsun+O&080pzNKvXwxu)Lk6}PLnYRPp*81==3qMsB4EuURp9@PG%6n+c_x1 zS%)fpS;AxYjDqs`RL@9>Y6AneEehg7!9IE#buR^RZWZ&-_?o!*eA6alT_6brKC6_J zKe{0FotY%2=*D$95hAR>PZ!v8659@c@5P`^c~gIyYTWnNgI`J`lKrGRzwRbbo9w35 zq@d<<Z4@-w53u1Q|Cjq>RG*$ksC$b8aeyTAMf=Yf|uO zsK>>FgHE)13%_&GVn5yR_w@LPs1e91@t^6*SLP%#(ztAJ2pJw*g7~LYGm0lGBq<`oc_A} z!j$Wu0KISE44D3PCr?Or^l|7`8)_uog+nfn+j>vajr~wA9g&v-`ZzfB!WhVujnMpX`OJ7aalOOP=lSf5doJ z1o5NE9YskFys9!m{A*Z$%u_@>RUfH6B&r+Csfr9EHVB~3QLu+C${8};P zUbrLuS#EGtn#Q$5xBq@TQXp@mpceHBTskloO7%Ot()fX1PI*P4XA`VuhZE-fjMZ|F z8{tQcn}*~<6q(|6g=aX-f^N#aW6qfv+iyICPEw-pUw|NcC_8LO1L#J=rCpZYpt1&H zd||yzh~{YeTcdP9g<1UaC{({=ME_q{R{?NNB5W39A0ri5W;;CexWh8|{|f6s z-5DsXW3bsz!mAc08X|IuNcYYd-Hi95*TUF~i98sI4Tbn7Cj1)Q)Hk_9oV7N2v{u8O zU@x3ekr4^JfWs*j|4>q=D|w|a$m^#uxjcrm#Sf-+yGR5oy7?TqX9oMGl^`;%A@Zw~ z*CJ4Qo4vBiA7yD(ZTNsVaRT%6bq_a4iP-FEmU~>VWWx$M-Mv+>#@RS6)dJa`-ebQ> z4JDC?rQ23;2_OhHOOuAu+1T!w8lfH*it+2$=ccsl6n7BRyG-^;uSbVVuh}4P5!Zw0 zT&jWsEkHO<=3{)yV9|0Hk%zI4qLHkCmPRqxSMT=QeeEw1lW6m| z<5m;(c+R_E+4UU#!KW3 zEW?suE>%MsO8mW?tAM}UO`XAL7NiHYhfOoGN+LPp1ws3lb>+wIuV|*_0Rz6)lvE~V jm#j&?$9h*DKmS6A-%k$u=2+!`{z@#k3R1a5(bVsMCJnj@ literal 0 HcmV?d00001 diff --git a/openhis-ui-vue3/src/template/imgs/logo.png b/openhis-ui-vue3/src/template/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..739c94d7895f75f1e7d2b0d64bea3969004ff98a GIT binary patch literal 21258 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 literal 0 HcmV?d00001 diff --git a/openhis-ui-vue3/src/template/inHospitalCaseForm.vue b/openhis-ui-vue3/src/template/inHospitalCaseForm.vue new file mode 100644 index 00000000..c30def33 --- /dev/null +++ b/openhis-ui-vue3/src/template/inHospitalCaseForm.vue @@ -0,0 +1,351 @@ + + + + + \ No newline at end of file diff --git a/openhis-ui-vue3/src/template/inHospitalSurgicalRecord.vue b/openhis-ui-vue3/src/template/inHospitalSurgicalRecord.vue index 7696def0..0a77f861 100644 --- a/openhis-ui-vue3/src/template/inHospitalSurgicalRecord.vue +++ b/openhis-ui-vue3/src/template/inHospitalSurgicalRecord.vue @@ -14,7 +14,7 @@ label-width="120px" label-align="left" class="doc-content" - style="height: 60vh; overflow: scroll;" + style="height: 60vh; overflow: scroll" >
@@ -23,29 +23,29 @@ - + - +
- +
- + - + - + - + - + - + - + - + @@ -90,11 +90,15 @@

三、手术详情

- + - + - + @@ -102,12 +106,20 @@ - + - + - - + + - +
- + ml
- + - + - + - + - + - + @@ -177,24 +197,27 @@

五、签署确认

-
+
请手术者亲笔签名
- +
请记录者(如第一助手)签字
- +
@@ -212,12 +235,21 @@ \ No newline at end of file + diff --git a/openhis-ui-vue3/src/template/inHosptialCommunicate.vue b/openhis-ui-vue3/src/template/inHosptialCommunicate.vue index 1c81e14e..b193f15f 100644 --- a/openhis-ui-vue3/src/template/inHosptialCommunicate.vue +++ b/openhis-ui-vue3/src/template/inHosptialCommunicate.vue @@ -22,29 +22,29 @@ - + - +
- +
- + - + - + - + - + @@ -77,7 +77,7 @@

三、病情与诊断

- + - +
- +

四、治疗与检查计划

- + - - + +

六、签署确认

-
+
请填写患者或家属签字
- + - + - + - +
请填写沟通医师签字
- +
@@ -208,13 +219,53 @@ \ No newline at end of file + diff --git a/openhis-ui-vue3/src/template/nursingRecordSheet.vue b/openhis-ui-vue3/src/template/nursingRecordSheet.vue index f3d354f3..5c9e1df8 100644 --- a/openhis-ui-vue3/src/template/nursingRecordSheet.vue +++ b/openhis-ui-vue3/src/template/nursingRecordSheet.vue @@ -6,7 +6,7 @@ + + + - + +
@@ -184,7 +217,11 @@ import { deletePharmacyDepartment, } from './components/pharmacyDepartment'; const { proxy } = getCurrentInstance(); -const { distribution_category_code } = proxy.useDict('distribution_category_code'); +const { distribution_category_code, med_category_code, device_category_code } = proxy.useDict( + 'distribution_category_code', + 'med_category_code', + 'device_category_code' +); import { nextTick } from 'vue'; const diagnosisTreatmentList = ref([]); @@ -293,10 +330,6 @@ function handleSelectionChange(selection) { } function openAddPharmacyDepartment() { - if (data.isAdding) { - proxy.$message.warning('请先保存当前行后再新增!'); - return; - } const newRow = { id: '', organizationId: '', diff --git a/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/components/api.js b/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/components/api.js index e28adfe8..8009e143 100644 --- a/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/components/api.js +++ b/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/components/api.js @@ -36,7 +36,8 @@ export function updateWarehouse(data) { // 删除 export function deleteWarehouse(data) { return request({ - url: '/base-data-manage/location/location?locationId=' + data.locationId, + // url: '/base-data-manage/location/location?locationId=' + data.locationId, + url: '/base-data-manage/location/location?busNo=' + data.busNo, method: 'delete', }) } diff --git a/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/index.vue b/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/index.vue index a71209e7..3e4cba3b 100644 --- a/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/index.vue +++ b/openhis-ui-vue3/src/views/basicmanage/warehouseLocation/index.vue @@ -295,7 +295,8 @@ function submitForm() { // 删除 function handelDelete(data) { loading.value = true; - deleteWarehouse({ locationId: data.id }).then((res) => { + console.log(data, 'data'); + deleteWarehouse({ busNo: data.busNo }).then((res) => { proxy.$modal.msgSuccess('操作成功'); loading.value = false; getPageList(); diff --git a/openhis-ui-vue3/src/views/basicservices/registrationfee/index.vue b/openhis-ui-vue3/src/views/basicservices/registrationfee/index.vue index 632d9837..f9a5e916 100644 --- a/openhis-ui-vue3/src/views/basicservices/registrationfee/index.vue +++ b/openhis-ui-vue3/src/views/basicservices/registrationfee/index.vue @@ -160,6 +160,7 @@ @click=" () => { form.ybNo = item.ybNo; + form.busNo = item.busNo; form.price = item.retailPrice; } " @@ -679,6 +680,7 @@ const transformFormData = (form) => { ybNo, title, comment, + busNo, } = form.value; return { @@ -696,6 +698,7 @@ const transformFormData = (form) => { appointmentRequiredFlag, extraDetails, comment, + busNo, }, chargeItemDefinitionFormData: { id, @@ -734,6 +737,7 @@ const transformFormEditData = (form) => { ybNo, title, comment, + busNo, } = form.value; return { @@ -751,6 +755,7 @@ const transformFormEditData = (form) => { appointmentRequiredFlag, extraDetails, comment, + busNo, }, }; }; diff --git a/openhis-ui-vue3/src/views/catalog/device/components/deviceDialog.vue b/openhis-ui-vue3/src/views/catalog/device/components/deviceDialog.vue index 0a93e7f2..b1cf12c6 100644 --- a/openhis-ui-vue3/src/views/catalog/device/components/deviceDialog.vue +++ b/openhis-ui-vue3/src/views/catalog/device/components/deviceDialog.vue @@ -261,7 +261,7 @@ clearable filterable style="width: 240px" - :disabled="form.isEditInfoDisable === 1" + :disabled="form.isEditInfoDisable === 1 || form.isEditInfoDisable === 2" > + + -
- +
+ - + 确认退药 扫码 - - + + - + @@ -74,29 +134,30 @@ \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/component/api.js b/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/component/api.js index b3d29145..84ba1e4a 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/component/api.js +++ b/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/component/api.js @@ -1,34 +1,77 @@ -import request from '@/utils/request' +import request from '@/utils/request'; -export function listSkinRecord(query) { +/** + * 获取患者列表 + */ +export function getList(queryParams) { return request({ - url: '/outpatient-manage/skin-test/outpatient-record-page', + url: '/outpatient-manage/treatment/encounter-list', method: 'get', - params: query - }) + params: queryParams, + }); } -export function lists() { +/** + * 获取皮试记录列表 + */ +export function listSkinRecord(queryParams) { return request({ - url: '/outpatient-manage/skin-test/init', + url: '/outpatient-manage/skin-test/record-info', method: 'get', - }) + params: queryParams, + }); } +/**后台没有对应接口,暂无 + * 更新护士签名 + */ +export function updateNurseSign(data) { + return request({ + url: '/outpatient-manage/skin-test/nurse-sign', + method: 'put', + data: data, + }); +} +/** + * 更新皮试记录 + */ export function updateSkinTestRecord(data) { - return request({ - url: '/outpatient-manage/skin-test/outpatient-record-skin-test', - method: 'put', - data: data - }) - } + return request({ + url: '/outpatient-manage/skin-test/save-record-info', + method: 'post', + data: data, + }); +} + +/** + * 初始化选项 + */ +export function lists() { + return request({ + url: '/outpatient-manage/skin-test/init', + method: 'get', + }); +} - - export function updateNurseSign(data) { - return request({ - url: '/outpatient-manage/skin-test/outpatient-record-sign-check', - method: 'put', - data: data - }) - } \ No newline at end of file +/** + * 获取护士列表 + */ +export function getNurseList(queryParams) { + return request({ + url: '/app-common/nurse-list', + method: 'get', + params: queryParams, + }); +} + +/** + * 新增皮试记录 + */ +export function addSkinTestRecord(data) { + return request({ + url: '/outpatient-manage/skin-test/save-record-info', + method: 'post', + data: data, + }); +} diff --git a/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/index.vue b/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/index.vue index 6d8638bb..321b0555 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/index.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/skinrecord/index.vue @@ -1,507 +1,620 @@ - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/doctorstation/components/api.js b/openhis-ui-vue3/src/views/doctorstation/components/api.js index 2652c093..38deebda 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/api.js +++ b/openhis-ui-vue3/src/views/doctorstation/components/api.js @@ -1,4 +1,4 @@ -import request from '@/utils/request' +import request from '@/utils/request'; // 病历相关接口 /** * 获取患者列表 @@ -7,8 +7,8 @@ export function getList(queryParams) { return request({ url: '/doctor-station/main/patient-info', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -18,8 +18,8 @@ export function getEmrHistoryList(queryParams) { return request({ url: '/doctor-station/emr/emr-page', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -29,8 +29,8 @@ export function getEmrTemplateList(queryParams) { return request({ url: '/doctor-station/emr/emr-template-page', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -40,7 +40,7 @@ export function receiveEncounter(encounterId) { return request({ url: '/doctor-station/main/receive-encounter?encounterId=' + encounterId, method: 'get', - }) + }); } /** @@ -50,7 +50,7 @@ export function leaveEncounter(encounterId) { return request({ url: '/doctor-station/main/leave-encounter?encounterId=' + encounterId, method: 'get', - }) + }); } /** @@ -60,7 +60,7 @@ export function completeEncounter(encounterId) { return request({ url: '/doctor-station/main/complete-encounter?encounterId=' + encounterId, method: 'get', - }) + }); } /** @@ -70,39 +70,39 @@ export function saveEmr(data) { return request({ url: '/doctor-station/emr/emr', method: 'post', - data: data - }) + data: data, + }); } /** * 删除病历模板 */ -export function deleteEmrTemplate(id){ +export function deleteEmrTemplate(id) { return request({ url: '/doctor-station/emr/emr-template?id=' + id, method: 'delete', - }) + }); } /** * 获取病历详情 */ -export function getEmrDetail(encounterId){ +export function getEmrDetail(encounterId) { return request({ url: '/doctor-station/emr/emr-detail?encounterId=' + encounterId, method: 'get', - }) + }); } /** * 保存病历模板 */ -export function saveEmrTemplate(data){ +export function saveEmrTemplate(data) { return request({ url: '/doctor-station/emr/emr-template', method: 'post', - data: data - }) + data: data, + }); } // 诊断相关接口 @@ -111,10 +111,10 @@ export function saveEmrTemplate(data){ */ export function saveDiagnosis(data) { return request({ - url: '/doctor-station/diagnosis/save-doctor-diagnosis', + url: '/doctor-station/diagnosis/save-doctor-diagnosisnew', method: 'post', - data: data - }) + data: data, + }); } /** @@ -124,8 +124,8 @@ export function saveDiagnosisBind(data) { return request({ url: '/doctor-station/diagnosis/diagnosis-belong-binding', method: 'post', - data: data - }) + data: data, + }); } /** * 删除诊断绑定 @@ -134,7 +134,7 @@ export function deleteDiagnosisBind(id) { return request({ url: '/doctor-station/diagnosis/diagnosis-belong-binding?id=' + id, method: 'delete', - }) + }); } /** @@ -144,8 +144,8 @@ export function getDiagnosisDefinitionList(queryParams) { return request({ url: '/doctor-station/diagnosis/condition-definition-metadata', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -155,7 +155,7 @@ export function getConditionDefinitionInfo(patientId) { return request({ url: '/doctor-station/diagnosis/get-condition-definition-class?patientId=' + patientId, method: 'get', - }) + }); } /** @@ -165,40 +165,51 @@ export function diagnosisInit() { return request({ url: '/doctor-station/diagnosis/init', method: 'get', - }) + }); } /** - * + * * 获取诊断回显数据 */ export function getEncounterDiagnosis(encounterId) { return request({ url: '/doctor-station/diagnosis/get-encounter-diagnosis?encounterId=' + encounterId, method: 'get', - }) + }); } /** - * + * + * 获取诊断集合数据 + */ +export function getDiagnosisListEle(searchKey,encounterId) { + return request({ + url: '/doctor-station/diagnosis/get-encounter-diagnosis-ele?searchKey=' + searchKey+'&encounterId='+encounterId, + method: 'get', + }); +} + +/** + * * 获取诊断集合数据 */ export function getDiagnosisList(searchKey) { - return request({ - url: '/doctor-station/diagnosis/get-diagnosis-list?searchKey=' + searchKey, - method: 'get', - }) + return request({ + url: '/doctor-station/diagnosis/get-diagnosis-list?searchKey=' + searchKey, + method: 'get', + }); } /** - * + * * 删除就诊诊断 */ export function delEncounterDiagnosis(conditionId) { return request({ url: '/doctor-station/diagnosis/encounter-diagnosis?conditionId=' + conditionId, method: 'delete', - }) + }); } // 处方相关接口 @@ -209,8 +220,8 @@ export function getAdviceBaseInfo(queryParams) { return request({ url: '/doctor-station/advice/advice-base-info', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** * 保存处方(单条) @@ -219,8 +230,8 @@ export function savePrescription(data) { return request({ url: '/doctor-station/advice/save-advice', method: 'post', - data: data - }) + data: data, + }); } /** * 签发处方 @@ -229,8 +240,8 @@ export function savePrescriptionSign(data) { return request({ url: '/doctor-station/advice/sign-advice', method: 'post', - data: data - }) + data: data, + }); } /** * 处方签退 @@ -239,8 +250,8 @@ export function singOut(data) { return request({ url: '/doctor-station/advice/sign-off', method: 'post', - data: data - }) + data: data, + }); } /** * 获取患者本次就诊处方 @@ -249,7 +260,7 @@ export function getPrescriptionList(encounterId) { return request({ url: '/doctor-station/advice/request-base-info?encounterId=' + encounterId, method: 'get', - }) + }); } /** * 获取科室列表 @@ -258,7 +269,7 @@ export function getOrgTree() { return request({ url: '/base-data-manage/organization/organization', method: 'get', - }) + }); } /** * 获取退费账单 @@ -267,7 +278,7 @@ export function getEncounterPatientPayment(encounterId) { return request({ url: '/charge-manage/refund/patient-payment?encounterId=' + encounterId, method: 'get', - }) + }); } /** * 申请退费 @@ -276,11 +287,10 @@ export function refundPayment(data) { return request({ url: '/charge-manage/refund/refund-payment', method: 'post', - data: data - }) + data: data, + }); } - // 电子处方相关接口 /** * 电子处方查询 @@ -289,8 +299,8 @@ export function getVeriPrescriptionInfo(queryParams) { return request({ url: '/ybelep-request/get-PrescriptionInfo', method: 'get', - params: queryParams - }) + params: queryParams, + }); } // 处方开立相关接口 @@ -301,16 +311,16 @@ export function getAllMedicationInfo(queryParams) { return request({ url: '/doctor-station/elep/get-allMedicationInfo', method: 'get', - params: queryParams - }) + params: queryParams, + }); } // 当返回的list为空时在调用get-allMedicationInfo export function getAllMedicationUsualInfo(queryParams) { return request({ url: '/doctor-station/elep/get-allMedicationUsualInfo', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** * 电子处方下拉框 @@ -318,8 +328,8 @@ export function getAllMedicationUsualInfo(queryParams) { export function elepPrescriptionInit() { return request({ url: '/doctor-station/elep/init', - method: 'get' - }) + method: 'get', + }); } /** @@ -329,8 +339,8 @@ export function getPrescriptionInfo(queryParams) { return request({ url: '/doctor-station/elep/get-prescriptionInfo', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -340,8 +350,8 @@ export function getMedicationInfo(queryParams) { return request({ url: '/doctor-station/elep/get-medicationInfo', method: 'get', - params: queryParams - }) + params: queryParams, + }); } /** @@ -350,8 +360,8 @@ export function getMedicationInfo(queryParams) { export function prescriptionNoInit() { return request({ url: '/doctor-station/elep/prescriptionNoInit', - method: 'get' - }) + method: 'get', + }); } /** @@ -361,8 +371,8 @@ export function savePrescriptionInfo(data) { return request({ url: '/doctor-station/elep/save-prescriptionInfo', method: 'post', - data: data - }) + data: data, + }); } /** @@ -372,8 +382,8 @@ export function updatePrescriptionInfo(data) { return request({ url: '/doctor-station/elep/update-prescriptionInfo', method: 'post', - data: data - }) + data: data, + }); } /** @@ -383,8 +393,8 @@ export function deletePrescriptionInfo(data) { return request({ url: '/doctor-station/elep/delete-prescriptionInfo', method: 'post', - data: data - }) + data: data, + }); } /** @@ -394,8 +404,8 @@ export function issuancePrescription(prescriptionNoList) { return request({ url: '/doctor-station/elep/issuance-prescription', method: 'post', - data: prescriptionNoList - }) + data: prescriptionNoList, + }); } /** @@ -405,8 +415,8 @@ export function getAdviceHistoryInfo(params) { return request({ url: '/doctor-station/advice/request-history-info', method: 'get', - params: params - }) + params: params, + }); } /** @@ -416,8 +426,8 @@ export function updateGroupId(data) { return request({ url: '/doctor-station/advice/update-groupid', method: 'put', - data: data - }) + data: data, + }); } /** @@ -427,8 +437,8 @@ export function getOrderGroupList(params) { return request({ url: '/personalization/order-group/order-group', method: 'get', - params: params - }) + params: params, + }); } /** @@ -438,11 +448,10 @@ export function getContract(params) { return request({ url: '/doctor-station/advice/get-encounter-contract', method: 'get', - params: params - }) + params: params, + }); } - /** * 取得药品最新数据 */ @@ -450,8 +459,8 @@ export function queryYbCatalogue(params) { return request({ url: '/yb-request/query-yb-catalogue', method: 'post', - params: params - }) + params: params, + }); } /** @@ -461,8 +470,8 @@ export function getChronicDisease(params) { return request({ url: '/yb-request/getConditionDefinition', method: 'get', - params: params - }) + params: params, + }); } /** @@ -472,8 +481,8 @@ export function getTcmMedicine(params) { return request({ url: '/doctor-station/chinese-medical/tcm-advice-base-info', method: 'get', - params: params - }) + params: params, + }); } /** @@ -483,8 +492,8 @@ export function getTcmCondition(params) { return request({ url: '/doctor-station/chinese-medical/condition-info', method: 'get', - params: params - }) + params: params, + }); } /** @@ -494,8 +503,8 @@ export function getTcmSyndrome(params) { return request({ url: '/doctor-station/chinese-medical/syndrome-info', method: 'get', - params: params - }) + params: params, + }); } /** @@ -505,8 +514,8 @@ export function getTcmDiagnosis(params) { return request({ url: '/doctor-station/chinese-medical/get-tcm-encounter-diagnosis', method: 'get', - params: params - }) + params: params, + }); } /** @@ -516,8 +525,20 @@ export function saveTcmDiagnosis(data) { return request({ url: '/doctor-station/chinese-medical/save-tcm-diagnosis', method: 'post', - data: data - }) + data: data, + }); +} + + +/** + * 保存中医诊断 + */ +export function updateTcmDiagnosis(data) { + return request({ + url: '/doctor-station/chinese-medical/update-tcm-diagnosis', + method: 'post', + data: data, + }); } /** @@ -527,7 +548,7 @@ export function deleteTcmDiagnosis(syndromeGroupNo) { return request({ url: '/doctor-station/chinese-medical/tcm-diagnosis?syndromeGroupNo=' + syndromeGroupNo, method: 'delete', - }) + }); } /** @@ -537,8 +558,8 @@ export function saveTcmAdvice(data) { return request({ url: '/doctor-station/chinese-medical/save-tcm-advice', method: 'post', - data: data - }) + data: data, + }); } /** @@ -548,8 +569,8 @@ export function signTcmAdvice(data) { return request({ url: '/doctor-station/chinese-medical/sign-tcm-advice', method: 'post', - data: data - }) + data: data, + }); } /** @@ -559,8 +580,8 @@ export function signOutTcmAdvice(data) { return request({ url: '/doctor-station/chinese-medical/sign-tcm-off', method: 'post', - data: data - }) + data: data, + }); } /** @@ -570,11 +591,10 @@ export function getTcmAdviceList(params) { return request({ url: '/doctor-station/chinese-medical/tcm-request-base-info', method: 'get', - params: params - }) + params: params, + }); } - /** * 获取预约记录 */ @@ -582,8 +602,8 @@ export function getReservationInfo(params) { return request({ url: '/doctor-station/reservation-record/reservation-info', method: 'get', - params: params - }) + params: params, + }); } /** @@ -593,8 +613,8 @@ export function addReservationInfo(data) { return request({ url: '/doctor-station/reservation-record/save-reservation', method: 'post', - data: data - }) + data: data, + }); } /** @@ -604,8 +624,8 @@ export function editReservationInfo(data) { return request({ url: '/doctor-station/reservation-record/edit-reservation', method: 'put', - data: data - }) + data: data, + }); } /** @@ -615,17 +635,16 @@ export function delReservationInfo(id) { return request({ url: '/doctor-station/reservation-record/del-reservation', method: 'delete', - params: id - }) + params: id, + }); } - // 查询初期所需数据 export function getInit() { return request({ url: '/charge-manage/register/init', - method: 'get' - }) + method: 'get', + }); } /** @@ -635,8 +654,8 @@ export function queryParticipantList(params) { return request({ url: '/app-common/practitioner-list', method: 'get', - params: params - }) + params: params, + }); } /** @@ -646,7 +665,7 @@ export function getOrgList() { return request({ url: '/base-data-manage/organization/organization', method: 'get', - }) + }); } /** @@ -656,8 +675,8 @@ export function wardList(params) { return request({ url: '/app-common/ward-list', method: 'get', - params: params - }) + params: params, + }); } /** @@ -667,8 +686,8 @@ export function handleHospitalization(data) { return request({ url: '/inhospital-charge/register/by-doctor', method: 'post', - data: data - }) + data: data, + }); } /** @@ -678,8 +697,8 @@ export function getEnPrescriptionInfo(data) { return request({ url: '/doctor-station/main/prescription-page-info', method: 'get', - params: data - }) + params: data, + }); } /** @@ -689,8 +708,8 @@ export function getOrderGroup(data) { return request({ url: '/personalization/orders-group-package/group-package-for-order', method: 'get', - params: data - }) + params: data, + }); } /** @@ -700,8 +719,8 @@ export function getBindDevice(data) { return request({ url: '/doctor-station/advice/order-bind-info', method: 'get', - params: data - }) + params: data, + }); } /** @@ -711,6 +730,46 @@ export function isFoodDiseasesNew(params) { return request({ url: '/external-integration/foodborne-acquisition/is-food-diseases-new', method: 'get', - params: params - }) + params: params, + }); +} + +// 是否入院登记 +export function isHospitalization(params) { + return request({ + url: '/inhospital-charge/register/isRegister', + method: 'get', + params: params, + }); +} + +// 校验三十天内是否开过相同检查检验项目 +export function checkServicesHistory(params) { + return request({ + url: '/doctor-station/advice/proof-test-history', + method: 'get', + params: params, + }); +} + +/** + * 查询检验报告 url + */ +export function getProofResult(queryParams) { + return request({ + url: '/doctor-station/advice/proof-result', + method: 'get', + params: queryParams, + }); +} + +/** + * 查询检查报告 url + */ +export function getTestResult(queryParams) { + return request({ + url: '/doctor-station/advice/test-result', + method: 'get', + params: queryParams, + }); } diff --git a/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/addDiagnosisDialog.vue b/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/addDiagnosisDialog.vue index 7454ad5b..bbdee4d5 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/addDiagnosisDialog.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/addDiagnosisDialog.vue @@ -91,7 +91,9 @@ import { getTcmCondition, getTcmSyndrome, saveTcmDiagnosis, + updateTcmDiagnosis, } from '@/views/doctorstation/components/api'; +import { update } from 'lodash'; const props = defineProps({ openAddDiagnosisDialog: { @@ -102,6 +104,10 @@ const props = defineProps({ type: Object, required: true, }, + updateZy: { + type: Object, + required: true, + }, }); const conditionList = ref([]); @@ -118,64 +124,183 @@ function handleOpen() { getTcmCondition().then((res) => { conditionList.value = res.data.records; }); + tcmDiagonsisSaveList.value=[]; + tcmDiagonsisList.value=[]; + debugger; + if (props.updateZy.length>0) { + props.updateZy.forEach((item) => { + let updateIds=item.updateId.split("-"); + let name=item.name.split("-"); + tcmDiagonsisSaveList.value.push({ + conditionId: updateIds[0], + definitionId: item.illnessDefinitionId, + ybNo: item.ybNo, + syndromeGroupNo: item.syndromeGroupNo, + verificationStatusEnum: 4, + medTypeCode: '11', + diagSrtNo:item.diagSrtNo, + }); + tcmDiagonsisList.value.push({ + conditionName: name[0], + syndromeGroupNo: item.syndromeGroupNo, + }); + tcmDiagonsisSaveList.value.push({ + conditionId: updateIds[1], + definitionId: item.symptomDefinitionId, + ybNo: item.symptomYbNo, + syndromeGroupNo: item.syndromeGroupNo, + diagSrtNo:item.diagSrtNo, + }); + tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = name[1]; + console.log("这是修改时带入的数据"); + console.log(tcmDiagonsisList.value); + console.log(tcmDiagonsisSaveList.value); + syndromeSelected.value = true; + }); + } } // 点击诊断列表处理,点击以后才显示证候列表 function handleClickRow(row) { - if (syndromeSelected.value || tcmDiagonsisList.value == 0) { + if (syndromeSelected.value || tcmDiagonsisList.value.length == 0) { + syndromeSelected.value = false; selectedDisease.value = true; - syndromeSelected.value = false; timestamp.value = Date.now(); getTcmSyndrome().then((res) => { syndromeList.value = res.data.records; }); - tcmDiagonsisSaveList.value.push({ - definitionId: row.id, - ybNo: row.ybNo, - syndromeGroupNo: timestamp.value, - verificationStatusEnum: 4, - medTypeCode: '11', - }); - tcmDiagonsisList.value.push({ - conditionName: row.name, - syndromeGroupNo: timestamp.value, - }); + + if (props.updateZy.length>0) { + props.updateZy.forEach((item) => { + let updateIds=item.updateId.split("-"); + tcmDiagonsisSaveList.value.push({ + updateId:updateIds[0], + conditionId: updateIds[0], + definitionId: row.id, + ybNo: row.ybNo, + syndromeGroupNo: timestamp.value, + verificationStatusEnum: 4, + medTypeCode: '11', + diagSrtNo:item.diagSrtNo, + }); + debugger; + if(tcmDiagonsisList.value.length>0){ + tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].conditionName = row.name; + }else{ + tcmDiagonsisList.value.push({ + conditionName: row.name, + syndromeGroupNo: timestamp.value, + }); + } + }); + }else{ + tcmDiagonsisSaveList.value.push({ + definitionId: row.id, + ybNo: row.ybNo, + syndromeGroupNo: timestamp.value, + verificationStatusEnum: 4, + medTypeCode: '11', + }); + tcmDiagonsisList.value.push({ + conditionName: row.name, + syndromeGroupNo: timestamp.value, + }); + } + + + } + + // tcmDiagonsisList.value.push({ + // conditionName: row.name, + // syndromeGroupNo: timestamp.value, + // }); + } -} function clickSyndromeRow(row) { - tcmDiagonsisSaveList.value.push({ - definitionId: row.id, - ybNo: row.ybNo, - syndromeGroupNo: timestamp.value, + debugger; + let flag=true; + tcmDiagonsisList.value.forEach( item => { + if(tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].conditionName==item.conditionName){ + if(item.syndromeName==row.name ){ + proxy.$modal.msgWarning('不能存在完全相同的诊断和证侯'); + flag=false; + } + } }); - tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name; - syndromeSelected.value = true; + if(flag){ + if(props.updateZy.length>0){ + props.updateZy.forEach((item) => { + let updateIds=item.updateId.split("-"); + tcmDiagonsisSaveList.value.push({ + updateId:updateIds[1], + conditionId: updateIds[1], + definitionId: row.id, + ybNo: row.ybNo, + syndromeGroupNo: timestamp.value, + }); + tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name; + syndromeSelected.value = true; + }); + + }else{ + tcmDiagonsisSaveList.value.push({ + definitionId: row.id, + ybNo: row.ybNo, + syndromeGroupNo: timestamp.value, + }); + tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name; + syndromeSelected.value = true; + } + + + // tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name; + // syndromeSelected.value = true; + } } // 删除诊断 function removeDiagnosis(row, index) { tcmDiagonsisList.value.splice(index, 1); - tcmDiagonsisSaveList.value = tcmDiagonsisSaveList.filter((item) => { + tcmDiagonsisSaveList.value = tcmDiagonsisSaveList.value.filter((item) => { return item.syndromeGroupNo !== row.syndromeGroupNo; }); + } function save() { - saveTcmDiagnosis({ - patientId: props.patientInfo.patientId, - encounterId: props.patientInfo.encounterId, - diagnosisChildList: tcmDiagonsisSaveList.value, - }).then((res) => { - if (res.code == 200) { - emit('close'); - proxy.$modal.msgSuccess('诊断已保存'); - } - }); + if(props.updateZy.length>0){ + updateTcmDiagnosis({ + patientId: props.patientInfo.patientId, + encounterId: props.patientInfo.encounterId, + diagnosisChildList: tcmDiagonsisSaveList.value, + }).then((res) => { + if (res.code == 200) { + emit('close'); + proxy.$modal.msgSuccess('诊断已保存'); + } + }); + }else{ + saveTcmDiagnosis({ + patientId: props.patientInfo.patientId, + encounterId: props.patientInfo.encounterId, + diagnosisChildList: tcmDiagonsisSaveList.value, + }).then((res) => { + if (res.code == 200) { + emit('close'); + proxy.$modal.msgSuccess('诊断已保存'); + } + }); + } + } function submit() { - if (tcmDiagonsisSaveList.value.length > 0 && syndromeSelected.value) { + debugger; + if ( + tcmDiagonsisSaveList.value.length > 0 && + (syndromeSelected.value || tcmDiagonsisSaveList.value.length % 2 == 0) + ) { save(); } else { proxy.$modal.msgWarning('请选择证候'); diff --git a/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/diagnosis.vue b/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/diagnosis.vue index ace2f5a3..4c60e2f5 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/diagnosis.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/diagnosis/diagnosis.vue @@ -2,33 +2,64 @@
- + - + @@ -80,7 +86,10 @@ const { proxy } = getCurrentInstance(); import { ElMessageBox } from 'element-plus'; import PatientInfoComp from './patientInfo.vue'; import RegisterForm from './registerForm.vue'; -import { noFilesRegister, registerInHospital, getInit } from './api'; +import { noFilesRegister, registerInHospital, getInit, getProvincesAndCities } from './api'; +import { useRouter } from 'vue-router'; +import printUtils from '@/utils/printUtils'; +const router = useRouter(); const emits = defineEmits(['okAct', 'cancelAct']); const props = defineProps({ @@ -103,6 +112,10 @@ const props = defineProps({ type: Boolean, default: false, }, + isRegistered: { + type: Boolean, + default: false, // false 表示待登记,true 表示已登记 + }, }); watch( @@ -122,6 +135,7 @@ import { ElMessage } from 'element-plus'; const width = '1128px'; const patientApiInfo = ref({}); const initOptions = ref({}); +const payEnum = ref(220400); /* 取消 */ const cancelAct = () => { @@ -131,12 +145,31 @@ const patientInfoRef = ref(); /* 预交金 */ const advancePaymentVisible = ref(false); -/* 保存 */ +const jumpToYbRegisterEdit = () => { + router + .push({ + path: '/ybmanagement/ybInhospital/ybregisterEdit', + query: { + encounterId: '1993854019030441985', + }, + }) + .catch((error) => { + console.error('跳转医保登记页面失败:', error); + }); +}; +/* 登记 */ const handleSubmit = () => { - let params = {}; + let params = { + inHospitalInfo: {}, + payEnum: 0, + }; + params.inHospitalInfo.payEnum = payEnum.value; + params.payEnum = payEnum.value; + debugger; if (props.noFile) { RegisterFormRef.value.validateData(async () => { params.inHospitalInfo = RegisterFormRef.value.submitForm; + params.inHospitalInfo.payEnum = payEnum.value; params.patientInformation = patientInfoRef.value.getPatientForm(); if (params.patientInformation.idCard) { // 验证身份证号长度是否为18位 @@ -151,13 +184,57 @@ const handleSubmit = () => { } } console.log('params', params); + debugger; params.inHospitalInfo.balanceAmount = advance.value; const performRegistration = () => { noFilesRegister(params).then((res) => { if (res.code == 200) { - emits('okAct'); ElMessage.success(res.msg); advancePaymentVisible.value = true; + ElMessage.success(res.msg); + // 打印预交金收据 + printDepositReceipt(props.patientInfo, params.inHospitalInfo); + // 询问是否需要医保登记 + ElMessageBox.confirm('是否需要进行医保登记?', '医保登记确认', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'info', + }) + .then(() => { + // 准备传递的数据 + const cardData = { + patientInfo: params.patientInformation, + inHospitalInfo: params.inHospitalInfo, + encounterId: params.inHospitalInfo.encounterId, + }; + + // 跳转到医保登记页面 + try { + router + .push({ + path: '/ybmanagement/ybInhospital/ybregisterEdit', + query: { + encounterId: props.patientInfo.encounterId, + cardData: encodeURIComponent(JSON.stringify(cardData)), + cardType: 'inHospital', + operationType: 'HospitalizationRegistration', + }, + }) + .then(() => { + console.log('路由跳转成功'); + }) + .catch((error) => { + console.error('路由跳转失败:', error); + ElMessage.error('跳转到医保登记页面失败'); + }); + } catch (error) { + console.error('跳转异常:', error); + } + }) + .catch(() => { + // 用户取消医保登记,关闭当前弹窗 + emits('okAct'); + }); } else { ElMessage.error(res.msg); } @@ -184,11 +261,60 @@ const handleSubmit = () => { params = { ...params, ...RegisterFormRef.value.submitForm }; console.log('params', params); const performRegistration = () => { + console.log('params', params); registerInHospital(params).then((res) => { if (res.code == 200) { - emits('okAct'); ElMessage.success(res.msg); advancePaymentVisible.value = true; + + // 打印预交金收据 + printDepositReceipt( + props.patientInfo, + params, + RegisterFormRef.value.medicalInsuranceTitle + ); + + // 询问是否需要医保登记 + ElMessageBox.confirm('是否需要进行医保登记?', '医保登记确认', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'info', + }) + .then(() => { + // 准备传递的数据 + const cardData = { + patientInfo: props.patientInfo, + inHospitalInfo: params, + }; + + // 跳转到医保登记页面 + try { + router + .push({ + path: '/ybmanagement/ybInhospital/ybregisterEdit', + query: { + encounterId: props.patientInfo.encounterId, + cardData: encodeURIComponent(JSON.stringify(cardData)), + cardType: 'inHospital', + operationType: 'HospitalizationRegistration', + certType: props.patientInfo.certType, + }, + }) + .then(() => { + console.log('路由跳转成功'); + }) + .catch((error) => { + console.error('路由跳转失败:', error); + ElMessage.error('跳转到医保登记页面失败'); + }); + } catch (error) { + console.error('跳转异常:', error); + } + }) + .catch(() => { + // 用户取消医保登记,关闭当前弹窗 + emits('okAct'); + }); } else { ElMessage.error(res.msg); } @@ -239,18 +365,22 @@ const RegisterFormRef = ref(); const feeTypeOptions = reactive([ { type: 'hipCash', + payEnum: 220400, label: '现金', }, { type: 'hipAlipay', + payEnum: 220200, label: '支付宝', }, { type: 'wechat', + payEnum: 220100, label: '微信', }, { type: 'hipPayCard', + payEnum: 220300, label: '银行卡', }, ]); @@ -279,7 +409,119 @@ const onChangFeeType = () => { medicalInsuranceVisible.value = true; }; -/* */ +/* 打印预交金收据 */ +const printDepositReceipt = async (patientInfo, inHospitalInfo, medicalInsuranceTitle) => { + try { + // 构造支付方式详情文本 + const paymentDetails = `现金 ${ + currentFeeType.value === 'hipCash' ? advance.value || '0.00' : '0.00' + } 微信 ${currentFeeType.value === 'wechat' ? advance.value || '0.00' : '0.00'} 支付宝 ${ + currentFeeType.value === 'hipAlipay' ? advance.value || '0.00' : '0.00' + } 银行 ${currentFeeType.value === 'hipPayCard' ? advance.value || '0.00' : '0.00'}`; + + // 构造打印数据 + const printData = { + // 患者基本信息 + patientName: patientInfo.patientName || '', // 姓名 + patientId: patientInfo.idCard || patientInfo.patientCode || '', // ID号 + contractName: patientInfo.contractName || '自费', // 医保类别 + + // 住院信息 + encounterNo: inHospitalInfo.encounterNo || '', // 住院号 + inHospitalOrgName: inHospitalInfo.inHospitalOrgName || '', // 机构名称 + + // 费用信息 + balanceAmount: advance.value || '0.00', // 金额 + amountInWords: convertToChineseNumber(advance.value || '0.00'), // 人民币大写 + + // 支付方式详情 + paymentDetails: paymentDetails, + + // 时间信息 + currentTime: new Date().toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }), + + // 其他信息 + cashier: userStore?.nickName || '', // 收款人(收费员) + medicalInsuranceTitle: medicalInsuranceTitle || '', // 医保标题信息 + }; + + console.log(printData, 'dayin 预交金printData'); + + // 直接导入并使用指定的预交金打印模板 + const templateModule = await import('@/components/Print/AdvancePayment.json'); + let template = templateModule.default || templateModule; + + // 使用printUtils执行打印 + await printUtils.executePrint(printData, template); + console.log('预交金收据打印成功'); + } catch (error) { + console.error('打印失败:', error); + ElMessage.error('打印失败: ' + error.message); + } +}; + +/* 将数字转换为人民币大写 */ +const convertToChineseNumber = (amount) => { + // 数字转大写 + const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + const units = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿']; + const decimalUnits = ['角', '分']; + + let [integer, decimal] = amount.toString().split('.'); + decimal = decimal || '00'; + decimal = decimal.padEnd(2, '0').substring(0, 2); + + let result = ''; + + // 处理整数部分 + if (parseInt(integer) === 0) { + result += '零元'; + } else { + for (let i = 0; i < integer.length; i++) { + const digit = parseInt(integer[i]); + const position = integer.length - i - 1; + + if (digit !== 0) { + result += digits[digit] + units[position]; + } else { + // 避免连续的零 + if (i > 0 && parseInt(integer[i - 1]) !== 0) { + result += digits[digit]; + } + // 但需要保留万、亿等单位 + if (position % 4 === 0 && position > 0) { + result += units[position]; + } + } + } + result += '元'; + } + + // 处理小数部分 + if (parseInt(decimal) === 0) { + result += '整'; + } else { + if (parseInt(decimal[0]) > 0) { + result += digits[parseInt(decimal[0])] + decimalUnits[0]; + } + if (parseInt(decimal[1]) > 0) { + result += digits[parseInt(decimal[1])] + decimalUnits[1]; + } + } + + return result; +}; + +/* 导入用户信息 */ +import useUserStore from '@/store/modules/user'; +const userStore = useUserStore(); \ No newline at end of file + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/examineApplication.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/examineApplication.vue index ea343667..32f990ed 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/examineApplication.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/examineApplication.vue @@ -4,42 +4,284 @@ * @Description: 检查申请详情 --> - - \ No newline at end of file + +const isFieldMatched = (key) => { + return key in labelMap; +}; + +const getFieldLabel = (key) => { + return labelMap[key] || key; +}; + +const hasMatchedFields = computed(() => { + if (!descJsonData.value) return false; + return Object.keys(descJsonData.value).some((key) => isFieldMatched(key)); +}); + +const handleViewDetail = (row) => { + currentDetail.value = row; + // 解析 descJson + if (row.descJson) { + try { + descJsonData.value = JSON.parse(row.descJson); + } catch (e) { + console.error('解析 descJson 失败:', e); + descJsonData.value = null; + } + } else { + descJsonData.value = null; + } + detailDialogVisible.value = true; +}; + +watch( + () => patientInfo.value?.encounterId, + (val) => { + if (val) { + fetchData(); + } else { + tableData.value = []; + } + }, + { immediate: true } +); + +defineExpose({ + refresh: fetchData, +}); + + + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/nursingStatus.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/nursingStatus.vue index da0dc2e0..5433c00a 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/nursingStatus.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/nursingStatus.vue @@ -24,7 +24,12 @@ @@ -139,8 +144,8 @@
- 取消 - 确定 + 取消 + 确定
@@ -376,8 +381,17 @@ const fetchNursingStatusData = () => { loading.value = false; if (res.code === 200 && res.data) { + let nursingList = []; + let nursingOrderNameList = ['I级护理', 'II级护理', 'III级护理', '特级护理']; + nursingOrderNameList.forEach((str) => { + (res.data.nursingList || []).forEach((item) => { + if (item.nursingOrderName == str) { + nursingList.push(item); + } + }); + }); // 填充各列表数据 - nursingLevelList.value = res.data.nursingList || []; + nursingLevelList.value = nursingList || []; conditionList.value = res.data.conditionList || []; dietList.value = res.data.dietList || []; positionList.value = res.data.positionList || []; diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/reportQuery.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/reportQuery.vue new file mode 100644 index 00000000..55bb5311 --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/reportQuery.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/surgeryApplication.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/surgeryApplication.vue index 458042db..3ea3e16d 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/surgeryApplication.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/surgeryApplication.vue @@ -4,33 +4,284 @@ * @Description: 手术申请详情 --> + - + + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue index 2dc410cb..1f7bf395 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/applicationShow/testApplication.vue @@ -4,34 +4,284 @@ * @Description: 检验申请 --> + - + + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/addDiagnosisDialog.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/addDiagnosisDialog.vue index 77359f89..d02b0ed8 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/addDiagnosisDialog.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/diagnosis/addDiagnosisDialog.vue @@ -20,7 +20,7 @@
证候
- + \ No newline at end of file + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue index cc7c0f92..6704db9d 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue @@ -73,23 +73,35 @@ :value="item.value" /> - + + + 转科 - 出院 + + 出院 + + 护理状态 + 刷新数据
- + 总金额:{{ - scope.row.totalPrice ? scope.row.totalPrice + ' 元' : '0.00 元' + scope.row.totalPrice + ? Number(scope.row.totalPrice).toFixed(2) + ' 元' + : '0.00 元' }}
@@ -527,9 +566,12 @@ placeholder="请选择执行科室" />
- - 总金额:{{ - scope.row.totalPrice ? scope.row.totalPrice + ' 元' : '0.00 元' + + 总金额: + {{ + scope.row.totalPrice + ? Number(scope.row.totalPrice).toFixed(2) + ' 元' + : '0.00 元' }} @@ -545,38 +587,8 @@
- - - - - - - + + @@ -747,7 +760,7 @@
- - + /> +
+ + + + @@ -2148,10 +2406,16 @@ defineExpose({ getListInfo, getDiagnosisInfo }); .inpatientDoctor-order-table { flex: auto; width: 100%; + min-height: 0; + overflow: auto; } .applicationForm-bottom-btn { flex: none; height: 40px; + position: sticky; + bottom: 0; + z-index: 10; + background: #fff; } } - \ No newline at end of file + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/patientList.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/patientList.vue index f94d3bce..b892676d 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/components/patientList.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/components/patientList.vue @@ -21,7 +21,7 @@ @@ -186,7 +186,7 @@ onMounted(() => { queryPatientData() }) const getList = () => { - getPatientList({ status: 5 }).then((res) => { + getPatientList({ status: 5, searchKey: searchData.keyword }).then((res) => { cardAllData.value = res.data.records }) } diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/api.js b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/api.js index 25415ce2..be270295 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/api.js +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/api.js @@ -1,18 +1,34 @@ /* * @Author: sjjh * @Date: 2025-09-20 17:02:37 - * @Description: + * @Description: */ -import request from '@/utils/request' +import request from '@/utils/request'; // ====== 文书记录 -// 新增记录 +// 保存或更新记录 +export function saveOrUpdateRecord(data) { + return request({ + url: '/document/record/saveOrUpdateRecord', + method: 'post', + data, + }); +} +// 新增记录 export function addRecord(data) { return request({ url: '/document/record/addRecord', method: 'post', - data - }) + data, + }); +} +// 删除历史记录 +export function deleteRecord(ids) { + return request({ + url: '/document/record/deleteRecord', + method: 'delete', + data: ids, + }); } // 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理 @@ -20,15 +36,15 @@ export function getRecordByEncounterIdList(params) { return request({ url: '/document/record/getRecordByEncounterIdList', method: 'get', - params - }) + params, + }); } // 初始化文书定义 export function init() { return request({ url: '/document/record/init', method: 'get', - }) + }); } // ====== 文书模板 @@ -37,24 +53,22 @@ export function addTemplate(data) { return request({ url: '/document/template/add', method: 'post', - data - }) + data, + }); } // export function getListByDefinitionId(definitionId) { return request({ url: '/document/template/getListByDefinitionId', method: 'get', - params: {definitionId} - }) + params: { definitionId }, + }); } // 更新模板 export function updateTemplate(data) { return request({ url: '/document/template/update', method: 'put', - data - }) + data, + }); } - - diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/history.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/history.vue index 1824a9d5..3929bf50 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/history.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/history.vue @@ -8,14 +8,25 @@
-
- +
+ {{ item.name }}({{ item.recordTime }}) + + + +
@@ -24,10 +35,11 @@ diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/template.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/template.vue index 5e741e5b..9a5e1e03 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/template.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/template.vue @@ -9,17 +9,15 @@
-->
- + -
{{ item.name }} - - -
- +
+ {{ item.name }} + + + + +
@@ -33,7 +31,8 @@ import { getListByDefinitionId } from '../api'; import { ElTree } from 'element-plus'; import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'; import { patientInfo } from '../../store/patient.js'; -const emits = defineEmits(['templateClick','edit']); +import { Edit } from '@element-plus/icons-vue'; +const emits = defineEmits(['templateClick', 'edit']); const props = defineProps({ definitionId: { type: String, @@ -55,13 +54,12 @@ const queryParams = ref({ const templateData = ref([]); const queryList = async () => { try { - if ( unref(definitionId)&&unref(definitionId) !== '') { + if (unref(definitionId) && unref(definitionId) !== '') { const res = await getListByDefinitionId(unref(definitionId)); templateData.value = res.data || []; - }else{ + } else { templateData.value = []; } - } catch (error) { ElMessage.error('获取模板失败'); templateData.value = []; @@ -73,40 +71,60 @@ const handleNodeClick = (data) => { const handleEdit = (data) => { emits('edit', data); }; + +// 删除模板 +const handleDelete = async (item) => { + try { + ElMessageBox.confirm('确定要删除该模板吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(async () => { + await deleteTemplate(item.id); + ElMessage.success('删除成功'); + queryList(); + }); + } catch (error) { + if (error !== 'cancel') { + ElMessage.error('删除失败'); + } + } +}; + const currentSelectTemplate = ref({}); defineExpose({ queryList }); diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/templateEdit.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/templateEdit.vue index 008f1fbe..418efbbf 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/templateEdit.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/components/templateEdit.vue @@ -7,7 +7,7 @@ destroy-on-close @open="handleOpen" > - + diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/index.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/index.vue index 8be4e468..cb8cbb5c 100644 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/index.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/emr/index.vue @@ -5,8 +5,20 @@ --> \ No newline at end of file + +.right-aligned { + :deep(.el-input__inner) { + text-align: center; + } +} + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferOut.vue b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferOut.vue new file mode 100644 index 00000000..dc20d79d --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/transferOut.vue @@ -0,0 +1,1116 @@ + + + + + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue b/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue index 6b68fb26..6b70e0a8 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue @@ -9,16 +9,20 @@ - Config - Config - Config + + + + + + +
+ + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/prescriptionList.vue b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/prescriptionList.vue index 4449bbdf..32d57f80 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/prescriptionList.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/prescriptionList.vue @@ -29,6 +29,15 @@
+ 实际执行时间: + 全选: @@ -173,7 +184,7 @@ - + @@ -173,7 +171,7 @@ const queryParams = ref({ orgId: userStore.orgId, }); -const data1 = reactive({ +const data1 = reactive({ patientInfo: {}, grParamBOS: { age: '', @@ -192,10 +190,10 @@ const data1 = reactive({ total: '', hospDate: '', operaDate: '', - outdate: '' + outdate: '', }, rows: [], - types: [] + types: [], }); const patientData = ref({}); const integerPoints = [2, 6, 10, 14, 18, 22]; @@ -268,7 +266,7 @@ function init1(data) { console.log('体温单初始化', data); const inDate = data.grParamBOS.hospDate; const outdate = data.grParamBOS.outdate; - week.value = Math.floor(dateDiff(inDate, outdate) / 7); + week.value = Math.floor(dateDiff(inDate, outdate) / 10); setTemperatureComp(data); } @@ -276,6 +274,8 @@ function init1(data) { * 点击患者列表行 获取患者体温单数据 */ function viewPatient(row) { + console.log('1232312123221231'); + patientInfo.value = row; console.log('点击患者列表行 获取患者体温单数据', row); chargeLoading.value = true; @@ -375,7 +375,7 @@ function getSignsCharts() { function getPatientList() {} // 体温单控件数据设置 function setTemperatureComp(data) { - console.log(data,'体温单控件数据设置'); + console.log(JSON.stringify(), '体温单控件数据设置'); if (data !== undefined) { inputData.value = data; } @@ -434,12 +434,12 @@ function sliceData(data) { const datas = cloneDeep(data); datas.rows = rows; datas.types = types; - console.log(datas,"666666666666666666") + console.log(datas, '666666666666666666'); return datas; } // 计算时间差 function dateDiff(start, end) { - let diffTime = start ? moment(new Date()).diff(moment(start.substring(0, 10))) / 1000 :start; + let diffTime = start ? moment(new Date()).diff(moment(start.substring(0, 10))) / 1000 : start; if (end) { diffTime = moment(end.substring(0, 10)).diff(moment(start.substring(0, 10))) / 1000; } @@ -475,39 +475,45 @@ function printPage() { clone.style.transformOrigin = 'top left'; clone.style.width = 'calc(210mm * 1.11)'; clone.style.height = 'calc(297mm * 1.11)'; - clone.style.marginLeft = '50px'; + clone.style.marginLeft = '50px'; // 插入到 body 中以便 html2pdf 渲染 document.body.appendChild(clone); // 设置 html2pdf 配置 const opt = { - margin: 0, - filename: '体温单.pdf', - image: { type: 'jpeg', quality: 1 }, - html2canvas: { scale: 2, useCORS: true }, // 启用跨域资源支持 - jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }, - pagebreak: { mode: ['avoid-all'] }, + margin: 0, + filename: '体温单.pdf', + image: { type: 'jpeg', quality: 1 }, + html2canvas: { scale: 2, useCORS: true }, // 启用跨域资源支持 + jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }, + pagebreak: { mode: ['avoid-all'] }, onclone: (clonedDoc) => { const chart = clonedDoc.getElementById(clone.id); if (chart) { chart.style.width = '210mm'; // 强制 A4 宽度 chart.style.margin = '0 auto'; } - } + }, }; // 导出为 PDF 并打印 - html2pdf().from(clone).set(opt).toPdf().get('pdf').then(function (pdf) { - pdf.autoPrint(); // 自动打印 - window.open(pdf.output('bloburl'), '_blank'); // 在新窗口打开 PDF(以便用户确认) - }).finally(() => { - document.body.removeChild(clone); // 清理临时元素 - }); + html2pdf() + .from(clone) + .set(opt) + .toPdf() + .get('pdf') + .then(function (pdf) { + pdf.autoPrint(); // 自动打印 + window.open(pdf.output('bloburl'), '_blank'); // 在新窗口打开 PDF(以便用户确认) + }) + .finally(() => { + document.body.removeChild(clone); // 清理临时元素 + }); } // 转化时间 function formatDateTo(dateStr) { - const [formattedDate, timePartWithSeconds] = dateStr ? dateStr.split('T'): ['', '']; + const [formattedDate, timePartWithSeconds] = dateStr ? dateStr.split('T') : ['', '']; const [formattedHour, minutePart] = timePartWithSeconds.split(':'); const formattedTime = `${formattedHour}:${minutePart}`; @@ -580,7 +586,7 @@ function formatHourTimes(dateStr, temperaturePulses) { * 打开体征录入 */ function openAddTprDialog() { - patientData.value = patientInfo.value + patientData.value = patientInfo.value; openAddTpr.value = true; // patientId.value = row.id; nextTick(() => { @@ -633,4 +639,4 @@ function closePatientDetialDialog(str) { max-height: 270mm; overflow: hidden; } - \ No newline at end of file + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/api/api.js b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/api/api.js new file mode 100644 index 00000000..203825c6 --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/api/api.js @@ -0,0 +1,34 @@ +import request from '@/utils/request'; + +// 查询诊疗项目列表 +export function getTemperatureType(data) { + return request({ + url: '/document/definition/getDefinitionId', + method: 'get', + params: data, + }); +} +// 根据时间查询体温单数据 +export function getTemperatureHistory(data) { + return request({ + url: '/document/record/getRecordByEncounterIdAndTimeList', + method: 'get', + params: data, + }); +} +// 体温单保存 +export function addRecord(data) { + return request({ + url: '/document/record/saveOrUpdateRecord', + method: 'post', + data, + }); +} +// 体温单图表展示 +export function temChar(data) { + return request({ + url: '/document/record/temperature-chart', + method: 'get', + params: data, + }); +} diff --git a/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/addAttr.vue b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/addAttr.vue new file mode 100644 index 00000000..b3d64a4d --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/addAttr.vue @@ -0,0 +1,1199 @@ + + + + + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/details.vue b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/details.vue new file mode 100644 index 00000000..9bb9ce32 --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/compoents/details.vue @@ -0,0 +1,746 @@ + + + + + diff --git a/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/index.vue b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/index.vue new file mode 100644 index 00000000..8ed15e47 --- /dev/null +++ b/openhis-ui-vue3/src/views/inpatientNurse/tprsheet/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/openhis-ui-vue3/src/views/inspection/groupRec/components/collect.js b/openhis-ui-vue3/src/views/inspection/groupRec/components/collect.js new file mode 100644 index 00000000..08b80956 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/groupRec/components/collect.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function collectionList(query) { + return request({ + url: '/inspection/collection/information-page', + method: 'get', + params: query + }) +} + +// 修改参数配置 +export function editStatus(ids,type) { + return request({ + url: '/inspection/collection/information-status', + method: 'post', + data: { + ids: ids, + type: type + } + }) +} + + diff --git a/openhis-ui-vue3/src/views/inspection/groupRec/index.vue b/openhis-ui-vue3/src/views/inspection/groupRec/index.vue new file mode 100644 index 00000000..b17de3bb --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/groupRec/index.vue @@ -0,0 +1,269 @@ + + + diff --git a/openhis-ui-vue3/src/views/inspection/instrument/components/instrument.js b/openhis-ui-vue3/src/views/inspection/instrument/components/instrument.js new file mode 100644 index 00000000..d4efd43c --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/instrument/components/instrument.js @@ -0,0 +1,82 @@ +import request from '@/utils/request.js' + +// 查询器材目录列表 +export function getInstrumentList(query) { + return request({ + url: '/inspection/instrument/information-page', + method: 'get', + params: query + }) +} + +// 查询器材目录详细 +export function getInstrumentOne(id) { + return request({ + url: '/inspection/instrument/information-one', + method: 'get', + params: { id } // 确保参数正确传递 + }) +} + +// 新增器材目录 +export function addInstrument(data) { + return request({ + url: '/inspection/instrument/information', + method: 'post', + data: data + }) +} + +// 修改器材目录 +export function editInstrument(data) { + return request({ + url: '/inspection/instrument/information', + method: 'post', + data: data + }) +} + +// // 删除器材目录 +// export function delUser(userId) { +// return request({ +// url: '/system/user/' + userId, +// method: 'delete' +// }) +// } + +// 器材目录分类查询 +export function getInstrumentInit() { + return request({ + url: '/inspection/instrument/init', + method: 'get' + }) +} + +export function editInstrumentStatus(ids,type) { + return request({ + url: '/inspection/instrument/information-status', + method: 'post', + data: { + ids: ids, + type: type + } + }) +} + +// 查询部门树形数据 +export function deptTreeSelect(queryParams) { + return request({ + url: '/base-data-manage/organization/organization', + method: 'get', + params: queryParams + }) +} + +// 查询地点树形数据 +export function locationTreeSelect(queryParams) { + return request({ + url: '/base-data-manage/location/location-page-tree', + method: 'get', + params: queryParams + }) +} diff --git a/openhis-ui-vue3/src/views/inspection/instrument/components/instrumentDialog.vue b/openhis-ui-vue3/src/views/inspection/instrument/components/instrumentDialog.vue new file mode 100644 index 00000000..6390c894 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/instrument/components/instrumentDialog.vue @@ -0,0 +1,402 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/instrument/index.vue b/openhis-ui-vue3/src/views/inspection/instrument/index.vue new file mode 100644 index 00000000..e0d4087f --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/instrument/index.vue @@ -0,0 +1,505 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/lisconfig/components/lisConfig.js b/openhis-ui-vue3/src/views/inspection/lisconfig/components/lisConfig.js new file mode 100644 index 00000000..3bca6060 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/lisconfig/components/lisConfig.js @@ -0,0 +1,36 @@ +import request from '@/utils/request' + +// 初始化 +export function getItemList(query) { + return request({ + url: '/inspection/lisConfig/init-page', + method: 'get', + params: query + }) +} + +export function getItemDetailList(id) { + return request({ + url: '/inspection/lisConfig/info-detail', + method: 'get', + params: {id} + }) +} +export function getInfoList(query) { + return request({ + url: '/inspection/lisConfig/init-list', + method: 'get', + params: query + }) +} +export function saveAllConfig(data) { + return request({ + url: '/inspection/lisConfig/saveAll', + method: 'post', + data: data + }) +} + + + + diff --git a/openhis-ui-vue3/src/views/inspection/lisconfig/index.vue b/openhis-ui-vue3/src/views/inspection/lisconfig/index.vue new file mode 100644 index 00000000..4fd736a4 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/lisconfig/index.vue @@ -0,0 +1,503 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/observation/components/observation.js b/openhis-ui-vue3/src/views/inspection/observation/components/observation.js new file mode 100644 index 00000000..ba7be2b6 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/observation/components/observation.js @@ -0,0 +1,66 @@ +import request from '@/utils/request.js' + +// 查询器材目录列表 +export function getObservationList(query) { + return request({ + url: '/inspection/observation/information-page', + method: 'get', + params: query + }) +} + +// 查询器材目录详细 +export function getObservationOne(id) { + return request({ + url: '/inspection/observation/information-one', + method: 'get', + params: { id } // 确保参数正确传递 + }) +} + +// 新增器材目录 +export function addObservation(data) { + return request({ + url: '/inspection/observation/information', + method: 'post', + data: data + }) +} + +// 修改器材目录 +export function editObservation(data) { + return request({ + url: '/inspection/observation/information', + method: 'post', + data: data + }) +} + +// // 删除器材目录 +// export function delUser(userId) { +// return request({ +// url: '/system/user/' + userId, +// method: 'delete' +// }) +// } + +// 器材目录分类查询 +export function getObservationInit() { + return request({ + url: '/inspection/observation/init', + method: 'get' + }) +} + +export function editObservationStatus(ids,type) { + return request({ + url: '/inspection/observation/information-status', + method: 'post', + data: { + ids: ids, + type: type + } + }) +} + + diff --git a/openhis-ui-vue3/src/views/inspection/observation/components/observationDialog.vue b/openhis-ui-vue3/src/views/inspection/observation/components/observationDialog.vue new file mode 100644 index 00000000..37d40060 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/observation/components/observationDialog.vue @@ -0,0 +1,231 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/observation/index.vue b/openhis-ui-vue3/src/views/inspection/observation/index.vue new file mode 100644 index 00000000..355c8d85 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/observation/index.vue @@ -0,0 +1,370 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/report/components/report.js b/openhis-ui-vue3/src/views/inspection/report/components/report.js new file mode 100644 index 00000000..49ed9c13 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/report/components/report.js @@ -0,0 +1,22 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function reportList(query) { + return request({ + url: '/inspection/laboratory/information-page', + method: 'get', + params: query + }) +} + +export function reports (id) { + return request({ + url: '/inspection/laboratory/reports/' + id, + method: 'get' + }) + +} + + + + diff --git a/openhis-ui-vue3/src/views/inspection/report/index.vue b/openhis-ui-vue3/src/views/inspection/report/index.vue new file mode 100644 index 00000000..a6616add --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/report/index.vue @@ -0,0 +1,216 @@ + + + diff --git a/openhis-ui-vue3/src/views/inspection/sampleCollection/components/collect.js b/openhis-ui-vue3/src/views/inspection/sampleCollection/components/collect.js new file mode 100644 index 00000000..08b80956 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/sampleCollection/components/collect.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function collectionList(query) { + return request({ + url: '/inspection/collection/information-page', + method: 'get', + params: query + }) +} + +// 修改参数配置 +export function editStatus(ids,type) { + return request({ + url: '/inspection/collection/information-status', + method: 'post', + data: { + ids: ids, + type: type + } + }) +} + + diff --git a/openhis-ui-vue3/src/views/inspection/sampleCollection/index.vue b/openhis-ui-vue3/src/views/inspection/sampleCollection/index.vue new file mode 100644 index 00000000..f562eaae --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/sampleCollection/index.vue @@ -0,0 +1,268 @@ + + + diff --git a/openhis-ui-vue3/src/views/inspection/sampleType/components/specimen.js b/openhis-ui-vue3/src/views/inspection/sampleType/components/specimen.js new file mode 100644 index 00000000..c50fc5dc --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/sampleType/components/specimen.js @@ -0,0 +1,77 @@ +import request from '@/utils/request.js' + + +export function getSpecimenList(query) { + return request({ + url: '/inspection/specimen/information-page', + method: 'get', + params: query + }) +} + + +export function getSpecimenOne(id) { + return request({ + url: '/inspection/specimen/information-one', + method: 'get', + params: { id } // 确保参数正确传递 + }) +} + + +export function addSpecimen(data) { + return request({ + url: '/inspection/specimen/information', + method: 'post', + data: data + }) +} + +export function editSpecimen(data) { + return request({ + url: '/inspection/specimen/information', + method: 'post', + data: data + }) +} + + +// 目录分类查询 +export function getSpecimenInit() { + return request({ + url: '/inspection/specimen/init', + method: 'get' + }) +} + + +export function editSpecimenStatus(ids,type) { + return request({ + url: '/inspection/specimen/information-status', + method: 'post', + data: { + ids: ids, + type: type + } + }) +} + +// 查询部门树形数据 +export function deptTreeSelect(queryParams) { + return request({ + url: '/base-data-manage/organization/organization', + method: 'get', + params: queryParams + }) +} + +// 查询地点树形数据 +export function locationTreeSelect(queryParams) { + return request({ + url: '/base-data-manage/location/location-page-tree', + method: 'get', + params: queryParams + }) +} + + diff --git a/openhis-ui-vue3/src/views/inspection/sampleType/components/specimenDialog.vue b/openhis-ui-vue3/src/views/inspection/sampleType/components/specimenDialog.vue new file mode 100644 index 00000000..fc2b6911 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/sampleType/components/specimenDialog.vue @@ -0,0 +1,285 @@ + + + + diff --git a/openhis-ui-vue3/src/views/inspection/sampleType/index.vue b/openhis-ui-vue3/src/views/inspection/sampleType/index.vue new file mode 100644 index 00000000..44ce5fe4 --- /dev/null +++ b/openhis-ui-vue3/src/views/inspection/sampleType/index.vue @@ -0,0 +1,414 @@ + + + + diff --git a/openhis-ui-vue3/src/views/medicationmanagement/billapproval/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/billapproval/index.vue index 53609866..24d7ef71 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/billapproval/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/billapproval/index.vue @@ -41,6 +41,15 @@ @change="handleDateQuery" value-format="YYYY-MM-DD" /> + + 导出 + + +
@@ -159,6 +170,8 @@ import { } from './components/api'; import { useStore } from '@/store/store'; import { formatDate } from '@/utils/index'; +import ChkstockDetailsDialog from '@/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue'; +import TransferDetailsDialog from '@/views/medicationmanagement/transferManagent/components/transferDetailsDialog.vue'; import useTagsViewStore from '@/store/modules/tagsView'; const router = useRouter(); const route = useRoute(); @@ -166,6 +179,7 @@ const store = useStore(); const { proxy } = getCurrentInstance(); const emit = defineEmits(['selectAdviceBase']); const total = ref(0); +const isApply = ref(false); const queryParams = ref({ pageNo: 1, pageSize: 10, @@ -248,19 +262,17 @@ function handelApply(row) { // 审批,查看 function handelApplys(row, view) { - if (row.typeEnum == 2) { + if (row.typeEnum == 100086) { //商品调拨 // 跳转到审核页面 router.replace({ path: '/medicationmanagement/transferManagement/transferManagent', query: { supplyBusNo: row.supplyBusNo, view: view }, }); - } else if (row.typeEnum == 8) { + } else if (row.typeEnum == 8 || row.typeEnum == 2) { //8 批量 - router.replace({ - path: '/medicationmanagement/transferManagement/batchTransfer', - query: { supplyBusNo: row.supplyBusNo, view: view }, - }); + isApply.value = true; + proxy.$refs['tranDetailsDialogRef'].open(row.supplyBusNo); } else if (row.typeEnum == 7) { //领用出库审批通过 router.replace({ @@ -274,11 +286,9 @@ function handelApplys(row, view) { query: { supplyBusNo: row.supplyBusNo, view: view }, }); } else if (row.typeEnum == 4) { + isApply.value = true; //盘点审批 - router.replace({ - path: '/medicationmanagement/chkstock/chkstockPart', - query: { supplyBusNo: row.supplyBusNo, view: view }, - }); + proxy.$refs['detailsDialogRef'].open(row.supplyBusNo); } else if (row.typeEnum == 10) { // 批量盘点 router.replace({ @@ -320,7 +330,15 @@ function handleDateQuery(value) { queryParams.value.applyTimeETime = undefined; } } - +function handleExport() { + proxy.downloadGet( + 'inventory-manage/receipt/export-excel', + { + ...queryParams.value, + }, + `库存审批单_${proxy.formatDateStr(new Date(), 'YYYY-MM-DD')}.xlsx` + ); +} optionInit(); function optionInit() { init().then((res) => { diff --git a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/components/medicineList.vue b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/components/medicineList.vue index 5235607d..33cb0681 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/components/medicineList.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/components/medicineList.vue @@ -35,7 +35,7 @@ align="center" prop="doseUnitCode_dictText" /> --> - + diff --git a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/index.vue index 640c2d61..bfb448fa 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/chkstockBatch/index.vue @@ -37,6 +37,8 @@ > + + 导出 @@ -1042,7 +1044,7 @@ function selectRow(rowValue, index) { form.purchaseinventoryList[index].volume = rowValue.volume; form.purchaseinventoryList[index].minUnitCode = rowValue.minUnitCode; form.purchaseinventoryList[index].unitCode = rowValue.unitCode; - form.purchaseinventoryList[index].manufacturer = rowValue.manufacturer; + form.purchaseinventoryList[index].manufacturerText = rowValue.manufacturerText; form.purchaseinventoryList[index].partPercent = rowValue.partPercent; form.purchaseinventoryList[index].unitList = rowValue.unitList[0]; form.purchaseinventoryList[index].lotNumber = rowValue.lotNumber; @@ -1080,7 +1082,7 @@ function selectRow(rowValue, index) { // form.purchaseinventoryList[index].itemQuantity = ''; // form.purchaseinventoryList[index].reasonCode = ''; // form.purchaseinventoryList[index].reason = ''; -// form.purchaseinventoryList[index].manufacturer = rowValue.manufacturer; +// form.purchaseinventoryList[index].manufacturerText = rowValue.manufacturerText; // form.purchaseinventoryList[index].unitCodeList = [ // {id:1,name:rowValue.unitCode_dictText,unitName:rowValue.unitCode_dictText,code:rowValue.unitCode}, // {id:2,name:rowValue.minUnitCode_dictText,unitName:rowValue.minUnitCode_dictText,code:rowValue.minUnitCode}]; @@ -1559,7 +1561,7 @@ function getDetailAll() { // form.purchaseinventoryList[index].statusMaxvalue = false e.volume = e.totalVolume; e.name = e.itemName; - e.manufacturer = e.manufacturerText; + e.manufacturerText = e.manufacturerText; if (e.purposeTypeEnum) { warehous_type.value.map((item) => { if (item.value == e.purposeTypeEnum) { @@ -1689,7 +1691,7 @@ function getDetail(type) { form.purchaseinventoryList[index].statusMaxvalue = false; e.volume = e.totalVolume; e.name = e.itemName; - e.manufacturer = e.manufacturerText; + e.manufacturerText = e.manufacturerText; if (e.purposeTypeEnum) { warehous_type.value.map((item) => { if (item.value == e.purposeTypeEnum) { @@ -2072,7 +2074,7 @@ function handleReject() { store.clearCurrentDataPLPDALL(); // 跳转到审核页面 router.replace({ - path: '/aaaa/medicationmanagement/billapproval', + path: '/aaaa/billapproval', query: { type: 'chkstockBatch' }, }); } @@ -2089,7 +2091,7 @@ function handelApply() { store.clearCurrentDataPLPDALL(); // 跳转到审核页面 router.replace({ - path: '/aaaa/medicationmanagement/billapproval', + path: '/aaaa/billapproval', query: { type: 'chkstockBatch' }, }); } @@ -2363,6 +2365,22 @@ function handleTraceNo(value, row, index) { } getStockReceiptTypeList(); // 详情页查询下拉树结构 getbusNo(); // 单据号取得 + +// 导出 +const exportRequiredParams = ref({ + pageNo: 1, + pageSize: 10, + busNo: route.query.supplyBusNo +}); +function handleExport() { + proxy.downloadGet( + '/inventory-manage/stocktaking/excel-out', + { + ...exportRequiredParams.value, + }, + `批量盘点单明细_${proxy.formatDateStr(new Date(), 'YYYY-MM-DD')}.xlsx` + ); +} \ No newline at end of file +.custom-tree-node { + display: flex; + align-items: center; +} + +.title { + font-weight: bold; + font-size: large; + margin-bottom: 10px; +} + \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue new file mode 100644 index 00000000..6fb198de --- /dev/null +++ b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/chkstockDetailsDialog.vue @@ -0,0 +1,267 @@ + + + \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/medicineList.vue b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/medicineList.vue index ad607c87..324e6d68 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/medicineList.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/chkstock/components/medicineList.vue @@ -40,12 +40,6 @@ label="产品批号" align="center" prop="lotNumber" - /> - - + --> - + 批量保存 - + 导出 @@ -751,7 +751,7 @@ function addNewRow() { itemType: '', itemType_enumText: '', lotNumber: '', - manufacturer: '', + manufacturerText: '', minUnitCode: '', minUnitCode_dictText: '', name: '', @@ -878,7 +878,7 @@ function getTransferProductDetails() { form.purchaseinventoryList[index].statusMaxvalue = false; e.volume = e.totalVolume; e.name = e.itemName; - e.manufacturer = e.manufacturerText; + e.manufacturerText = e.manufacturerText; e.lossReason = e.reason; if (e.purposeTypeEnum) { warehous_type.value.map((item) => { @@ -1023,7 +1023,7 @@ function handleReject() { store.clearCurrentDataBS(); // 跳转到审核页面 router.replace({ - path: '/aaaa/medicationmanagement/billapproval', + path: '/aaaa/billapproval', query: { type: 'lossReporting' }, }); } @@ -1039,7 +1039,7 @@ function handelApply() { store.clearCurrentDataBS(); // 跳转到审核页面 router.replace({ - path: '/aaaa/medicationmanagement/billapproval', + path: '/aaaa/billapproval', query: { type: 'lossReporting' }, }); } @@ -1095,7 +1095,7 @@ function selectRow(rowValue, index) { form.purchaseinventoryList[index].volume = rowValue.volume; form.purchaseinventoryList[index].minUnitCode = rowValue.minUnitCode; form.purchaseinventoryList[index].unitCode = rowValue.unitCode; - form.purchaseinventoryList[index].manufacturer = rowValue.manufacturer; + form.purchaseinventoryList[index].manufacturerText = rowValue.manufacturerText; form.purchaseinventoryList[index].partPercent = rowValue.partPercent; form.purchaseinventoryList[index].unitList = rowValue.unitList[0]; form.purchaseinventoryList[index].lotNumber = rowValue.lotNumber; @@ -1552,7 +1552,7 @@ function edit() { ...item, name: item.itemName, volume: item.volume, - manufacturer: item.supplierName, + manufacturerText: item.supplierName, totalQuantity: item.totalQuantity, totalPurposeQuantity: item.totalPurposeQuantity, startTime: formatDateymd(item.startTime), @@ -1655,6 +1655,22 @@ getTransferProductDetails(); // show, // edit, // }); + +// 导出 +const exportRequiredParams = ref({ + pageNo: 1, + pageSize: 10, + busNo: route.query.supplyBusNo +}); +function handleExport() { + proxy.downloadGet( + '/inventory-manage/loss/excel-out', + { + ...exportRequiredParams.value, + }, + `报损单据明细_${proxy.formatDateStr(new Date(), 'YYYY-MM-DD')}.xlsx` + ); +} diff --git a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/medicineList.vue b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/medicineList.vue index 0e95d20b..413a1717 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/medicineList.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/medicineList.vue @@ -46,7 +46,7 @@ align="center" prop="doseUnitCode_dictText" /> --> - + diff --git a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/templateJson.json b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/templateJson.json index 928a36ed..b5117aaf 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/templateJson.json +++ b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/components/templateJson.json @@ -33,7 +33,7 @@ "top": 13.5, "height": 12, "width": 75, - "title": "长春大学医院", + "title": "长春市朝阳区中医院医院", "coordinateSync": false, "widthHeightSync": false, "fontSize": 12, @@ -84,7 +84,7 @@ "top": 33, "height": 9.75, "width": 120, - "title": "机构:长春大学医院", + "title": "机构:长春市朝阳区中医院医院", "coordinateSync": false, "widthHeightSync": false, "qrCodeLevel": 0 @@ -161,9 +161,9 @@ "tableSummaryTitle": true, "tableSummary": "", "width": 84.09807741407441, - "field": "manufacturer", + "field": "manufacturerText", "checked": true, - "columnId": "manufacturer", + "columnId": "manufacturerText", "fixed": false, "rowspan": 1, "colspan": 1 @@ -336,4 +336,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/index.vue index a8a32021..2712e566 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/index.vue @@ -31,6 +31,9 @@ 打印单据 + + 导出 + diff --git a/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/index.vue index a84b5d6b..03389971 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/index.vue @@ -1,7 +1,7 @@ - - - @@ -366,7 +422,7 @@ + diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/DischargeDiagnosis.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/DischargeDiagnosis.vue new file mode 100644 index 00000000..1ce72cee --- /dev/null +++ b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/DischargeDiagnosis.vue @@ -0,0 +1,232 @@ + + + diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/api.js b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/api.js index 15571979..3f4a5e09 100644 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/api.js +++ b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/api.js @@ -1,29 +1,12 @@ -import request from '@/utils/request' +import request from '@/utils/request'; // 获取住院信息初期数据列表 export function getInit(query) { return request({ url: '/inpatient-manage/init', method: 'get', - params: query - }) -} - -// 获取住院信息 分页显示 -// export function getAdmissionPage(query) { -// return request({ -// url: '/inpatient-manage/admission-page', -// method: 'get', -// params: query -// }) -// } -// 获取住院信息 分页显示 新 -export function getAdmissionPage(query) { - return request({ - url: '/inhospital-charge/register/register-info', - method: 'get', - params: query - }) + params: query, + }); } // 住院无档登记 @@ -31,8 +14,8 @@ export function addAdmissionInfo(data) { return request({ url: '/inpatient-manage/admission-information', method: 'post', - data: data - }) + data: data, + }); } // 住院登记 @@ -40,8 +23,8 @@ export function admissionInfo(data) { return request({ url: '/inpatient-manage/admission-information', method: 'put', - data: data - }) + data: data, + }); } /** @@ -51,7 +34,7 @@ export function getOrgList() { return request({ url: '/base-data-manage/organization/organization', method: 'get', - }) + }); } /** @@ -60,8 +43,8 @@ export function getOrgList() { export function wardList() { return request({ url: '/app-common/ward-list', - method: 'get' - }) + method: 'get', + }); } /** @@ -71,56 +54,39 @@ export function diagnosisInit() { return request({ url: '/doctor-station/diagnosis/init', method: 'get', - }) + }); } // 查询患者相关 export function patientlLists() { return request({ url: '/patient-manage/information/init', - method: 'get' - }) + method: 'get', + }); } // 查询患者相关 export function doctorList(id) { return request({ url: '/inpatient-manage/doctor-list?orgId=' + id, - method: 'get' - }) + method: 'get', + }); } // 查询患者相关 export function getPatientInfo(id, statusEnum) { return request({ url: `/inpatient-manage/admission-one?id=${id}&statusEnum=${statusEnum}`, - method: 'get' - }) -} - - -// 获取患者基础信息 -export function getPatientBasicInfo(patientId) { - return request({ - url: `/inhospital-charge/register/patient-info?patientId=${patientId}`, - method: 'get' - }) -} - -// 获取患者入院信息 -export function getInHospitalInfo(encounterId) { - return request({ - url: `/inhospital-charge/register/in-hospital-info?encounterId=${encounterId}`, - method: 'get' - }) + method: 'get', + }); } // 获取病区床位信息 export function getBedInfo(wardBusNo) { return request({ url: `/inhospital-charge/register/beds-num?wardBusNo=${wardBusNo}`, - method: 'get' - }) + method: 'get', + }); } // 住院登记 @@ -128,8 +94,8 @@ export function registerInHospital(data) { return request({ url: '/inhospital-charge/register/by-cashier', method: 'post', - data: data - }) + data: data, + }); } // 无档登记 @@ -137,16 +103,16 @@ export function noFilesRegister(data) { return request({ url: '/inhospital-charge/register/no-files', method: 'post', - data: data - }) + data: data, + }); } // 表单初始化 export function patientFormInit() { return request({ url: '/patient-manage/information/init', - method: 'get' - }) + method: 'get', + }); } // 合同 @@ -154,7 +120,7 @@ export function getContractList() { return request({ url: '/app-common/contract-list', method: 'get', - }) + }); } /** @@ -164,6 +130,108 @@ export function getDiagnosisDefinitionList(queryParams) { return request({ url: '/doctor-station/diagnosis/condition-definition-metadata', method: 'get', - params: queryParams - }) -} \ No newline at end of file + params: queryParams, + }); +} + +// 获取患者基础信息 +export function getPatientBasicInfo(patientId) { + return request({ + url: `/inhospital-charge/register/patient-info?patientId=${patientId}`, + method: 'get', + }); +} +// ------------------------------------------------------------------------- +// 查询住院登记信息 +export function getRegisteInfoPage(query) { + return request({ + url: '/yb-inpatient-request/register-info', + method: 'get', + params: query, + }); +} + +// 医保登记按钮 获取信息 +export function getInHospitalInfo(encounterId) { + return request({ + url: `/yb-inpatient-request/in-hospital-info?encounterId=${encounterId}`, + method: 'get', + }); +} +//医保登记按钮 保存 +export function saveEmr(data) { + return request({ + url: '/yb-inpatient-request/inpatient-reg', + method: 'post', + data: data, + }); +} + +//医保出院按钮 信息获取 +export function getInpatientCheckInfo(data) { + return request({ + url: '/yb-inpatient-request/inpatient-check-info', + method: 'post', + data: data, + }); +} +//医保出院按钮 保存 +export function checkOutInpatient(data) { + return request({ + url: '/yb-inpatient-request/inpatient-check-out', + method: 'post', + data: data, + }); +} +//信息变更按钮 获取信息 +export function getInpatientRegInfo(data) { + return request({ + url: '/yb-inpatient-request/inpatient-reg-info', + method: 'get', + data: data, + }); +} +//信息变更按钮 保存 +export function updateInpatientRegInfo(data) { + return request({ + url: '/yb-inpatient-request/update-inpatient-reg', + method: 'post', + data: data, + }); +} + +// 入院撤销 +export function cancelInpatientRegister(data) { + return request({ + url: '/yb-inpatient-request/cancel-inpatient-reg', + method: 'get', + data: data, + }); +} +//出院撤销 +export function cancelDischargeRegister(data) { + return request({ + url: '/yb-inpatient-request/cancel-inpatient-check-out', + method: 'get', + data: data, + }); +} +//病案上传 +export function uploadEmr(data) { + return request({ + url: '/yb-inpatient-request/emr-up', + method: 'post', + data: data, + }); +} + +// 获取患者医保信息 +export function gerPreInfo(data) { + return request({ + url: '/yb-inpatient-request/inpatient-per-info', + method: 'post', + data: data, + }); +} + + diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerEdit.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerEdit.vue new file mode 100644 index 00000000..fa9afa9e --- /dev/null +++ b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerEdit.vue @@ -0,0 +1,537 @@ + + + + diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerForm.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerForm.vue index 652a373a..8febd24c 100644 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerForm.vue +++ b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/registerForm.vue @@ -1,440 +1,450 @@ - +defineExpose({ validateData, submitForm, resetForm }); + diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/index.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/index.vue index b6fd4097..5ea795c4 100644 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/index.vue +++ b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/index.vue @@ -1,31 +1,276 @@ - + +getList(); + diff --git "a/\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/~$\345\217\221\347\211\210\346\227\245\345\277\227.docx" "b/\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/~$\345\217\221\347\211\210\346\227\245\345\277\227.docx" new file mode 100644 index 0000000000000000000000000000000000000000..1fa7bb829c5018c80e4088a6dc1cac205c656586 GIT binary patch literal 162 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�QRB%51nR`ZsUE()t$TFb^iaI_Aj}#xZjS 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 HwYUET!kIo$ literal 0 HcmV?d00001 diff --git "a/\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/\345\217\221\347\211\210\345\206\205\345\256\271.docx" "b/\345\217\221\347\211\210\350\256\260\345\275\225/2025-11-28/\345\217\221\347\211\210\345\206\205\345\256\271.docx" new file mode 100644 index 0000000000000000000000000000000000000000..6bcf367a6691322e00dee0e3e70ecc4ae620d045 GIT binary patch literal 18582 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 literal 0 HcmV?d00001 diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/0000\346\270\205\345\272\223\350\204\232\346\234\254.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/0000\346\270\205\345\272\223\350\204\232\346\234\254.sql" index 92d11501..6ec7b754 100644 --- "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/0000\346\270\205\345\272\223\350\204\232\346\234\254.sql" +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/0000\346\270\205\345\272\223\350\204\232\346\234\254.sql" @@ -1,7 +1,20 @@ +--注执行以下脚本会删除所有相关数据,请谨慎使用(一般是在试运行后正式使用前清理业务数据) + TRUNCATE TABLE adm_encounter ;-- 清空就诊记录表 TRUNCATE TABLE adm_encounter_location;-- 清空就诊地点表 TRUNCATE TABLE adm_encounter_reason;-- 清空就诊原因表 TRUNCATE TABLE adm_encounter_diagnosis;-- 清空就诊诊断表 TRUNCATE TABLE adm_encounter_participant;-- 清空就诊参与者表 TRUNCATE TABLE adm_charge_item;-- 清空费用项目表 -TRUNCATE TABLE elep_medication_request;-- 清空用药申请表 \ No newline at end of file +TRUNCATE TABLE elep_medication_request;-- 清空用药申请表 + + + + +--清理 药品 、耗材、诊疗、费用定义数据,一般不进行操作(生产环境切勿操作),如需清理请解除以下注释 +-- TRUNCATE TABLE med_medication_definition;-- 清空药品定义表 +-- TRUNCATE TABLE med_medication ;-- 清空药品表 +-- TRUNCATE TABLE adm_device_definition;-- 清空耗材定义表 +-- TRUNCATE TABLE wor_activity_definition;-- 清空诊疗定义表 +-- TRUNCATE TABLE adm_charge_item_definition;-- 清空费用定义表 +-- TRUNCATE TABLE adm_charge_item_def_detail;-- 清空费用定义明细表 \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-19 ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-19 ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id.sql" new file mode 100644 index 00000000..07c33da6 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-19 ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id.sql" @@ -0,0 +1,3 @@ +ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id INT8 NULL; + +COMMENT ON COLUMN PUBLIC.doc_statistics.definition_id IS '文书ID'; \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-21 ALTER TABLE public.doc_statistics ADD COLUMN time_point.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-21 ALTER TABLE public.doc_statistics ADD COLUMN time_point.sql" new file mode 100644 index 00000000..0fa20ee6 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/2025-11-21 ALTER TABLE public.doc_statistics ADD COLUMN time_point.sql" @@ -0,0 +1,4 @@ + +ALTER TABLE public.doc_statistics ADD COLUMN time_point VARCHAR NULL; + +COMMENT ON COLUMN public.doc_statistics.time_point IS '时间点'; \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511131215 add_table doc_inventory_item_static.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511131215 add_table doc_inventory_item_static.sql" new file mode 100644 index 00000000..8eb828f8 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511131215 add_table doc_inventory_item_static.sql" @@ -0,0 +1,30 @@ +ALTER TABLE public.doc_inventory_item_static RENAME COLUMN category_code TO dev_category_code; +ALTER TABLE public.doc_inventory_item_static ADD med_category_code varchar(255) DEFAULT '0'::character varying NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.med_category_code IS '药品类别'; +ALTER TABLE public.doc_inventory_item_static ADD total_price numeric(20, 6) NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.total_price IS '采购总价(包装单位)'; +ALTER TABLE public.doc_inventory_item_static ADD total_sale_price numeric(20, 6) NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.total_sale_price IS '销售总价(包装单位)'; +ALTER TABLE public.doc_inventory_item_static ADD remaining_days int4 NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.remaining_days IS '剩余过期天数'; +ALTER TABLE public.doc_inventory_item_static ADD inventory_id int8 NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.inventory_id IS '库存id'; +ALTER TABLE public.doc_inventory_item_static ADD yb_no varchar(255) DEFAULT ''::character varying NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.yb_no IS '医保码'; +ALTER TABLE public.doc_inventory_item_static ADD remainder numeric(20, 6) DEFAULT 0 NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.remainder IS '包装单位数量(余数部分)'; +ALTER TABLE public.doc_inventory_item_static ADD approval_number varchar(255) DEFAULT ''::character varying NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.approval_number IS '批准文号'; +ALTER TABLE public.doc_inventory_item_static ALTER COLUMN med_category_code DROP NOT NULL; +ALTER TABLE public.doc_inventory_item_static ALTER COLUMN med_category_code DROP DEFAULT; +ALTER TABLE public.doc_inventory_item_static ALTER COLUMN dev_category_code DROP NOT NULL; +ALTER TABLE public.doc_inventory_item_static ALTER COLUMN dev_category_code DROP DEFAULT; +ALTER TABLE public.doc_inventory_item_static ADD static_no varchar(255) DEFAULT ''::character varying NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static.static_no IS '项目编号'; +COMMENT ON COLUMN public.doc_inventory_item_static.bus_no IS '备份单据编号'; +ALTER TABLE public.doc_inventory_item_static RENAME COLUMN static_no TO item_no; +ALTER TABLE public.doc_inventory_item_static ADD "number" numeric(20, 6) DEFAULT 0 NOT NULL; +COMMENT ON COLUMN public.doc_inventory_item_static."number" IS '包装单位数量(整数部分)'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511131215 add_table doc_inventory_item_static', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511171215 add_table tmp_encounter_auto_roll.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511171215 add_table tmp_encounter_auto_roll.sql" new file mode 100644 index 00000000..64f4e013 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511171215 add_table tmp_encounter_auto_roll.sql" @@ -0,0 +1,35 @@ +-- public.tmp_encounter_auto_roll definition +-- Drop table +-- DROP TABLE public.tmp_encounter_auto_roll; +CREATE TABLE PUBLIC.tmp_encounter_auto_roll ( + ID bigserial NOT NULL, + status_enum INT4 DEFAULT 2 NOT NULL, + encounter_id INT8 NOT NULL, + instance_table VARCHAR ( 255 ) DEFAULT '' :: CHARACTER VARYING NOT NULL, + instance_id INT8 NOT NULL, + quantity NUMERIC ( 20, 6 ) DEFAULT 0 NOT NULL, + tenant_id INT8 NOT NULL, + delete_flag INT4 DEFAULT 0 NOT NULL, + create_by VARCHAR ( 32 ) DEFAULT '' :: CHARACTER VARYING NOT NULL, + create_time TIMESTAMPTZ ( 6 ) NOT NULL, + update_by VARCHAR ( 32 ) NULL, + update_time TIMESTAMPTZ ( 6 ) NULL, + CONSTRAINT tmp_encounter_auto_roll_pkey PRIMARY KEY ( ID ) +); +COMMENT ON TABLE PUBLIC.tmp_encounter_auto_roll IS '住院就诊滚方绑定'; +-- Column comments +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.ID IS 'ID'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.status_enum IS '状态'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.encounter_id IS '就诊id'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.instance_table IS '实例表名'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.instance_id IS '实例id'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.quantity IS '数量'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.tenant_id IS '租户ID'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.delete_flag IS '删除状态'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.create_by IS '创建人'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.create_time IS '创建时间'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.update_by IS '更新人'; +COMMENT ON COLUMN PUBLIC.tmp_encounter_auto_roll.update_time IS '更新时间'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511171215 add_table tmp_encounter_auto_roll', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191103 ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191103 ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count.sql" new file mode 100644 index 00000000..f7bcd5ab --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191103 ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count.sql" @@ -0,0 +1,8 @@ +-- 添加不能为空且默认值为0的字段 +ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count INT4 NOT NULL DEFAULT 0; +-- 添加字段备注 +COMMENT ON COLUMN PUBLIC.doc_record.print_count IS '打印次数'; + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511191103 ALTER TABLE PUBLIC.doc_record ADD COLUMN print_count', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191303 alter_table doc_statistics_definition.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191303 alter_table doc_statistics_definition.sql" new file mode 100644 index 00000000..ea4e4730 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191303 alter_table doc_statistics_definition.sql" @@ -0,0 +1,6 @@ +ALTER TABLE PUBLIC.doc_statistics_definition ADD COLUMN type_code VARCHAR(20) NULL; +COMMENT ON COLUMN PUBLIC.doc_statistics_definition.type_code IS '类型代码'; + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511191303 alter_table doc_statistics_definition', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191403 alter_table doc_statistics.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191403 alter_table doc_statistics.sql" new file mode 100644 index 00000000..e283e816 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511191403 alter_table doc_statistics.sql" @@ -0,0 +1,5 @@ +ALTER TABLE PUBLIC.doc_statistics ADD COLUMN definition_id INT8 NULL; +COMMENT ON COLUMN PUBLIC.doc_statistics.definition_id IS '文书ID'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511191403 alter_table doc_statistics', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201011 alter_table doc_inventory_item_static.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201011 alter_table doc_inventory_item_static.sql" new file mode 100644 index 00000000..baece04a --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201011 alter_table doc_inventory_item_static.sql" @@ -0,0 +1,5 @@ +ALTER TABLE public.doc_inventory_item_static ALTER COLUMN delete_flag TYPE bpchar(1) USING delete_flag::bpchar(1); + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511201011 alter_table doc_inventory_item_static', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201214 alter_table wor_inventory_item.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201214 alter_table wor_inventory_item.sql" new file mode 100644 index 00000000..4c79096e --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201214 alter_table wor_inventory_item.sql" @@ -0,0 +1,5 @@ +ALTER TABLE public.wor_inventory_item ALTER COLUMN delete_flag TYPE bpchar(1) USING delete_flag::bpchar(1); + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511201214 alter_table wor_inventory_item', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201516 alter_table tmp_encounter_auto_roll.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201516 alter_table tmp_encounter_auto_roll.sql" new file mode 100644 index 00000000..c78e152a --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511201516 alter_table tmp_encounter_auto_roll.sql" @@ -0,0 +1,8 @@ +ALTER TABLE public.tmp_encounter_auto_roll ADD practitioner_id int8 NULL; +COMMENT ON COLUMN public.tmp_encounter_auto_roll.practitioner_id IS '参与者id'; + +ALTER TABLE public.tmp_encounter_auto_roll ADD organization_id int8 NULL; +COMMENT ON COLUMN public.tmp_encounter_auto_roll.organization_id IS '参与者科室id'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511201516 alter_table tmp_encounter_auto_roll', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211515 alter_table doc_statistics.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211515 alter_table doc_statistics.sql" new file mode 100644 index 00000000..bdbba9bd --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211515 alter_table doc_statistics.sql" @@ -0,0 +1,5 @@ +ALTER TABLE public.doc_statistics ADD COLUMN time_point VARCHAR NULL; +COMMENT ON COLUMN public.doc_statistics.time_point IS '时间点'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511211515 alter_table doc_statistics', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211815 alter_table doc_statistics.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211815 alter_table doc_statistics.sql" new file mode 100644 index 00000000..f53a2b93 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511211815 alter_table doc_statistics.sql" @@ -0,0 +1,4 @@ +ALTER TABLE public.doc_statistics DROP COLUMN time_point; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511211815 alter_table doc_statistics', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511221516 alter_table cli_allergy_intolerance.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511221516 alter_table cli_allergy_intolerance.sql" new file mode 100644 index 00000000..585789b9 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511221516 alter_table cli_allergy_intolerance.sql" @@ -0,0 +1,11 @@ +ALTER TABLE public.cli_allergy_intolerance ADD medication_id int8 NULL; +COMMENT ON COLUMN public.cli_allergy_intolerance.medication_id IS '药品定义id'; + +ALTER TABLE public.cli_allergy_intolerance ADD lot_number varchar(255) NULL; +COMMENT ON COLUMN public.cli_allergy_intolerance.lot_number IS '批次号'; + +ALTER TABLE public.cli_allergy_intolerance ADD encounter_id int8 NULL; +COMMENT ON COLUMN public.cli_allergy_intolerance.encounter_id IS '就诊id'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511221516 alter_table cli_allergy_intolerance', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511271311 alter_table adm_organization_location.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511271311 alter_table adm_organization_location.sql" new file mode 100644 index 00000000..3c76fa23 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511271311 alter_table adm_organization_location.sql" @@ -0,0 +1,5 @@ +ALTER TABLE public.adm_organization_location ADD item_code varchar(255) NULL; +COMMENT ON COLUMN public.adm_organization_location.item_code IS '项目编码'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('2202511271311 alter_table adm_organization_location', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511281422 inset_sys_menu.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511281422 inset_sys_menu.sql" new file mode 100644 index 00000000..1fffc523 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202511281422 inset_sys_menu.sql" @@ -0,0 +1,5 @@ +INSERT INTO public.sys_menu ( menu_name, parent_id, order_num, "path", component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) VALUES( '库房对账', 322, 5, 'storeReconciliation', 'medicationmanagement/storeReconciliation/index', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-20 17:02:49.372', 'admin', '2025-11-20 17:04:09.794', NULL); + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202511281422 inset_sys_menu', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512020818 add_column_adm_charge_item.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512020818 add_column_adm_charge_item.sql" new file mode 100644 index 00000000..2ee9f2af --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512020818 add_column_adm_charge_item.sql" @@ -0,0 +1,10 @@ +ALTER TABLE "public"."adm_charge_item" + ADD COLUMN "system_discount_price" decimal(10,6), + ADD COLUMN "manual_adjusted_price" decimal(10,6); + +COMMENT ON COLUMN "public"."adm_charge_item"."system_discount_price" IS '系统内置折扣后价格(总价)'; + +COMMENT ON COLUMN "public"."adm_charge_item"."manual_adjusted_price" IS '人为调价后总价即系统内置价格后的人为调价'; + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202512020818 add_column_adm_charge_item', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512041212 add_table fin_three_part_pay_call_back.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512041212 add_table fin_three_part_pay_call_back.sql" new file mode 100644 index 00000000..9e8cb105 --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/202512041212 add_table fin_three_part_pay_call_back.sql" @@ -0,0 +1,110 @@ + +-- ---------------------------- +-- Table structure for fin_three_part_pay_call_back +-- ---------------------------- +DROP TABLE IF EXISTS "public"."fin_three_part_pay_call_back"; +CREATE TABLE "public"."fin_three_part_pay_call_back" ( + "id" "pg_catalog"."numeric" NOT NULL, + "resp_code" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "resp_msg" "pg_catalog"."text" COLLATE "pg_catalog"."default", + "tran_type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "txn_amt" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "pay_type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "trace_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "txn_time" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "trade_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "trans_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "mid" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "mer_name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "tid" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "mer_trade_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "vf_trade_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "discount_amt" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "qr_valid_time" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "scan_code" "pg_catalog"."text" COLLATE "pg_catalog"."default", + "org_tran_type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "org_txn_name" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "pay_data" "pg_catalog"."text" COLLATE "pg_catalog"."default", + "pos_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "payment_id" "pg_catalog"."int8", + "pay_index" "pg_catalog"."int8", + "pay_time" "pg_catalog"."int8", + "delete_flag" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT '0'::character varying, + "create_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP, + "create_by" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "update_time" "pg_catalog"."timestamp" DEFAULT CURRENT_TIMESTAMP, + "update_by" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "tenant_id" "pg_catalog"."int4", + "settle_date" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "settle_time" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "clear_date" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT NULL::character varying, + "secret_key" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "card_type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "other_msg" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "other_platform" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "pay_method" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "query_result" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "query_result_msg" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "execute_result" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "pay_result" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "account_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "receipt_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "err_msg" "pg_catalog"."varchar" COLLATE "pg_catalog"."default", + "lot_no" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."resp_code" IS '响应码:00 表示成功,其它表示失败'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."resp_msg" IS '响应码解释信息(需要Base64解密)'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."tran_type" IS '交易类型'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."txn_amt" IS '交易金额'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."trace_no" IS '终端流水号:终端号系统跟踪号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."txn_time" IS '交易时间:(yyyyMMddHHmmss)'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."trade_no" IS '支付订单号:银行返回系统订单号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."mer_trade_no" IS '商户系统订单号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."pos_no" IS 'POS机号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."settle_date" IS '交易日'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."settle_time" IS '交易时间'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."clear_date" IS '清算时间'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."secret_key" IS '校验密钥'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."card_type" IS '卡类型'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."other_msg" IS '第三方优惠说明'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."other_platform" IS '第三方平台'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."pay_method" IS '支付方式'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."query_result" IS '查询结果'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."query_result_msg" IS '查询结果说明'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."execute_result" IS '请求结果'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."pay_result" IS '支付结果'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."account_no" IS '卡号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."receipt_no" IS '凭证号'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."err_msg" IS '错误信息'; +COMMENT ON COLUMN "public"."fin_three_part_pay_call_back"."lot_no" IS '批次号'; +COMMENT ON TABLE "public"."fin_three_part_pay_call_back" IS '第三方支付回调表'; + +-- ---------------------------- +-- Indexes structure for table fin_three_part_pay_call_back +-- ---------------------------- +CREATE INDEX "idx_fin_three_part_mer_trade_no" ON "public"."fin_three_part_pay_call_back" USING btree ( + "mer_trade_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "idx_fin_three_part_mid_tid" ON "public"."fin_three_part_pay_call_back" USING btree ( + "mid" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "tid" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "idx_fin_three_part_payment_id" ON "public"."fin_three_part_pay_call_back" USING btree ( + "payment_id" "pg_catalog"."int8_ops" ASC NULLS LAST +); +CREATE INDEX "idx_fin_three_part_trade_no" ON "public"."fin_three_part_pay_call_back" USING btree ( + "trade_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "idx_fin_three_part_txn_time" ON "public"."fin_three_part_pay_call_back" USING btree ( + "txn_time" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table fin_three_part_pay_call_back +-- ---------------------------- +ALTER TABLE "public"."fin_three_part_pay_call_back" ADD CONSTRAINT "fin_three_part_pay_call_back_pkey" PRIMARY KEY ("id"); + + -- Insert migration record +INSERT INTO __MigrationsHistory (MigrationId, ProductVersion) +VALUES ('202512041212 add_table fin_three_part_pay_call_back', '1.0.0'); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\226\260\345\242\236\346\212\245\350\241\250.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\226\260\345\242\236\346\212\245\350\241\250.sql" new file mode 100644 index 00000000..773f92ad --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\226\260\345\242\236\346\212\245\350\241\250.sql" @@ -0,0 +1,18 @@ +注意粘贴时替换蓝色背景parent_id +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '农大疾病统计', 2077, 14, 'diseaseDetails', 'medicationmanagement/statisticalManagement/diseaseDetails', NULL, NULL, '1', '0', 'C', '0', '0', NULL, NULL, 'admin', '2025-11-07 17:22:02.789998', NULL, NULL, NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '红旗在售药品明细', 2077, 13, 'medicationSaleDetails', 'medicationmanagement/statisticalManagement/medicationSaleDetails', NULL, NULL, '1', '0', 'C', '0', '0', NULL, NULL, 'admin', '2025-11-07 17:21:26.116454', NULL, NULL, NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '本年度收入与费用', 2077, 11, 'yearlyRevenueAndExpenses', 'medicationmanagement/statisticalManagement/yearlyRevenueAndExpenses', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-07 17:11:35.915738', 'admin', '2025-11-07 17:43:57.86807', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '患者明细', 2077, 10, 'patientDetails', 'medicationmanagement/statisticalManagement/patientDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-07 14:39:25.610092', 'admin', '2025-11-07 17:17:39.350742', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '药品入库情况', 2077, 12, 'medicationInboundDetails', 'medicationmanagement/statisticalManagement/medicationInboundDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-07 14:10:11.761728', 'admin', '2025-11-07 17:17:58.657013', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '30天回款率', 2077, 9, 'thirtyDayCollectionRate', 'medicationmanagement/statisticalManagement/thirtyDayCollectionRate', NULL, NULL, '1', '0', 'C', '0', '0', NULL, NULL, 'admin', '2025-11-07 13:28:40.973258', NULL, NULL, NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '药品费用增长率', 2077, 8, 'drugExpensesGrowthRate', 'medicationmanagement/statisticalManagement/drugExpensesGrowthRate', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-06 13:23:00.812609', 'admin', '2025-11-07 13:26:11.304488', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '非中选产品采购量占比', 2077, 7, 'nonWinQtyRatio', 'medicationmanagement/statisticalManagement/nonWinQtyRatio', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-06 11:34:59.566212', 'admin', '2025-11-06 13:28:16.121758', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '药品使用情况报表', 2077, 6, 'medicationUsageDetails', 'medicationmanagement/statisticalManagement/medicationUsageDetails', NULL, NULL, '1', '0', 'C', '0', '0', NULL, NULL, 'admin', '2025-11-06 11:30:08.818227', NULL, NULL, NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '药品出库情况', 2077, 5, 'medicationStockOutDetails', 'medicationmanagement/statisticalManagement/medicationStockOutDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-06 11:15:50.874906', 'admin', '2025-11-07 14:04:33.106983', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '线下采购占比报表', 2077, 4, 'offlinePurchaseRatioDetails', 'medicationmanagement/statisticalManagement/offlinePurchaseRatioDetails', NULL, NULL, '1', '0', 'C', '0', '0', NULL, NULL, 'admin', '2025-11-06 11:11:50.221865', NULL, NULL, NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '基本情况', 2077, 3, 'basicInformationDetails', 'medicationmanagement/statisticalManagement/basicInformationDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-06 10:12:35.512478', 'admin', '2025-11-07 14:01:41.079949', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '产品使用情况', 2077, 2, 'productUsageDetails', 'medicationmanagement/statisticalManagement/productUsageDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-06 10:11:26.203004', 'admin', '2025-11-06 13:28:25.624142', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '患者明细主报表', 2077, 1, 'patientMasterDetails', 'medicationmanagement/statisticalManagement/patientMasterDetails', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-05 22:54:46.254575', 'admin', '2025-11-06 09:05:43.082719', NULL); +INSERT INTO "public"."sys_menu" ( "menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '同一医生工作量统计', 2077, 1, 'physicianWorkloadStatisticsDetsils', 'medicationmanagement/statisticalManagement/physicianWorkloadStatisticsDetsils', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-17 09:10:22.616926', 'admin', '2025-11-17 10:31:44.061426', NULL); +INSERT INTO "public"."sys_menu" ( "menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '同一门诊科室工作量统计', 2077, 15, 'outpatientDepartmentMetrics', 'medicationmanagement/statisticalManagement/outpatientDepartmentMetrics', NULL, NULL, '1', '0', 'C', '0', '0', '', NULL, 'admin', '2025-11-10 09:34:16.273803', 'admin', '2025-11-14 09:42:03.010624', NULL); +INSERT INTO "public"."sys_menu" ("menu_name", "parent_id", "order_num", "path", "component", "query", "route_name", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon", "create_by", "create_time", "update_by", "update_time", "remark") VALUES ( '药剂科报表', 360, 6, '111', '', NULL, NULL, '1', '0', 'M', '0', '0', '', NULL, 'admin', '2025-11-05 22:52:47.557804', 'admin', '2025-11-07 17:17:20.600117', NULL); \ No newline at end of file diff --git "a/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\263\250\351\207\212.sql" "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\263\250\351\207\212.sql" new file mode 100644 index 00000000..7efef95a --- /dev/null +++ "b/\350\277\201\347\247\273\350\256\260\345\275\225-DB\345\217\230\346\233\264\350\256\260\345\275\225/\346\263\250\351\207\212.sql" @@ -0,0 +1,187 @@ +COMMENT ON COLUMN "public"."adm_charge_item_definition"."status_enum" IS '状态 + DRAFT(1, "draft", "草稿"), + + ACTIVE(2, "active", "启用"), + + RETIRED(3, "retired", "停用"), + + UNKNOWN(4, "unknown", "未知");'; + + + COMMENT ON COLUMN "public"."adm_charge_item_definition"."yb_type" IS '医保类别 +自费 1 +甲类 2 +乙类 3 +丙类 4'; + +COMMENT ON COLUMN "public"."med_medication_definition"."category_code" IS '药品分类 来源于字典med_category_code'; + +COMMENT ON COLUMN "public"."med_medication_request"."status_enum" IS '药品请求状态 + +/** + * 待发送 + */ + DRAFT(1, "draft", "待发送"), + + /** + * 已发送 + */ + ACTIVE(2, "active", "已发送"), + + /** + * 已完成 + */ + COMPLETED(3, "completed", "已完成"), + + /** + * 暂停 + */ + ON_HOLD(4, "on_hold", "暂停"), + + /** + * 待退 + */ + CANCELLED(5, "cancelled", "取消/待退"), + + /** + * 停嘱 + */ + STOPPED(6, "stopped", "停嘱"), + + /** + * 不执行 + */ + ENDED(7, "ended", "不执行"), + + /** + * 未知 + */ + UNKNOWN(9, "unknown", "未知");'; + + COMMENT ON COLUMN "public"."adm_charge_item"."status_enum" IS '状态 + +/** + * 草稿 + */ + DRAFT(0, "draft", "草稿"), + + /** + * 待收费 + */ + PLANNED(1, "planned", "待收费"), + + /** + * 待结算 + */ + BILLABLE(2, "billable", "待结算"), + + /** + * 不可收费 + */ + NOT_BILLABLE(3, "not-billable", "不可收费"), + + /** + * 终止 + */ + ABORTED(4, "aborted", "终止"), + + /** + * 已收费 + */ + BILLED(5, "billed ", "已收费"), + + /** + * 错误 + */ + ERROR(6, "entered-in-error", "错误"), + + /** + * 待退费 + */ + REFUNDING(7, "refunding", "待退费"), + + /** + * 已退费 + */ + REFUNDED(8, "refunded", "已退费"), + + /** + * 部分退费 + */ + PART_REFUND(9, "part-refund", "部分退费"), + + /** + * 未知 + */ + UNKNOWN(10, "unknown", "未知");'; + + COMMENT ON COLUMN "public"."med_medication_dispense"."status_enum" IS '药品发放状态 + /** + * 草稿 + */ + DRAFT(1, "DR", "草稿"), + + /** + * 待配药 + */ + PREPARATION(2, "PR", "待配药"), + + /** + * 待发药 + */ + IN_PROGRESS(3, "IN", "待发药"), + + /** + * 已发药 + */ + COMPLETED(4, "CO", "已发放"), + + /** + * 暂停 + */ + ON_HOLD(5, "ON", "暂停"), + + /** + * 停止 + */ + STOPPED(6, "ST", "停止"), + + /** + * 拒绝发药 + */ + DECLINED(7, "DE", "拒绝发药"), + + /** + * 已汇总 + */ + SUMMARIZED(8, "SR", "已汇总"), + + /** + * 部分发药 + */ + PART_COMPLETED(9, "PC", "部分发药"), + + /** + * 部分退药 + */ + PART_REFUND(10, "PR", "部分退药"), + + /** + * 已退药 + */ + REFUNDED(12, "RE", "已退药"), + + /** + * 未知 + */ + UNKNOWN(13, "UN", "未知"), + + /** + * 已配药 + */ + PREPARED(14, "PR", "已配药"), + + /** + * 撤回 + */ + CANCELLED(15, "CA", "撤回");'; \ No newline at end of file -- Gitee From 8cfbb56fb02f4bb5a8c0a9b9ab1dcd27903bd692 Mon Sep 17 00:00:00 2001 From: whm <2022265251@qq.com> Date: Sat, 6 Dec 2025 12:19:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?2025-12-06=20=E5=8F=91=E7=89=88=E8=A1=A5?= =?UTF-8?q?=E4=B8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/patientList.vue | 146 ------- .../drugDistribution/patientList.vue | 112 ----- .../drugDistribution/store/patient.js | 12 - .../components/patientList.vue | 148 ------- .../medicalOrderExecution/store/patient.js | 12 - .../components/patientList.vue | 146 ------- .../medicalOrderProofread/store/patient.js | 12 - .../register/components/accomplishList.vue | 158 ------- .../register/components/awaitList.vue | 150 ------- .../register/components/existList.vue | 99 ----- .../inhospital/register/components/index.js | 4 - .../register/components/patientInfo.vue | 407 ------------------ .../register/components/patientInfoForm.vue | 392 ----------------- .../register/components/patientRegister.vue | 317 -------------- 14 files changed, 2115 deletions(-) delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/components/patientList.vue delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/patientList.vue delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/store/patient.js delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/patientList.vue delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/store/patient.js delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/patientList.vue delete mode 100644 openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/store/patient.js delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/accomplishList.vue delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/awaitList.vue delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/existList.vue delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/index.js delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfo.vue delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfoForm.vue delete mode 100644 openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientRegister.vue diff --git a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/components/patientList.vue b/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/components/patientList.vue deleted file mode 100644 index ae0292a2..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/components/patientList.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/patientList.vue b/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/patientList.vue deleted file mode 100644 index b581b84d..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/patientList.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - - - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/store/patient.js b/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/store/patient.js deleted file mode 100644 index db579a0a..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/drugDistribution/store/patient.js +++ /dev/null @@ -1,12 +0,0 @@ -// 选择患者信息 -export const patientInfo = ref() -export function updatePatientInfo(info) { - patientInfo.value = info -} - -// 多选患者 -export const patientInfoList = ref([]) -export function updatePatientInfoList(info) { - patientInfoList.value = info -} - diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/patientList.vue b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/patientList.vue deleted file mode 100644 index b2e7d47f..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/components/patientList.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/store/patient.js b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/store/patient.js deleted file mode 100644 index db579a0a..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderExecution/store/patient.js +++ /dev/null @@ -1,12 +0,0 @@ -// 选择患者信息 -export const patientInfo = ref() -export function updatePatientInfo(info) { - patientInfo.value = info -} - -// 多选患者 -export const patientInfoList = ref([]) -export function updatePatientInfoList(info) { - patientInfoList.value = info -} - diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/patientList.vue b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/patientList.vue deleted file mode 100644 index 2a872b2c..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/components/patientList.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/store/patient.js b/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/store/patient.js deleted file mode 100644 index db579a0a..00000000 --- a/openhis-ui-vue3/src/views/inpatientNurse/medicalOrderProofread/store/patient.js +++ /dev/null @@ -1,12 +0,0 @@ -// 选择患者信息 -export const patientInfo = ref() -export function updatePatientInfo(info) { - patientInfo.value = info -} - -// 多选患者 -export const patientInfoList = ref([]) -export function updatePatientInfoList(info) { - patientInfoList.value = info -} - diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/accomplishList.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/accomplishList.vue deleted file mode 100644 index 7df18833..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/accomplishList.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/awaitList.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/awaitList.vue deleted file mode 100644 index 2078561e..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/awaitList.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/existList.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/existList.vue deleted file mode 100644 index e7514ef4..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/existList.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/index.js b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/index.js deleted file mode 100644 index ab87123d..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import AwaitList from "./awaitList.vue"; -import AccomplishList from "./accomplishList.vue"; -import ExistList from "./existList.vue"; -export {AwaitList,AccomplishList,ExistList} \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfo.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfo.vue deleted file mode 100644 index 20b45092..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfo.vue +++ /dev/null @@ -1,407 +0,0 @@ - - - - - \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfoForm.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfoForm.vue deleted file mode 100644 index 9730e335..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientInfoForm.vue +++ /dev/null @@ -1,392 +0,0 @@ - - - - diff --git a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientRegister.vue b/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientRegister.vue deleted file mode 100644 index cc08aaea..00000000 --- a/openhis-ui-vue3/src/views/ybmanagement/inhospital/register/components/patientRegister.vue +++ /dev/null @@ -1,317 +0,0 @@ - - - -- Gitee