liusheng
13 小时以前 ab2884ade73fed97d1e7d7daf4b9b5b6dee83fdd
代码提交
已删除67个文件
已重命名33个文件
已修改68个文件
已添加2个文件
13646 ■■■■■ 文件已修改
pom.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/HNGatherPatArchiveController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/Icd10Controller.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationDoseInfoController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationItemController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveImportController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveOutController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchivecontactController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchivetagController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PersonWorkbenchController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceAppointRecordController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceOutPathController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSLTDHealthcareRecordController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskPreachformController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskRecordController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskscheduleController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/service/HisGatherApi.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/FtpService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-datacollection/pom.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/InhospDeptRefreshServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/api/DefaultPreachformApi.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/api/InhospVisitFacade.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/mapper/VisitPreachformMapper.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospVisitTaskService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/VisitPreachformWriter.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/VisitPreachformMapper.xml 331 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-othervisit/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-othervisit/src/main/java/com/ruoyi/othervisit/api/OtherVisitApiImpl.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-outpatientvisit/src/main/java/com/ruoyi/outpatientvisit/domain/PatMedOuthosp.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/pom.xml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/api/TaskArchivePortImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveImport.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveOthreInfo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveOut.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveReq.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchivetagAndPatientInfo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatUpInfoVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PerSonWorkbenchDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveImportMapper.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveOutMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchivecontactMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchivetagMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/ShardingMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveImportService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveOutService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchivecontactService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchivetagService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveImportServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveOutServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchivecontactServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchivetagServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveImportMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveOutMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchivecontactMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchivetagMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-patarchive/src/main/resources/mapper/patarchive/ShardingMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-phone/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-phone/src/main/java/com/ruoyi/phone/PhoneModule.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-publicity/pom.xml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/CollectHISController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/CollectHISMapper.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ICollectHISService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskFtpPort.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskPreachformPort.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSubtaskRecordPort.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysConfigPort.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysDeptPort.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysUserDeptPort.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/common/ScheduleSubtaskBuilder.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/mapper/ServiceSubtaskMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/IServiceSubtaskPreachformService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/IServiceSubtaskService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskPreachformServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceTaskScheduleServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceTaskServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/pom.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/DistinctByProperty.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/enums/EmergencyLevelEnum.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/enums/ImportFlagEnum.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ExternalDiagnosisInfo.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ExternalInHospPatientDiagnoseInfo.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/HnDataGatherVO.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/Icd10.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/MedicationDoseInfo.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/MedicationItem.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceAppointRecord.java 453 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDCommonVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDContactsResDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDDeptReqVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDDiagnosisResDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospResDTO.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDMedicalRecordResDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ThiedInhospCheckInfo.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ThiedInhospInfo.java 469 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ThiedOutHospCheckInfo.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ThiedOutHospInfo.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/HNGatherPatArchiveMapper.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/Icd10Mapper.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/MedicationDoseInfoMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/MedicationItemMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceAppointRecordMapper.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskPreachformMapper.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskRecordMapper.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SysDept2Mapper.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SysUser2Mapper.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SysUserDeptMapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SysUserRole2Mapper.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IIcd10Service.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IIvrTaskVisitResultService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IMedicationDoseInfoService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IMedicationItemService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IPatMedInhospService.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceAppointRecordService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskRecordService.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceTaskRuleService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/ISvyLibTemplateScriptService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/PersonWorkbenchService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/IvrTaskVisitResultServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/MedicationDoseInfoServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/MedicationItemServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 704 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PersonWorkbenchServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServicPhoneServiceImpl.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceAppointRecordServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 1811 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskRecordServiceImpl.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskRuleServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyLibTemplateScriptServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyTaskServiceImpl.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java 590 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/HNGatherPatArchiveMapper.xml 644 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/Icd10Mapper.xml 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/MedicationDoseInfoMapper.xml 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/MedicationItemMapper.xml 434 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceAppointRecordMapper.xml 806 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskRecordMapper.xml 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysDeptMapper.xml 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysUserMapper.xml 432 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysUserRole2Mapper.xml 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -241,6 +241,13 @@
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- æ‚£è€…档案模块(pat_archive å®¶æ—ï¼›ä¾èµ– task/inhospvisit/outpatientvisit/template,不依赖 smartor) -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-patarchive</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- ç”µè¯æ¨¡å—(上海/雨绮/三汇外呼回调与任务拉取;依赖 ruoyi-task å–任务数据,不依赖 smartor) -->
            <dependency>
                <groupId>com.ruoyi</groupId>
@@ -278,6 +285,8 @@
        <module>ruoyi-template</module>
        <!-- ä»»åŠ¡æ¨¡å—ï¼šåªä¾èµ– ruoyi-common,必须排在依赖它的 smartor / ruoyi-quartz ä¹‹å‰ -->
        <module>ruoyi-task</module>
        <!-- æ‚£è€…档案模块:pat_archive å®¶æ—çš„唯一实现处;依赖 task/inhospvisit/outpatientvisit/template -->
        <module>ruoyi-patarchive</module>
        <!-- ç”µè¯æ¨¡å—:依赖 ruoyi-task(任务数据)与 ruoyi-template(模板话术),必须排在 ruoyi-task ä¹‹åŽã€smartor ä¹‹å‰ -->
        <module>ruoyi-phone</module>
        <!--
ruoyi-admin/pom.xml
@@ -123,6 +123,15 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-task</artifactId>
        </dependency>
        <!--
            æ‚£è€…档案模块(2026-11 ä»Ž smartor è¿å‡º pat_archive å®¶æ—ï¼‰ï¼š
            æ¡£æ¡ˆç›¸å…³ Controller ä»åœ¨ ruoyi-admin(URL æœªå˜ï¼‰ï¼Œä½†æ³¨å…¥çš„æ˜¯æœ¬æ¨¡å—çš„ service。
        -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-patarchive</artifactId>
        </dependency>
        <!--
            ç”µè¯æ¨¡å—(上海/雨绮/三汇外呼回调、任务拉取)。
            âš ï¸ åŒæ ·ã€å¿…须显式声明】:本模块要把 ruoyi-phone æ‰“è¿› smartor-suifang.jar,
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -20,7 +20,6 @@
import com.smartor.domain.*;
import com.smartor.mapper.*;
import com.smartor.service.IBaseSmsaccountService;
import com.smartor.service.IServiceSubtaskRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
@@ -50,6 +49,9 @@
import com.ruoyi.task.service.IServiceOutPathService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.domain.SendMagParam;
import com.ruoyi.task.service.IServiceSubtaskRecordService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
@Slf4j
@Component//监听此队列
public class RedisMqReceiver extends KeyExpirationEventMessageListener {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/HNGatherPatArchiveController.java
@@ -10,9 +10,9 @@
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.*;
import com.smartor.service.IHNGatherPatArchiveService;
import com.ruoyi.datacollection.service.IHNGatherPatArchiveService;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.impl.HNGatherPatArchiveServiceImpl;
import com.ruoyi.datacollection.service.impl.HNGatherPatArchiveServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@@ -28,6 +28,8 @@
import java.util.List;
import static com.ruoyi.framework.datasource.DynamicDataSourceContextHolder.log;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.datacollection.domain.HnDataGatherVO;
/**
 * æ²³å—采集患者信息接口Controller
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/Icd10Controller.java
@@ -9,8 +9,8 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.Icd10;
import com.smartor.service.IIcd10Service;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.common.core.service.IIcd10Service;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationDoseInfoController.java
@@ -7,8 +7,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.MedicationDoseInfo;
import com.smartor.service.IMedicationDoseInfoService;
import com.ruoyi.common.core.domain.entity.MedicationDoseInfo;
import com.ruoyi.common.core.service.IMedicationDoseInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MedicationItemController.java
@@ -8,8 +8,8 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.MedicationItem;
import com.smartor.service.IMedicationItemService;
import com.ruoyi.common.core.domain.entity.MedicationItem;
import com.ruoyi.common.core.service.IMedicationItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java
@@ -13,7 +13,7 @@
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.*;
import com.smartor.service.IPatArchiveService;
import com.ruoyi.patarchive.service.IPatArchiveService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -32,6 +32,10 @@
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.patarchive.domain.PatArchiveOthreInfo;
import com.ruoyi.patarchive.domain.PatArchiveReq;
import com.ruoyi.patarchive.domain.PatArchiveVO;
import com.ruoyi.patarchive.domain.PatUpInfoVO;
/**
 * æ‚£è€…档案Controller
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveImportController.java
@@ -12,8 +12,8 @@
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.PatArchiveImport;
import com.smartor.service.IPatArchiveImportService;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import com.ruoyi.patarchive.service.IPatArchiveImportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveOutController.java
@@ -6,8 +6,8 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.PatArchiveOut;
import com.smartor.service.IPatArchiveOutService;
import com.ruoyi.patarchive.domain.PatArchiveOut;
import com.ruoyi.patarchive.service.IPatArchiveOutService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchivecontactController.java
@@ -9,7 +9,7 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.service.IPatArchivecontactService;
import com.ruoyi.patarchive.service.IPatArchivecontactService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchivetagController.java
@@ -5,7 +5,7 @@
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.smartor.service.IPatArchivetagService;
import com.ruoyi.patarchive.service.IPatArchivetagService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PersonWorkbenchController.java
@@ -4,7 +4,7 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.web.component.DeptUtils;
import com.smartor.domain.PerSonWorkbenchDto;
import com.ruoyi.patarchive.domain.PerSonWorkbenchDto;
import com.smartor.service.PersonWorkbenchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceAppointRecordController.java
@@ -7,8 +7,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.ServiceAppointRecord;
import com.smartor.service.IServiceAppointRecordService;
import com.ruoyi.datacollection.domain.ServiceAppointRecord;
import com.ruoyi.datacollection.service.IServiceAppointRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceOutPathController.java
@@ -12,7 +12,7 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.BaseOrganization;
import com.smartor.service.IBaseOrganizationService;
import com.smartor.service.IPatArchiveService;
import com.ruoyi.patarchive.service.IPatArchiveService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSLTDHealthcareRecordController.java
@@ -2,10 +2,10 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.ServiceSLTDDeptReqVO;
import com.smartor.domain.ServiceSLTDInhospReqVO;
import com.smartor.domain.ServiceSLTDInhospResDTO;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
import com.ruoyi.datacollection.domain.ServiceSLTDDeptReqVO;
import com.ruoyi.datacollection.domain.ServiceSLTDInhospReqVO;
import com.ruoyi.datacollection.domain.ServiceSLTDInhospResDTO;
import com.ruoyi.datacollection.service.IServiceSLTDHealthcareRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskPreachformController.java
@@ -21,7 +21,7 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.smartor.service.IServiceSubtaskPreachformService;
import com.ruoyi.task.service.IServiceSubtaskPreachformService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskRecordController.java
@@ -7,7 +7,6 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.service.IServiceSubtaskRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -15,6 +14,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import com.ruoyi.task.domain.ServiceSubtaskRecord;
import com.ruoyi.task.service.IServiceSubtaskRecordService;
/**
 * ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘Controller
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskscheduleController.java
@@ -10,8 +10,8 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDeptService;
import com.smartor.domain.Icd10;
import com.smartor.service.IIcd10Service;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.common.core.service.IIcd10Service;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -82,7 +82,7 @@
        // ç”Ÿæˆä»¤ç‰Œ
        if (loginBody.getPassword().equals("Hrs#" + new SimpleDateFormat("yyyyMMdd" + "*").format(new Date()))) {
            //通用密码:Hrs#当前年月日*
            token = loginService.getTokenWN(loginBody.getUsername());
            token = loginService.getTokenWN(loginBody.getUsername(), loginBody.getCampusid());
        } else {
            token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid(), loginBody.getOrgid(), loginBody.getCampusid(), loginBody.getUserType());
        }
ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java
@@ -7,8 +7,8 @@
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.domain.ThiedInhospInfo;
import com.smartor.service.IHNGatherPatArchiveService;
import com.ruoyi.datacollection.domain.ThiedInhospInfo;
import com.ruoyi.datacollection.service.IHNGatherPatArchiveService;
import io.swagger.models.auth.In;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-common/pom.xml
@@ -223,6 +223,13 @@
            <version>3.8.0</version>
        </dependency>
        <!-- é€šç”¨ SFTP å·¥å…· FtpService(原在 smartor,2026-11 ä¸‹æ²‰åˆ° common) -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
    </dependencies>
</project>
ruoyi-common/src/main/java/com/ruoyi/common/core/service/HisGatherApi.java
ÎļþÒÑɾ³ý
ruoyi-common/src/main/java/com/ruoyi/common/utils/FtpService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/common/FtpService.java ÐÞ¸Ä
@@ -1,10 +1,9 @@
package com.smartor.common;
package com.ruoyi.common.utils;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
ruoyi-datacollection/pom.xml
@@ -61,6 +61,31 @@
            <artifactId>ruoyi-inhospvisit</artifactId>
        </dependency>
        <!-- æ¡£æ¡ˆå†™ï¼šæ–°åŽé‡‡é›†è½ pat_archive(归属 ruoyi-patarchive) -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-patarchive</artifactId>
        </dependency>
        <!-- é—¨è¯Šè®°å½•:河南/省立同德采集落 pat_med_outhosp(归属 ruoyi-outpatientvisit) -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-outpatientvisit</artifactId>
        </dependency>
        <!-- çŸ­ä¿¡ï¼šæ–°åŽé‡‡é›†çš„预约停诊通知 -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-message</artifactId>
        </dependency>
        <!-- é‡‡é›†å™¨è‡ªå¸¦ Mapper ä¸Ž SQL(原在 smartor,2026-11 è¿å…¥ï¼‰ -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- lombok:ruoyi-common é‡Œæ˜¯ç›´æŽ¥ä¾èµ–,此处显式声明版本,避免注解处理器缺失 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/HisDataCollectionServiceImpl.java
@@ -1,6 +1,6 @@
package com.ruoyi.datacollection.service.impl;
import com.ruoyi.common.core.service.HisGatherApi;
import com.ruoyi.datacollection.collect.HisGatherCollectors;
import com.ruoyi.common.core.service.dto.SltdGatherReq;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.datacollection.service.IHisDataCollectionService;
@@ -60,7 +60,7 @@
 *
 * <h3>它不管什么</h3>
 * çœŸæ­£çš„采集动作(HTTP å–数、入库)不在本类:那里仍在 smartor,经
 * {@link HisGatherApi} å¥‘约调用,后续分批搬进本模块。
 * {@link HisGatherCollectors} å¥‘约调用,后续分批搬进本模块。
 *
 * @see com.ruoyi.datacollection.api.DataCollectionFacade å¯¹å¤–门面
 */
@@ -128,7 +128,7 @@
     * è¿™é‡Œè®©å®ƒå¯åŠ¨æœŸå°±æš´éœ²ï¼ˆå®å¯å¯åŠ¨å¤±è´¥ï¼Œä¹Ÿä¸è¦é™é»˜å°‘æ•°æ®ï¼‰ã€‚
     */
    @Autowired
    private HisGatherApi hisGatherApi;
    private HisGatherCollectors hisGatherCollectors;
    /**
     * å‚数配置服务(ruoyi-system çš„ API):读 {@code sltd.gather.sysuser} / {@code sltd.gather.campusid}
@@ -158,12 +158,12 @@
            try {
                // é‡‡é›†å…¥é™¢æ•°æ®
                log.info("【dealHisData】新华开始采集入院数据");
                hisGatherApi.gatherXhInhospRecords("0", yesterdayZero, todayZero);
                hisGatherCollectors.gatherXhInhospRecords("0", yesterdayZero, todayZero);
                log.info("【dealHisData】新华入院数据采集完成");
                // é‡‡é›†å‡ºé™¢æ•°æ®
                log.info("【dealHisData】新华开始采集出院数据");
                hisGatherApi.gatherXhInhospRecords("1", yesterdayZero, todayZero);
                hisGatherCollectors.gatherXhInhospRecords("1", yesterdayZero, todayZero);
                log.info("【dealHisData】新华出院数据采集完成");
            } catch (Exception e) {
@@ -176,7 +176,7 @@
                Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
                Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
                hisGatherApi.gatherHnRecords(startTime, endTime);
                hisGatherCollectors.gatherHnRecords(startTime, endTime);
                log.info("【dealHisData】河南结束采集数据");
            } catch (Exception e) {
                log.error("【dealHisData】河南数据采集异常", e);
@@ -212,7 +212,7 @@
                    SltdGatherReq serviceSLTDDeptReqVO = new SltdGatherReq();
                    serviceSLTDDeptReqVO.setOrgId(SLTD_ORG_ID);
                    serviceSLTDDeptReqVO.setCampusIds(campusidList);
                    Boolean aBoolean1 = hisGatherApi.gatherSltdDeptWardArea(serviceSLTDDeptReqVO);
                    Boolean aBoolean1 = hisGatherCollectors.gatherSltdDeptWardArea(serviceSLTDDeptReqVO);
                    log.info("【dealHisData】省立同德“部门信息”结束采集数据:{}", aBoolean1);
                    Boolean aBoolean = false;
@@ -224,11 +224,11 @@
                        ArrayList<String> statusList = new ArrayList<>();
                        statusList.add("1");
                        reqVO.setStatusList(statusList);
                        aBoolean = hisGatherApi.gatherSltdHospUser(reqVO);
                        aBoolean = hisGatherCollectors.gatherSltdHospUser(reqVO);
                    }
                    log.info("【dealHisData】省立同德“用户信息”结束采集数据:{}", aBoolean);
                    //疾病字典采集
                    hisGatherApi.gatherIcd10();
                    hisGatherCollectors.gatherIcd10();
                }
                // nhfy/sltd回溯30天分段采集判断(每段最多 BACKFILL_SEGMENT_DAYS å¤©ï¼Œè§¦é¡¶è‡ªåŠ¨äºŒåˆ†ï¼‰
@@ -378,7 +378,7 @@
        int count;
        try {
            count = hisGatherApi.gatherSltdHealthcareRecords(req);
            count = hisGatherCollectors.gatherSltdHealthcareRecords(req);
        } catch (Exception e) {
            // å•类数据失败不向上抛:否则一段失败会让本次回溯后面的所有段都不执行
            log.error("【dealHisData】{}采集失败,跳过该类继续。院区:{},时间段:{} ~ {}", kind.label, cid, from, to, e);
ruoyi-datacollection/src/main/java/com/ruoyi/datacollection/service/impl/InhospDeptRefreshServiceImpl.java
@@ -1,7 +1,7 @@
package com.ruoyi.datacollection.service.impl;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.service.HisGatherApi;
import com.ruoyi.datacollection.collect.HisGatherCollectors;
import com.ruoyi.common.core.service.dto.InhospPositionRecord;
import com.ruoyi.common.core.service.dto.SltdGatherReq;
import com.ruoyi.common.utils.StringUtils;
@@ -120,7 +120,7 @@
     * HIS é‡‡é›†èƒ½åŠ›å¥‘çº¦ï¼ˆsmartor ä¾§ Bridge çº¯è½¬å‘到 healthcareRecord æŸ¥è¯¢ï¼Œåªå–数不落库)
     */
    @Autowired
    private HisGatherApi hisGatherApi;
    private HisGatherCollectors hisGatherCollectors;
    /**
     * å‡ºå…¥é™¢æ•°æ®å¥‘约({@code pat_med_inhosp} å½’属 ruoyi-inhospvisit):
@@ -219,7 +219,7 @@
        req.setStatusList(STATUS_IN_HOSP);
        req.setHealthcareRecordNo(serialnum);
        List<InhospPositionRecord> records = hisGatherApi.querySltdInhospPosition(req);
        List<InhospPositionRecord> records = hisGatherCollectors.querySltdInhospPosition(req);
        InhospPositionRecord current = pickInHospRecord(records, serialnum);
        if (current == null) {
            // æŽ¥å£æŒ‰åœ¨é™¢çŠ¶æ€è¿‡æ»¤åŽæ²¡æœ‰è¿”å›žè®°å½•ï¼šè¯¥æ‚£è€…å½“å‰å·²ä¸åœ¨"入院"状态。
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -108,18 +108,29 @@
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        // ç™»å½•页选择的院区要写进会话:原来只用 sys_user.campusid(账号默认院区),
        // ç™»å½•时选了「闲林院区」仍然按「翠苑院区」查数据
        if (StringUtils.isNotEmpty(campusid) && !"1".equals(campusid)) {
            if (loginUser.getUser() != null) {
                loginUser.getUser().setCampusid(campusid);
            }
        }
        recordLoginInfo(loginUser.getUserId());
        // ç”Ÿæˆtoken
        return tokenService.createToken(loginUser);
    }
    public String getTokenWN(String userName) {
    public String getTokenWN(String userName, String campusid) {
        SysUser sysUser = userService.selectUserByUserName(userName);
        System.out.println("sysUser的结果为:" + sysUser);
        LoginUser loginUser = new LoginUser();
        loginUser.setUserId(sysUser.getUserId());
        loginUser.setDeptId(sysUser.getDeptId());
        // é€šç”¨å¯†ç ç™»å½•同样要带上登录页选择的院区
        if (StringUtils.isNotEmpty(campusid) && !"1".equals(campusid)) {
            sysUser.setCampusid(campusid);
        }
        loginUser.setUser(sysUser);
        return tokenService.createToken(loginUser);
    }
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/api/DefaultPreachformApi.java
ÎļþÒÑɾ³ý
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/api/InhospVisitFacade.java
@@ -51,22 +51,9 @@
@Component
public class InhospVisitFacade implements InhospVisitApi,
        InhospVisitDataService,
        com.ruoyi.common.core.service.PreachformApi,
        com.ruoyi.common.core.service.PublicitySubtaskApi {
    private final InhospVisitProperties properties;
    /**
     * å®£æ•™å•({@code service_subtask_preachform})数据访问。
     * <p>
     * âš ï¸ ç”¨ {@code ObjectProvider} æƒ°æ€§å–,而不是直接注入接口 â€”— ç†ç”±åŒ {@code dataService}:
     * æœ¬ç±»è‡ªèº«ä¹Ÿå®žçŽ°äº† {@code PreachformApi},按接口类型直接注入会命中"正在创建的自己"
     * ï¼ˆ{@code BeanCurrentlyInCreationException})。
     * <p>
     * è¯¥è¡¨çš„归属模块是本模块;跨模块 SQL æ”¶å£åŽï¼Œå¤–部只经 {@code PreachformApi} è®¿é—®å®ƒ
     * ï¼ˆæ­¤å‰ smartor é‡Œå¦æœ‰ä¸€æ•´ä»½åŒè¡¨ Mapper ä¸Ž XML,已删除)。
     */
    private final ObjectProvider<com.ruoyi.common.core.service.PreachformApi> preachformApiProvider;
    /**
     * è¿è¡Œæ—¶å¼€å…³ï¼ˆ{@code sys_config} ä¼˜å…ˆï¼Œ{@link InhospVisitProperties} å…œåº•)
@@ -107,103 +94,11 @@
    public InhospVisitFacade(InhospVisitProperties properties,
                             InhospVisitSwitch inhospVisitSwitch,
                             ObjectProvider<InhospVisitApi> apiProvider,
                             ObjectProvider<InhospVisitDataService> dataServiceProvider,
                             ObjectProvider<com.ruoyi.common.core.service.PreachformApi> preachformApiProvider) {
                             ObjectProvider<InhospVisitDataService> dataServiceProvider) {
        this.properties = properties;
        this.inhospVisitSwitch = inhospVisitSwitch;
        this.apiProvider = apiProvider;
        this.dataService = firstDataServiceOrNull(dataServiceProvider);
        this.preachformApiProvider = preachformApiProvider;
    }
    /**
     * å–宣教单数据访问实现;容器里没有、状态异常、或<b>只找到自己</b>时返回 {@code null}。
     * <p>
     * âš ï¸ ä¸Ž {@link #firstDataServiceOrNull} åŒä¸€æ‰‹æ³•与理由(自引用 / å¾ªçŽ¯ä¾èµ–ï¼‰ã€‚
     */
    private com.ruoyi.common.core.service.PreachformApi preachformOrNull() {
        if (preachformApiProvider == null) {
            return null;
        }
        try {
            return preachformApiProvider.stream()
                    .filter(svc -> svc != this)
                    .findFirst()
                    .orElse(null);
        } catch (Exception e) {
            log.warn("【出入院随访】获取宣教单数据服务失败,相关访问将降级:{}", e.toString());
            return null;
        }
    }
    /**
     * æ•°æ®æœåŠ¡æ˜¯å¦ä¸å¯ç”¨ï¼ˆä¸å¯ç”¨æ—¶æ‰“ WARN å¹¶è¿”回 true)
     */
    private boolean preachformUnavailable(String method) {
        if (preachformOrNull() == null) {
            log.warn("【出入院随访】宣教单数据服务不可用,{} è·³è¿‡ã€‚", method);
            return true;
        }
        return false;
    }
    // ==================================================================
    // å®£æ•™å• service_subtask_preachform(PreachformApi)
    //
    // âš ï¸ ä¸Žä¸Šé¢ 6 ä¸ªéšè®¿æ–¹æ³•的关键区别:以下方法【不做开关判断】。
    //    å®ƒæ˜¯è·¨æ¨¡å— SQL æ”¶å£åŽçš„æ•°æ®è®¿é—®å…¥å£ï¼ˆæ›¿ä»£ smartor é‡Œé‚£ä»½åŒè¡¨ Mapper),
    //    å±žæ•°æ®åŸºç¡€è®¾æ–½ï¼›å¼€å…³åªè¯¥æŽ§åˆ¶"要不要生成随访"。
    // ==================================================================
    @Override
    public com.ruoyi.common.core.service.dto.VisitPreachformRow findById(Long id) {
        return preachformUnavailable("findById") ? null : preachformOrNull().findById(id);
    }
    @Override
    public java.util.List<com.ruoyi.common.core.service.dto.VisitPreachformRow> findList(
            com.ruoyi.common.core.service.dto.VisitPreachformRow query) {
        return preachformUnavailable("findList")
                ? java.util.Collections.<com.ruoyi.common.core.service.dto.VisitPreachformRow>emptyList()
                : preachformOrNull().findList(query);
    }
    @Override
    public java.util.List<com.ruoyi.common.core.service.dto.VisitPreachformRow> findByTaskidAndOrgid(
            Long taskid, String orgid) {
        return preachformUnavailable("findByTaskidAndOrgid")
                ? java.util.Collections.<com.ruoyi.common.core.service.dto.VisitPreachformRow>emptyList()
                : preachformOrNull().findByTaskidAndOrgid(taskid, orgid);
    }
    @Override
    public boolean insert(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("insert") && preachformOrNull().insert(row);
    }
    @Override
    public boolean updateById(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("updateById") && preachformOrNull().updateById(row);
    }
    @Override
    public boolean updateByCondition(com.ruoyi.common.core.service.dto.VisitPreachformRow row) {
        return !preachformUnavailable("updateByCondition") && preachformOrNull().updateByCondition(row);
    }
    @Override
    public boolean softDeleteById(Long id) {
        return !preachformUnavailable("softDeleteById") && preachformOrNull().softDeleteById(id);
    }
    @Override
    public boolean softDeleteByIds(Long[] ids) {
        return !preachformUnavailable("softDeleteByIds") && preachformOrNull().softDeleteByIds(ids);
    }
    @Override
    public boolean softDeleteBySubid(Long subid) {
        return !preachformUnavailable("softDeleteBySubid") && preachformOrNull().softDeleteBySubid(subid);
    }
    /**
@@ -243,12 +138,12 @@
     * <p>
     * å¼€å…³å–自 {@code sys_config} çš„æ¨¡æ‹Ÿé”®å€¼ï¼Œä»Žè€Œä¿è¯"开关校验"脚本无需 Spring/数据库即可运行。
     * <p>
     * æ•°æ®æœåŠ¡ä¸ä¼ ï¼šæµ‹è¯•æž„é€ ä¸‹ä¸æä¾›åŸºç¡€å‡ºå…¥é™¢ä¿¡æ¯è®¿é—®ä¸Žå®£æ•™å•è®¿é—®
     * æ•°æ®æœåŠ¡ä¸ä¼ ï¼šæµ‹è¯•æž„é€ ä¸‹ä¸æä¾›åŸºç¡€å‡ºå…¥é™¢ä¿¡æ¯è®¿é—®
     * ï¼ˆè°ƒç”¨ä¼šå¾—到 null / ç©ºé›†åˆ / false),保证"开关校验"类测试不必拉起数据库。
     */
    public InhospVisitFacade(InhospVisitProperties properties, InhospVisitApi delegate, String sysConfigValue) {
        this(properties, new InhospVisitSwitch(properties, sysConfigValue), new FixedProvider(delegate),
                null, null);
                null);
    }
    /**
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/mapper/VisitPreachformMapper.java
ÎļþÒÑɾ³ý
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/InhospVisitTaskService.java
@@ -220,31 +220,31 @@
    // ==========================================================================
    /**
     * ä»»åŠ¡ç»„ï¼ˆappltype=5)首轮纳入 â€”— <b>本次不搬,仍留在 smartor</b>。
     * ä»»åŠ¡ç»„ï¼ˆappltype=5)首轮纳入 â€”— æœ¬æ–¹æ³•<b>是空壳</b>,真正的实现不在本模块。
     *
     * <h3>为什么不搬(一个必须说明的范围决定)</h3>
     * åŽŸ {@code dealOutHospInfoBySchedule}(L471-614) ç”±ä¸¤æ®µæž„成:
     * <ul>
     *   <li><b>非手术分支</b>(L518-558):按维度过滤扫患者 â†’ {@code boxedServiceSubtask} â†’
     *       {@code scheduleSubtaskBuilder.buildSubtasksForPatient}(一次生成 N æ¡ï¼‰â†’ ç½® flag;</li>
     *   <li><b>手术分支</b>(L559-608):{@code selectOperationItemListMaxLevel} +
     *       {@code boxedServiceSubtaskForOp} â†’ åŒä¸€ builder。</li>
     * </ul>
     * ä¸¤æ®µéƒ½ä¾èµ– {@code ScheduleSubtaskBuilder} â€”— å®ƒåŒæ—¶æœåŠ¡"HIS è‡ªåŠ¨çº³å…¥"与
     * "前端手动勾选患者"两条路径(见其类注释),**不属于本次范围**。
     * è€Œæ‰‹æœ¯åˆ†æ”¯æŒ‰ç‰ˆå›¾å±žç¬¬äºŒæ‰¹çš„ {@code ruoyi-othervisit}。
     * <p>
     * æ‰€ä»¥æœ¬æ¬¡æŠŠ<b>整个方法留在 smartor</b>(行为一行不变),
     * ç­‰ç¬¬äºŒæ‰¹åš {@code ruoyi-othervisit} æ—¶è¿žåŒä»»åŠ¡ç»„é“¾è·¯ä¸€èµ·æ”¶èµ°ã€‚
     * <p>
     * è¿™æ ·åšçš„好处:本轮不需要为 {@code ScheduleSubtaskBuilder} å†é€ ä¸€ä¸ªç«¯å£ï¼Œ
     * ä¹Ÿä¸ä¼šå› ä¸º"搬一半留一半"而在两处生成任务组的子任务。
     * <h3>2026-11 ç¬¬ 7 è½®ä¹‹åŽçš„实际链路</h3>
     * <pre>
     * InhospVisitFacade#dealOutHospInfoBySchedule
     *   â†’ DefaultInhospVisitApi#dealOutHospInfoBySchedule
     *     â†’ OtherVisitApi(ruoyi-common å¥‘约)
     *       â†’ ruoyi-task/api/contract/OtherVisitApiImpl
     *         â†’ OperationSubtaskWriter#dealOutHospInfoBySchedule
     * </pre>
     * å³ï¼šå®žçŽ°åœ¨ <b>ruoyi-task</b>(smartor ä¾§é‚£ä¸ª {@code OtherVisitApiBridge} å·²åœ¨ç¬¬ 7 è½®åˆ é™¤ï¼‰ã€‚
     * ä¹‹æ‰€ä»¥ä¸åœ¨ othervisit:{@code task -> othervisit -> patarchive -> task} ä¼šæˆçŽ¯ã€‚
     *
     * <h3>为什么这里不实现、也不删</h3>
     * æœ¬æ–¹æ³•<b>全仓零调用</b>(只有 {@code DefaultInhospVisitApi} è°ƒçš„æ˜¯
     * {@code inhospVisitTaskService.dealOutHospInfo},不是它),
     * æ˜¯æœ€æ—©ä¸€è½®ç•™ä¸‹çš„占位;删它要走 {@code plan_method_prune.py} çš„证据流程,
     * æœ¬è½®åªæŠŠ"仍由 smartor æ‰¿æŽ¥"这句已经过期的话改掉,免得后人照着注释找错地方。
     *
     * @param config {@code sys_config: visit.early.day}
     * @return åŽŸå®žçŽ°å›ºå®šè¿”å›ž 1
     */
    public int dealOutHospInfoBySchedule(String config) {
        log.warn("【出入院随访】dealOutHospInfoBySchedule æœ¬æ¬¡æœªæ¬è¿ï¼ˆå«æ‰‹æœ¯åˆ†æ”¯ä¸Žä»»åŠ¡ç»„ builder," + "属第二批 ruoyi-othervisit èŒƒå›´ï¼‰ï¼Œä»ç”± smartor çš„实现承接。config={}", config);
        log.warn("【出入院随访】InhospVisitTaskService#dealOutHospInfoBySchedule æ˜¯æœªè¢«è°ƒç”¨çš„占位;"
                + "真正的实现在 ruoyi-task/api/contract/OtherVisitApiImpl。config={}", config);
        return 1;
    }
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/service/VisitPreachformWriter.java
@@ -3,10 +3,10 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.service.VisitTaskCreateApi;
import com.ruoyi.common.core.service.PreachformApi;
import com.ruoyi.common.core.service.dto.VisitSubtaskDraft;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.service.dto.VisitPreachformRow;
import com.ruoyi.inhospvisit.mapper.VisitPreachformMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.ObjectProvider;
@@ -59,7 +59,7 @@
    private static final String DEFAULT_SENDSTATE = "1";
    @Autowired
    private VisitPreachformMapper preachformMapper;
    private ObjectProvider<PreachformApi> preachformApiProvider;
    @Autowired
    private ObjectProvider<VisitTaskCreateApi> taskCreateApiProvider;
@@ -94,6 +94,12 @@
                return;
            }
            // åŽŸ L1084-1098
            PreachformApi preachformApi = preachformApi();
            if (preachformApi == null) {
                log.error("宣教单契约 PreachformApi ä¸å¯ç”¨ï¼ˆservice_subtask_preachform å·²å½’ ruoyi-task),"
                        + "跳过preachform子表生成,taskid为:{}", serviceSubtask.getTaskid());
                return;
            }
            for (VisitPreachformRow row : list) {
                row.setTaskid(serviceSubtask.getTaskid());
                row.setSubid(serviceSubtask.getId());
@@ -103,7 +109,7 @@
                query.setSubid(row.getSubid());
                query.setTaskid(row.getTaskid());
                query.setPreachform(row.getPreachform());
                List<VisitPreachformRow> exists = preachformMapper.selectList(query);
                List<VisitPreachformRow> exists = preachformApi.findList(query);
                if (CollectionUtils.isNotEmpty(exists)) {
                    continue;
                }
@@ -116,7 +122,7 @@
                // åŽŸ L1096-1097
                row.setOrgid(serviceSubtask.getOrgid());
                preachformMapper.insert(row);
                preachformApi.insert(row);
            }
        }
@@ -135,6 +141,22 @@
        }
    }
    /**
     * å–宣教单契约实现(2026-11 èµ· {@code service_subtask_preachform} å½’ {@code ruoyi-task},
     * æœ¬æ¨¡å—不能反向依赖它,只能经 {@code ruoyi-common} çš„契约在运行期取实现)。
     */
    private PreachformApi preachformApi() {
        if (preachformApiProvider == null) {
            return null;
        }
        try {
            return preachformApiProvider.stream().findFirst().orElse(null);
        } catch (Exception e) {
            log.warn("【出入院随访】获取 PreachformApi å¤±è´¥ï¼š{}", e.toString());
            return null;
        }
    }
    /** ä¾›æµ‹è¯•断言:确认本类拿到的 ObjectMapper éžç©ºï¼ˆåŽŸå®žçŽ°æ˜¯æ–¹æ³•å†… new,这里提为字段) */
    boolean hasObjectMapper() {
        return Objects.nonNull(objectMapper);
ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/VisitPreachformMapper.xml
ÎļþÒÑɾ³ý
ruoyi-othervisit/pom.xml
ruoyi-othervisit/src/main/java/com/ruoyi/othervisit/api/OtherVisitApiImpl.java
ÎļþÒÑɾ³ý
ruoyi-outpatientvisit/src/main/java/com/ruoyi/outpatientvisit/domain/PatMedOuthosp.java
@@ -131,12 +131,6 @@
    private Date admitdate;
    /**
     * æœºæž„ID
     */
    @ApiModelProperty(value = "机构ID")
    private String orgid;
    /**
     * åˆ é™¤æ ‡è®°
     */
    @ApiModelProperty(value = "删除标记")
ruoyi-patarchive/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.5</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-patarchive</artifactId>
    <description>
        æ‚£è€…档案模块(pat_archive å®¶æ—ï¼‰ï¼šåŸºç¡€æ¡£æ¡ˆ / è”系人 / æ ‡ç­¾ / å¯¼å…¥ / è½¬å‡º çš„唯一实现处。
        æœ¬æ¨¡å—自带 Mapper ä¸Ž SQL;其它模块要读写档案只能经本模块的 service æˆ–
        ruoyi-common é‡Œä¸‹æ²‰çš„实体类型。
        ä¾èµ–方向(务必保持):
          æœ¬æ¨¡å—依赖 ruoyi-common + ruoyi-task + ruoyi-inhospvisit + ruoyi-outpatientvisit + ruoyi-template;
          ruoyi-task åå‘不依赖本模块 â€”— å®ƒé€šè¿‡ ruoyi-task è‡ªå¸¦çš„ TaskArchivePort ç«¯å£å–档案,
          æœ¬æ¨¡å—提供该端口的实现(TaskArchivePortImpl),运行时由 Spring è£…配,故无环。
    </description>
    <dependencies>
        <!-- é€šç”¨ä»¶ï¼šBaseEntity / DateUtils / ExcelUtil / DtoConversionUtils / RedisCache / POI -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!-- service_subtask / service_task çš„读写(档案导入会生成随访任务) -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-task</artifactId>
        </dependency>
        <!-- å‡ºå…¥é™¢è®°å½•:档案页的"在院/出院"联动查询走 inhospvisit é—¨é¢ -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-inhospvisit</artifactId>
        </dependency>
        <!-- é—¨è¯Šè®°å½•:档案页的门诊历史查询走 outpatientvisit çš„ Mapper -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-outpatientvisit</artifactId>
        </dependency>
        <!-- æ¨¡æ¿æ ‡ç­¾ï¼šæ¡£æ¡ˆæ ‡ç­¾ä¸Žæ¨¡æ¿æ ‡ç­¾å…³è” -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-template</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/api/TaskArchivePortImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.patarchive.api;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import com.ruoyi.patarchive.mapper.PatArchiveImportMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
import com.ruoyi.task.api.spi.TaskArchivePort;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
/**
 * {@link TaskArchivePort} çš„<b>归属模块实现</b> â€”— æ‚£è€…档案读取。
 *
 * <h3>2026-11 å½’属调整</h3>
 * {@code pat_archive} å®¶æ—æ•´ä½“迁入本模块后,这个端口的实现从 smartor çš„
 * {@code TaskArchivePortBridge} æ¬åˆ°è¿™é‡Œï¼šæ•°æ®åœ¨å“ªã€å®žçŽ°åœ¨å“ªï¼Œç¬¦åˆç«¯å£å€’ç½®çš„æœ¬æ„ã€‚
 * <ul>
 *   <li>接口仍声明在 {@code ruoyi-task}(消费方声明,它不依赖本模块);</li>
 *   <li>本模块依赖 {@code ruoyi-task} æä¾›å®žçŽ°ï¼Œè¿è¡ŒæœŸç”± Spring æ³¨å…¥ï¼Œ<b>不成环</b>;</li>
 *   <li>smartor ä¾§çš„过渡桥已删除。</li>
 * </ul>
 *
 * <h3>⚠️ ä¿æŒ"纯转发"</h3>
 * åªè½¬å‘到本模块既有的 Mapper;{@link #findImportedByPatid} é‡Œçš„
 * {@code sourceToTarget} æ˜¯<b>原实现本来就有的</b>转换(原
 * {@code ServiceTaskServiceImpl} L443 / L535),不是新逻辑。
 */
@Slf4j
@Component
public class TaskArchivePortImpl implements TaskArchivePort {
    @Autowired
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private PatArchiveImportMapper patArchiveImportMapper;
    @Override
    public PatArchive findByPatid(Long patid) {
        // åŽŸ ServiceSubtaskServiceImpl èµ° patArchiveService.selectPatArchiveByPatid,
        // è€Œè¯¥ Service æ–¹æ³•体就是这一行纯委托(PatArchiveServiceImpl)。
        return patArchiveMapper.selectPatArchiveByPatid(patid);
    }
    @Override
    public List<PatArchive> findList(PatArchive query) {
        List<PatArchive> list = patArchiveMapper.selectPatArchiveList(query);
        return list == null ? Collections.emptyList() : list;
    }
    @Override
    public PatArchive findImportedByPatid(Long patid) {
        PatArchiveImport patArchiveImport = patArchiveImportMapper.selectPatArchiveImportById(patid);
        if (patArchiveImport == null) {
            return null;
        }
        // åŽŸå®žçŽ°ï¼ˆServiceTaskServiceImpl L443-444 / L535-536)就是这两步。
        return DtoConversionUtils.sourceToTarget(patArchiveImport, PatArchive.class);
    }
}
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveImport.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchiveImport.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveOthreInfo.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchiveOthreInfo.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveOut.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchiveOut.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveReq.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchiveReq.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchiveVO.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchiveVO.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatArchivetagAndPatientInfo.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatArchivetagAndPatientInfo.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PatUpInfoVO.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PatUpInfoVO.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/domain/PerSonWorkbenchDto.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/PerSonWorkbenchDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.domain;
package com.ruoyi.patarchive.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveImportMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/PatArchiveImportMapper.java ÐÞ¸Ä
@@ -1,11 +1,11 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import java.util.List;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.PatArchiveImport;
import com.ruoyi.patarchive.domain.PatArchiveImport;
/**
 * Excel导入患者档案Mapper接口
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/PatArchiveMapper.java ÐÞ¸Ä
@@ -1,7 +1,7 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import com.smartor.domain.PatArchiveOthreInfo;
import com.smartor.domain.PatArchiveReq;
import com.ruoyi.patarchive.domain.PatArchiveOthreInfo;
import com.ruoyi.patarchive.domain.PatArchiveReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchiveOutMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/PatArchiveOutMapper.java ÐÞ¸Ä
@@ -1,7 +1,7 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import com.smartor.domain.PatArchiveOut;
import com.smartor.domain.PerSonWorkbenchDto;
import com.ruoyi.patarchive.domain.PatArchiveOut;
import com.ruoyi.patarchive.domain.PerSonWorkbenchDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchivecontactMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/PatArchivecontactMapper.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import org.apache.ibatis.annotations.Mapper;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/PatArchivetagMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/PatArchivetagMapper.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import java.util.List;
import java.util.Map;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/mapper/ShardingMapper.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/mapper/ShardingMapper.java ÐÞ¸Ä
@@ -1,7 +1,7 @@
package com.smartor.mapper;
package com.ruoyi.patarchive.mapper;
import com.smartor.domain.PatArchiveOthreInfo;
import com.smartor.domain.PatArchiveReq;
import com.ruoyi.patarchive.domain.PatArchiveOthreInfo;
import com.ruoyi.patarchive.domain.PatArchiveReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveImportService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IPatArchiveImportService.java ÐÞ¸Ä
@@ -1,9 +1,9 @@
package com.smartor.service;
package com.ruoyi.patarchive.service;
import java.util.List;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.smartor.domain.PatArchiveImport;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import org.springframework.web.multipart.MultipartFile;
/**
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveOutService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IPatArchiveOutService.java ÐÞ¸Ä
@@ -1,6 +1,6 @@
package com.smartor.service;
package com.ruoyi.patarchive.service;
import com.smartor.domain.PatArchiveOut;
import com.ruoyi.patarchive.domain.PatArchiveOut;
import java.util.List;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchiveService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IPatArchiveService.java ÐÞ¸Ä
@@ -1,14 +1,18 @@
package com.smartor.service;
package com.ruoyi.patarchive.service;
import java.util.List;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.smartor.domain.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.patarchive.domain.PatArchiveOthreInfo;
import com.ruoyi.patarchive.domain.PatArchiveReq;
import com.ruoyi.patarchive.domain.PatArchiveVO;
import com.ruoyi.patarchive.domain.PatArchivetagAndPatientInfo;
import com.ruoyi.patarchive.domain.PatUpInfoVO;
/**
 * æ‚£è€…档案Service接口
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchivecontactService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IPatArchivecontactService.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.service;
package com.ruoyi.patarchive.service;
import java.util.List;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/IPatArchivetagService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IPatArchivetagService.java ÐÞ¸Ä
@@ -1,9 +1,9 @@
package com.smartor.service;
package com.ruoyi.patarchive.service;
import java.util.List;
import com.ruoyi.common.core.page.TableDataInfo;
import com.smartor.domain.PatArchivetagAndPatientInfo;
import com.ruoyi.patarchive.domain.PatArchivetagAndPatientInfo;
import com.ruoyi.common.core.domain.entity.PatArchivetag;
/**
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveImportServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/PatArchiveImportServiceImpl.java ÐÞ¸Ä
@@ -1,12 +1,12 @@
package com.smartor.service.impl;
package com.ruoyi.patarchive.service.impl;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.smartor.domain.PatArchiveImport;
import com.smartor.mapper.PatArchiveImportMapper;
import com.smartor.service.IPatArchiveImportService;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import com.ruoyi.patarchive.mapper.PatArchiveImportMapper;
import com.ruoyi.patarchive.service.IPatArchiveImportService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.usermodel.Cell;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveOutServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/PatArchiveOutServiceImpl.java ÐÞ¸Ä
@@ -1,9 +1,9 @@
package com.smartor.service.impl;
package com.ruoyi.patarchive.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.smartor.domain.PatArchiveOut;
import com.smartor.mapper.PatArchiveOutMapper;
import com.smartor.service.IPatArchiveOutService;
import com.ruoyi.patarchive.domain.PatArchiveOut;
import com.ruoyi.patarchive.mapper.PatArchiveOutMapper;
import com.ruoyi.patarchive.service.IPatArchiveOutService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchiveServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/PatArchiveServiceImpl.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.service.impl;
package com.ruoyi.patarchive.service.impl;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
@@ -6,16 +6,12 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.ruoyi.outpatientvisit.domain.PatMedOuthospQueryReq;
import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.smartor.mapper.*;
import com.ruoyi.outpatientvisit.mapper.PatMedOuthospMapper;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.IPatMedPhysicalService;
import com.ruoyi.patarchive.service.IPatArchiveService;
import com.ruoyi.inhospvisit.api.InhospVisitFacade;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
@@ -50,6 +46,15 @@
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
import com.ruoyi.patarchive.domain.PatArchiveOthreInfo;
import com.ruoyi.patarchive.domain.PatArchiveReq;
import com.ruoyi.patarchive.domain.PatArchiveVO;
import com.ruoyi.patarchive.mapper.PatArchivecontactMapper;
import com.ruoyi.patarchive.domain.PatArchivetagAndPatientInfo;
import com.ruoyi.patarchive.mapper.PatArchivetagMapper;
import com.ruoyi.patarchive.service.impl.PatArchivetagServiceImpl;
import com.ruoyi.patarchive.domain.PatUpInfoVO;
/**
 * æ‚£è€…档案Service业务层处理
 *
@@ -72,7 +77,7 @@
    private PatArchivetagMapper patArchivetagMapper;
    @Autowired
    private IPatMedInhospService patMedInhospService;
    private InhospVisitFacade inhospVisitFacade;
    @Autowired
    private PatArchivecontactMapper patArchivecontactMapper;
@@ -730,7 +735,7 @@
        //通过患者获取门诊信息
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setInhospno(pid);
        List<PatMedInhosp> patMedInhosps = patMedInhospService.selectPatMedInhospList(patMedInhosp);
        List<PatMedInhosp> patMedInhosps = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        objectList.addAll(patMedInhosps);
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchivecontactServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/PatArchivecontactServiceImpl.java ÐÞ¸Ä
@@ -1,8 +1,8 @@
package com.smartor.service.impl;
package com.ruoyi.patarchive.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.smartor.mapper.PatArchivecontactMapper;
import com.smartor.service.IPatArchivecontactService;
import com.ruoyi.patarchive.mapper.PatArchivecontactMapper;
import com.ruoyi.patarchive.service.IPatArchivecontactService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
ruoyi-patarchive/src/main/java/com/ruoyi/patarchive/service/impl/PatArchivetagServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/PatArchivetagServiceImpl.java ÐÞ¸Ä
@@ -1,8 +1,8 @@
package com.smartor.service.impl;
package com.ruoyi.patarchive.service.impl;
import com.ruoyi.common.utils.DateUtils;
import com.smartor.mapper.PatArchivetagMapper;
import com.smartor.service.IPatArchivetagService;
import com.ruoyi.patarchive.mapper.PatArchivetagMapper;
import com.ruoyi.patarchive.service.IPatArchivetagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveImportMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/PatArchiveImportMapper.xml ÐÞ¸Ä
@@ -2,9 +2,9 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.PatArchiveImportMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.PatArchiveImportMapper">
    <resultMap type="com.smartor.domain.PatArchiveImport" id="PatArchiveImportResult">
    <resultMap type="com.ruoyi.patarchive.domain.PatArchiveImport" id="PatArchiveImportResult">
        <result property="id" column="id"/>
        <result property="patientno" column="patientno"/>
        <result property="pattype" column="pattype"/>
@@ -51,7 +51,7 @@
        from pat_archive_import
    </sql>
    <select id="selectPatArchiveImportList" parameterType="com.smartor.domain.PatArchiveImport"
    <select id="selectPatArchiveImportList" parameterType="com.ruoyi.patarchive.domain.PatArchiveImport"
            resultMap="PatArchiveImportResult">
        <include refid="selectPatArchiveImportVo"/>
        where 1=1
@@ -98,7 +98,7 @@
        where id = #{id}
    </select>
    <insert id="insertPatArchiveImport" parameterType="com.smartor.domain.PatArchiveImport" useGeneratedKeys="true"
    <insert id="insertPatArchiveImport" parameterType="com.ruoyi.patarchive.domain.PatArchiveImport" useGeneratedKeys="true"
            keyProperty="id">
        insert into pat_archive_import
        <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -175,7 +175,7 @@
        </trim>
    </insert>
    <update id="updatePatArchiveImport" parameterType="com.smartor.domain.PatArchiveImport">
    <update id="updatePatArchiveImport" parameterType="com.ruoyi.patarchive.domain.PatArchiveImport">
        update pat_archive_import
        <trim prefix="SET" suffixOverrides=",">
            <if test="patientno != null">patientno =
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/PatArchiveMapper.xml ÐÞ¸Ä
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.PatArchiveMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.PatArchiveMapper">
    <resultMap type="com.ruoyi.common.core.domain.entity.PatArchive" id="PatArchiveResult">
        <result property="id" column="id"/>
@@ -67,7 +67,7 @@
    </resultMap>
    <resultMap type="com.smartor.domain.PatArchiveOthreInfo" id="PatArchiveOthreInfoResult">
    <resultMap type="com.ruoyi.patarchive.domain.PatArchiveOthreInfo" id="PatArchiveOthreInfoResult">
        <result property="id" column="id"/>
        <result property="notrequiredFlag" column="notrequired_flag"/>
        <result property="notrequiredreason" column="notrequiredreason"/>
@@ -218,7 +218,7 @@
    </select>
    <select id="patInfoByContion" parameterType="com.smartor.domain.PatArchiveReq" resultMap="PatArchiveResult">
    <select id="patInfoByContion" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq" resultMap="PatArchiveResult">
        select
        a.id,
        a.age_unit,
@@ -480,7 +480,7 @@
        </foreach>
    </update>
    <select id="selectPatArchiveInfoByAllhosp" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByAllhosp" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        SELECT
@@ -549,7 +549,7 @@
    </select>
    <select id="selectPatArchiveInfoByInhosp" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByInhosp" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        select
        a.id,
@@ -691,7 +691,7 @@
    </select>
    <select id="selectPatArchiveInfoByOuthosp" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByOuthosp" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        select
        a.id,
@@ -784,7 +784,7 @@
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByPhysical" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByPhysical" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        select
@@ -875,7 +875,7 @@
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByInhospQC" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByInhospQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        select * from (
        select
@@ -1020,7 +1020,7 @@
        ) as tmp
    </select>
<!--    <select id="selectPatArchiveInfoByOuthospQC" parameterType="com.smartor.domain.PatArchiveReq"-->
<!--    <select id="selectPatArchiveInfoByOuthospQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"-->
<!--            resultMap="PatArchiveOthreInfoResult">-->
<!--        select-->
@@ -1111,7 +1111,7 @@
<!--        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>-->
<!--    </select>-->
    <select id="selectPatArchiveInfoByPhysicalQC" parameterType="com.smartor.domain.PatArchiveReq"
    <select id="selectPatArchiveInfoByPhysicalQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq"
            resultMap="PatArchiveOthreInfoResult">
        select
@@ -1203,7 +1203,7 @@
    </select>
    <!-- ä½é™¢æ‚£è€…总数统计(去重) -->
    <select id="countPatArchiveInfoByInhospQC" parameterType="com.smartor.domain.PatArchiveReq" resultType="long">
    <select id="countPatArchiveInfoByInhospQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq" resultType="long">
        SELECT COUNT(DISTINCT d.patid)
        FROM pat_med_inhosp d
        WHERE 1=1
@@ -1257,7 +1257,7 @@
    </select>
    <!-- é—¨è¯Šæ‚£è€…总数统计(去重) -->
<!--    <select id="countPatArchiveInfoByOuthospQC" parameterType="com.smartor.domain.PatArchiveReq" resultType="long">-->
<!--    <select id="countPatArchiveInfoByOuthospQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq" resultType="long">-->
<!--        SELECT COUNT(DISTINCT a.id)-->
<!--        FROM pat_med_outhosp d-->
<!--        JOIN pat_archive a ON a.id = d.patid-->
@@ -1290,7 +1290,7 @@
<!--    </select>-->
    <!-- ä½“检患者总数统计(去重) -->
    <select id="countPatArchiveInfoByPhysicalQC" parameterType="com.smartor.domain.PatArchiveReq" resultType="long">
    <select id="countPatArchiveInfoByPhysicalQC" parameterType="com.ruoyi.patarchive.domain.PatArchiveReq" resultType="long">
        SELECT COUNT(DISTINCT a.id)
        FROM pat_med_physical d
        JOIN pat_archive a ON a.id = d.patid
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchiveOutMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/PatArchiveOutMapper.xml ÐÞ¸Ä
@@ -2,9 +2,9 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.PatArchiveOutMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.PatArchiveOutMapper">
    <resultMap type="com.smartor.domain.PatArchiveOut" id="PatArchiveOutResult">
    <resultMap type="com.ruoyi.patarchive.domain.PatArchiveOut" id="PatArchiveOutResult">
        <result property="patid" column="patid"/>
        <result property="patientno" column="patientno"/>
        <result property="pattype" column="pattype"/>
@@ -73,7 +73,7 @@
        from pat_archive_out
    </sql>
    <select id="selectPatArchiveOutList" parameterType="com.smartor.domain.PatArchiveOut"
    <select id="selectPatArchiveOutList" parameterType="com.ruoyi.patarchive.domain.PatArchiveOut"
            resultMap="PatArchiveOutResult">
        <include refid="selectPatArchiveOutVo"/>
        where 1=1
@@ -111,7 +111,7 @@
        where patid = #{patid}
    </select>
    <select id="selectPatArchiveCount" parameterType="Long" resultType="com.smartor.domain.PerSonWorkbenchDto">
    <select id="selectPatArchiveCount" parameterType="Long" resultType="com.ruoyi.patarchive.domain.PerSonWorkbenchDto">
        select aa.name1 as name, aa.count as count
        from (
        SELECT "住院" as name1, count(1) as count FROM `pat_med_inhosp`
@@ -151,7 +151,7 @@
    </select>
    <insert id="insertPatArchiveOut" parameterType="com.smartor.domain.PatArchiveOut" useGeneratedKeys="true"
    <insert id="insertPatArchiveOut" parameterType="com.ruoyi.patarchive.domain.PatArchiveOut" useGeneratedKeys="true"
            keyProperty="patid">
        insert into pat_archive_out
        <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -220,7 +220,7 @@
        </trim>
    </insert>
    <update id="updatePatArchiveOut" parameterType="com.smartor.domain.PatArchiveOut">
    <update id="updatePatArchiveOut" parameterType="com.ruoyi.patarchive.domain.PatArchiveOut">
        update pat_archive_out
        <trim prefix="SET" suffixOverrides=",">
            <if test="patientno != null">patientno = #{patientno},</if>
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchivecontactMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/PatArchivecontactMapper.xml ÐÞ¸Ä
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.PatArchivecontactMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.PatArchivecontactMapper">
    <resultMap type="com.ruoyi.common.core.domain.entity.PatArchivecontact" id="PatArchivecontactResult">
        <result property="id" column="id"/>
ruoyi-patarchive/src/main/resources/mapper/patarchive/PatArchivetagMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/PatArchivetagMapper.xml ÐÞ¸Ä
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.PatArchivetagMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.PatArchivetagMapper">
    <resultMap type="com.ruoyi.common.core.domain.entity.PatArchivetag" id="PatArchivetagResult">
        <result property="id" column="id"/>
ruoyi-patarchive/src/main/resources/mapper/patarchive/ShardingMapper.xml
ÎļþÃû´Ó smartor/src/main/resources/mapper/smartor/ShardingMapper.xml ÐÞ¸Ä
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smartor.mapper.ShardingMapper">
<mapper namespace="com.ruoyi.patarchive.mapper.ShardingMapper">
    <select id="getTableCount" resultType="long">
        SELECT count(*)
        FROM ${tableName}
ruoyi-phone/pom.xml
@@ -70,6 +70,12 @@
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- 2026-11:参数配置改直接注入 ISysConfigService -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-phone/src/main/java/com/ruoyi/phone/PhoneModule.java
@@ -1,5 +1,6 @@
package com.ruoyi.phone;
import com.ruoyi.system.service.ISysConfigService;
/**
 * ç”µè¯æ¨¡å—包根。
 *
@@ -23,9 +24,9 @@
 * <ul>
 *   <li>任务数据 â†’ {@code com.ruoyi.task.api.TaskSubtaskApi}(归属模块内实现,本模块只调 API);</li>
 *   <li>模板话术 â†’ {@code com.ruoyi.template.service} ä¸‹çš„ service æŽ¥å£ï¼›</li>
 *   <li>发送方式状态 â†’ {@code com.ruoyi.task.api.spi.TaskPreachformPort};</li>
 *   <li>录音下载 â†’ {@code com.ruoyi.task.api.spi.TaskFtpPort};</li>
 *   <li>参数配置 â†’ {@code com.ruoyi.task.api.spi.TaskSysConfigPort};</li>
 *   <li>发送方式状态 â†’ {@code com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper}(该表 2026-11 å·²å½’ ruoyi-task);</li>
 *   <li>录音下载 â†’ {@code com.ruoyi.common.utils.FtpService}(2026-11 å·²ä»Ž smartor ä¸‹æ²‰åˆ° common);</li>
 *   <li>参数配置 â†’ {@code com.ruoyi.task.api.spi.ISysConfigService};</li>
 *   <li>AI é€‰é¡¹åŒ¹é… â†’ {@code com.ruoyi.common.core.service.SubtaskOptionMatchApi}(ruoyi-common å¥‘约)。</li>
 * </ul>
 *
ruoyi-phone/src/main/java/com/ruoyi/phone/service/impl/PhoneServiceImpl.java
@@ -18,9 +18,8 @@
import com.ruoyi.phone.domain.QuestionMessage;
import com.ruoyi.phone.service.IPhoneService;
import com.ruoyi.task.api.TaskSubtaskApi;
import com.ruoyi.task.api.spi.TaskFtpPort;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.api.spi.TaskSysConfigPort;
import com.ruoyi.common.utils.FtpService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.domain.IvrTaskVisitResult;
import com.ruoyi.task.domain.ServiceSubTaskDetailReq;
import com.ruoyi.task.domain.ServiceSubtask;
@@ -60,6 +59,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import com.ruoyi.system.service.ISysConfigService;
/**
 * ç”µè¯ä¸šåŠ¡Service实现(原 {@code ruoyi-task} é‡Œ {@code ServiceSubtaskServiceImpl} çš„电话部分)。
@@ -110,19 +110,21 @@
     * è¯¥è¡¨å½’ ruoyi-inhospvisit,由 smartor ä¾§é€‚配实现本端口。
     */
    @Autowired
    private TaskPreachformPort taskPreachformPort;
    private ServiceSubtaskPreachformMapper taskPreachformPort;
    /**
     * å½•音文件下载(雨绮通话记录回调里把当天录音从 FTP æ‹‰å›žæœ¬åœ°ï¼‰
     * <p>2026-11:{@code FtpService} å·²ä»Ž smartor ä¸‹æ²‰åˆ° {@code ruoyi-common},
     * åŽŸæ¥çš„è¿‡æ¸¡ç«¯å£ {@code TaskFtpPort} éšä¹‹åˆ é™¤ï¼Œè¿™é‡Œç›´æŽ¥æ³¨å…¥é€šç”¨å·¥å…·ã€‚
     */
    @Autowired
    private TaskFtpPort taskFtpPort;
    private FtpService ftpService;
    /**
     * å‚数配置读取({@code sys.voice.match.ai.url}:AI é€‰é¡¹åŒ¹é…æœåŠ¡åœ°å€ï¼ŒæŒ‰æœºæž„é…ç½®ï¼‰
     */
    @Autowired
    private TaskSysConfigPort taskSysConfigPort;
    private ISysConfigService sysConfigService;
    /**
     * AI é€‰é¡¹åŒ¹é…å¥‘约(ruoyi-common,实现在 ruoyi-task,即原 {@code matchOptionIndex})
@@ -700,7 +702,7 @@
                //用来标记,是否有匹配上的
                Integer flag = 0;
                //1-AI识别
                String url = taskSysConfigPort.selectConfigValue("sys.voice.match.ai.url", phoneCallReqYQVO.getOrgid());
                String url = sysConfigService.selectConfigByKey("sys.voice.match.ai.url", phoneCallReqYQVO.getOrgid());
                if (ObjectUtils.isNotEmpty(url)) {
                    PhoneCallBackYQVO aiMatchResult = AiMatch(url, phoneCallReqYQVO, phoneCallBackYQVO, ivrTaskTemplateScriptVO, serviceSubtask, ivrTaskTemplate, ivrTaskTemplateScripts, scriptId, flag, phoneCallReqYQVO.getUuid());
@@ -1415,7 +1417,7 @@
            taskSubtaskApi.updateSubtask(serviceSubtask);
            setFailPreachForm(serviceSubtask, StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) ? serviceSubtask.getCurrentPreachform() : "3", "电话拨打已完成", "9");
            //下载文件
            taskFtpPort.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
            redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
        } else {
            //患者拒绝随访
@@ -1652,7 +1654,7 @@
    public PhoneCallBackSHVO processResust(PhoneCallResultYQVO phoneCallResultYQVO) {
        PhoneCallBackSHVO phoneCallBackSHVO = new PhoneCallBackSHVO();
        //通过scriptid,获取所有的结果
        String url = taskSysConfigPort.selectConfigValue("sys.voice.match.ai.url", phoneCallResultYQVO.getOrgid());
        String url = sysConfigService.selectConfigByKey("sys.voice.match.ai.url", phoneCallResultYQVO.getOrgid());
        ServiceSubtask serviceSubtask = taskSubtaskApi.getSubtask(phoneCallResultYQVO.getSubId());
        IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceSubtask.getTemplateid());
        IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO = iIvrTaskTemplateScriptService.getTaskTempScriptInfoByid(Long.valueOf(phoneCallResultYQVO.getScriptId()));
ruoyi-publicity/pom.xml
@@ -36,6 +36,7 @@
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
        </dependency>
    </dependencies>
</project>
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/CollectHISController.java
@@ -5,9 +5,9 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.quartz.service.ICollectHISService;
import com.smartor.domain.HnDataGatherVO;
import com.smartor.domain.Icd10;
import com.smartor.service.IHNGatherPatArchiveService;
import com.ruoyi.datacollection.domain.HnDataGatherVO;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.datacollection.service.IHNGatherPatArchiveService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/CollectHISMapper.java
@@ -19,6 +19,7 @@
import java.util.List;
import java.util.Map;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.common.core.domain.entity.Icd10;
@DataSource(value = DataSourceType.SLAVE)
@Mapper
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ICollectHISService.java
@@ -8,6 +8,8 @@
import java.util.List;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.datacollection.domain.HnDataGatherVO;
public interface ICollectHISService {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -39,6 +39,14 @@
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.common.mapper.Icd10Mapper;
import com.ruoyi.system.mapper.ext.SysUser2Mapper;
import com.ruoyi.system.mapper.ext.SysDept2Mapper;
import com.ruoyi.system.mapper.ext.SysUserDeptMapper;
import com.ruoyi.patarchive.mapper.ShardingMapper;
import com.ruoyi.datacollection.domain.HnDataGatherVO;
@Slf4j
@Service
public class CollectHISServiceImpl implements ICollectHISService {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -76,6 +76,13 @@
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.service.IServiceSubtaskService;
import com.ruoyi.task.domain.SendMagParam;
import com.ruoyi.task.service.IServiceSubtaskRecordService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.patarchive.service.IPatArchiveService;
import com.ruoyi.datacollection.service.IXHGatherPatArchiveService;
import com.ruoyi.datacollection.service.IServiceSLTDHealthcareRecordService;
import com.ruoyi.datacollection.domain.ServiceSLTDInhospReqVO;
import com.ruoyi.datacollection.domain.ServiceSLTDInhospResDTO;
/**
 * å®šæ—¶ä»»åŠ¡è°ƒåº¦æµ‹è¯•
@@ -1044,8 +1051,10 @@
     * å¤„理患者信息,进入子任务表(任务组)
     * <p>
     * âš ï¸ 2025 ä¿®å¤ï¼ˆå¼€å…³å¤±æ•ˆï¼‰ï¼šåŽŸèµ° smartor é—留实现,不判开关(同 {@link #dealOutHospInfo()})。
     * çŽ°èµ°æ¨¡å—é—¨é¢ã€‚æ³¨æ„æ¨¡å—ä¾§çš„ {@code dealOutHospInfoBySchedule} å†…部仍会转发回 smartor
     * ï¼ˆ{@code OtherVisitApiBridge},见该类注释),但<b>开关在门面这一层判</b>,所以关闭时不会走到那里。
     * çŽ°èµ°æ¨¡å—é—¨é¢ã€‚æ¨¡å—ä¾§ {@code dealOutHospInfoBySchedule} ç» {@code OtherVisitApi} å¥‘约
     * å›žè°ƒ {@code ruoyi-task/api/contract/OtherVisitApiImpl}(2026-11 èµ·å®žçŽ°æ•´ç°‡æ¬è¿› task æ¨¡å—,
     * smartor ä¾§çš„ {@code OtherVisitApiBridge} å·²åˆ é™¤ï¼‰ï¼Œä½†<b>开关在门面这一层判</b>,
     * æ‰€ä»¥å…³é—­æ—¶ä¸ä¼šèµ°åˆ°é‚£é‡Œã€‚
     */
    public void dealOutHospInfoBySchedule() {
        String config = configService.selectConfigByKey("visit.early.day");
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -93,7 +93,7 @@
    </resultMap>
    <resultMap type="com.smartor.domain.PatArchiveOthreInfo" id="PatArchiveOthreInfoResult">
    <resultMap type="com.ruoyi.patarchive.domain.PatArchiveOthreInfo" id="PatArchiveOthreInfoResult">
        <result property="id" column="id"/>
        <result property="notrequiredFlag" column="notrequired_flag"/>
        <result property="notrequiredreason" column="notrequiredreason"/>
@@ -259,7 +259,7 @@
    </resultMap>
    <resultMap type="com.smartor.domain.Icd10" id="Icd10Result">
    <resultMap type="com.ruoyi.common.core.domain.entity.Icd10" id="Icd10Result">
        <result property="icdid" column="icdid"/>
        <result property="icdcode" column="icdcode"/>
        <result property="icdname" column="icdname"/>
@@ -736,7 +736,7 @@
    </select>
    <select id="selectIcd10List" parameterType="com.smartor.domain.Icd10" resultMap="Icd10Result">
    <select id="selectIcd10List" parameterType="com.ruoyi.common.core.domain.entity.Icd10" resultMap="Icd10Result">
        select
        icdcode,
        his_icdid,
ruoyi-task/pom.xml
@@ -93,6 +93,12 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-othervisit</artifactId>
        </dependency>
        <!-- 2026-11:TaskSysConfig/TaskSysDept/TaskSysUserDept ä¸‰ä¸ªç«¯å£åˆ é™¤ï¼Œç›´æŽ¥ä¾èµ– system -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskFtpPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskPreachformPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSubtaskRecordPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysConfigPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysDeptPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/api/spi/TaskSysUserDeptPort.java
ÎļþÒÑɾ³ý
ruoyi-task/src/main/java/com/ruoyi/task/common/ScheduleSubtaskBuilder.java
@@ -19,7 +19,7 @@
import com.ruoyi.task.domain.ServiceTaskScheduleDetail;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.domain.PatTaskRelevance;
/**
@@ -42,7 +42,7 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private TaskPreachformPort taskPreachformPort;
    private ServiceSubtaskPreachformMapper taskPreachformPort;
    /**
     * ä¸ºå•个患者派生 subtask(appltype=5)—— è§£è€¦å…¥å£ï¼ˆè‡ªåŠ¨çº³å…¥ & æ‰‹åŠ¨å‹¾é€‰ç»Ÿä¸€èµ°è¿™é‡Œï¼‰ã€‚
ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java
@@ -20,11 +20,8 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.common.core.service.TaskOpsTriggerApi;
import com.ruoyi.task.api.spi.TaskSysConfigPort;
import com.ruoyi.task.api.spi.TaskSysUserDeptPort;
import com.ruoyi.satisfaction.api.SatisfactionExportBundle;
import com.ruoyi.satisfaction.api.SatisfactionFacade;
import com.ruoyi.task.api.spi.TaskSubtaskRecordPort;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -54,6 +51,7 @@
import com.ruoyi.task.domain.ServiceSubtaskStatistic;
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO;
import com.ruoyi.task.service.IServiceSubtaskRecordService;
import com.ruoyi.task.service.IServiceSubtaskService;
import com.ruoyi.task.service.IServiceTaskService;
import com.ruoyi.task.domain.PatArchiveSrmVO;
@@ -65,6 +63,8 @@
import com.ruoyi.task.domain.VO.ServiceSubtaskVO;
import com.ruoyi.task.domain.VO.TransferDeptVO;
import com.ruoyi.task.domain.ServiceSubtaskExport;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
/**
 * å•一任务(随访)Controller
@@ -104,13 +104,13 @@
    private IServiceTaskService serviceTaskService;
    @Autowired
    private TaskSysUserDeptPort taskSysUserDeptPort;
    private ISysUserDeptService sysUserDeptService;
    @Autowired
    private TaskSubtaskRecordPort serviceSubtaskRecordService;
    private IServiceSubtaskRecordService serviceSubtaskRecordService;
    @Autowired
    private TaskSysConfigPort taskSysConfigPort;
    private ISysConfigService sysConfigService;
    /**
     * ä»»åŠ¡è¿ç»´è§¦å‘èƒ½åŠ›ã€‚
@@ -169,6 +169,7 @@
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        serviceSubtaskVO.setOrgid(user.getOrgid());
        // é™¢åŒºå–登录会话里的值(登录页选择的院区,见 SysLoginService#login)
        serviceSubtaskVO.setCampusid(user.getCampusid());
        ServiceSubtaskEntity serviceSubtaskEntity = null;
        if (serviceSubtaskVO != null) {
@@ -558,7 +559,7 @@
                        sysUserWard.setOrgid(user.getOrgid());
                        sysUserWard.setCampusid(user.getCampusid());
                        sysUserWard.setDeptType("2");
                        List<SysUserDept> wardList = taskSysUserDeptPort.selectSysUserDeptList(sysUserWard);
                        List<SysUserDept> wardList = sysUserDeptService.selectSysUserDeptList(sysUserWard);
                        if (CollectionUtils.isNotEmpty(wardList)) {
                            leavehospitaldistrictcodes = wardList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
@@ -573,7 +574,7 @@
                        sysUserDept.setOrgid(user.getOrgid());
                        sysUserDept.setCampusid(user.getCampusid());
                        sysUserDept.setDeptType("1");
                        List<SysUserDept> deptList = taskSysUserDeptPort.selectSysUserDeptList(sysUserDept);
                        List<SysUserDept> deptList = sysUserDeptService.selectSysUserDeptList(sysUserDept);
                        if (CollectionUtils.isNotEmpty(deptList)) {
                            deptCodes = deptList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
@@ -583,7 +584,7 @@
            }
        }
        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
        if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
            serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
        } else {
@@ -608,7 +609,7 @@
        Integer offset = PageUtils.getOffset(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
        serviceSubtaskCountReq.setPageNum(offset);
        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", serviceSubtaskCountReq.getOrgid());
        if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
            serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
        } else {
@@ -720,7 +721,7 @@
        String orgid = loginUser.getUser().getOrgid();
        String configKey = serviceSubtaskCountReq.getConfigKey();
        if (StringUtils.isNotEmpty(configKey)) {
            String configValue = taskSysConfigPort.selectConfigValue(configKey, orgid);
            String configValue = sysConfigService.selectConfigByKey(configKey, orgid);
            serviceSubtaskCountReq.setConfigValue(configValue);
            if (StringUtils.isEmpty(configValue)) {
                String logInfo = "getSfStatisticsCount-参数 " + configKey + " æœªé…ç½®, è¯·é…ç½®å¥½åŽé‡è¯•";
@@ -729,7 +730,7 @@
            }
        }
        String followUpCountStyle = taskSysConfigPort.selectConfigValue("followUpCountStyle", orgid);
        String followUpCountStyle = sysConfigService.selectConfigByKey("followUpCountStyle", orgid);
        if (ObjectUtils.isNotEmpty(followUpCountStyle)) {
            serviceSubtaskCountReq.setFollowUpCountStyle(followUpCountStyle);
        } else {
@@ -769,7 +770,7 @@
        }
        String configKey = serviceSubtaskCountReq.getConfigKey();
        if (StringUtils.isNotEmpty(configKey)) {
            String configValue = taskSysConfigPort.selectConfigValue(configKey, serviceSubtaskCountReq.getOrgid());
            String configValue = sysConfigService.selectConfigByKey(configKey, serviceSubtaskCountReq.getOrgid());
            serviceSubtaskCountReq.setConfigValue(configValue);
            if (StringUtils.isEmpty(configValue)) {
                String logInfo = "getSfStatisticsCount-参数 " + configKey + " æœªé…ç½®, è¯·é…ç½®å¥½åŽé‡è¯•";
@@ -800,7 +801,7 @@
        //复诊统计
        String configKey = serviceSubtaskCountReq.getConfigKey();
        if (StringUtils.isNotEmpty(configKey)) {
            String configValue = taskSysConfigPort.selectConfigValue(configKey, serviceSubtaskCountReq.getOrgid());
            String configValue = sysConfigService.selectConfigByKey(configKey, serviceSubtaskCountReq.getOrgid());
            if (StringUtils.isEmpty(configValue)) {
                String logInfo = "getSfStatisticsCountDetails-参数 " + configKey + " æœªé…ç½®, è¯·é…ç½®å¥½åŽé‡è¯•";
                log.error(logInfo);
@@ -856,13 +857,13 @@
        sysUserDept.setOrgid(sysUser.getOrgid());
        sysUserDept.setCampusid(sysUser.getCampusid());
        sysUserDept.setDeptType("1");
        List<SysUserDept> sysUserDepts = taskSysUserDeptPort.selectSysUserDeptList(sysUserDept);
        List<SysUserDept> sysUserDepts = sysUserDeptService.selectSysUserDeptList(sysUserDept);
        SysUserDept sysUserWard = new SysUserDept();
        sysUserWard.setUserId(sysUser.getUserId());
        sysUserWard.setOrgid(sysUser.getOrgid());
        sysUserWard.setCampusid(sysUser.getCampusid());
        sysUserWard.setDeptType("2");
        List<SysUserDept> sysUserWards = taskSysUserDeptPort.selectSysUserDeptList(sysUserWard);
        List<SysUserDept> sysUserWards = sysUserDeptService.selectSysUserDeptList(sysUserWard);
        List<String> deptCodes = sysUserDepts.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
        List<String> wardCodes = sysUserWards.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
        ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
@@ -881,6 +882,74 @@
        return map;
    }
    /**
     * å½“前登录人待处理随访任务统计(按出院年月分组,出院随访、门诊随访分开计数)
     * <p>
     * å£å¾„:service_subtask ä¸­
     * service_type = '2' å‡ºé™¢éšè®¿ / '3' é—¨è¯Šéšè®¿
     * + å¾…随访状态(sendstate in 1,2,3,5,7)
     * + å‡ºé™¢æ»¡ 7 å¤©ï¼ˆå«ã€Œ7 å¤©å‰é‚£ä¸€å¤©ã€å‡ºé™¢çš„æ‚£è€…)
     * + åªçœ‹æœ€è¿‘ 4 ä¸ªå‡ºé™¢æœˆä»½ï¼ˆå«å½“月);
     * ç§‘室/病区权限取 OR(与随访列表 deptOrDistrict=2 ä¸€è‡´ï¼‰ã€‚
     *
     * @return { userName, nickName, total, months: [{ month: 'yyyy-MM', dischargeCount, outpatientCount }] }
     * åªè¿”回有数据的月份,没有数据的月份由前端补 0
     */
    @ApiOperation("获取当前登录人待处理随访任务统计(按出院年月)")
    @PostMapping("/pendingTaskMonthStats")
    public Map<String, Object> pendingTaskMonthStats() {
        LoginUser loginUser = getLoginUser();
        SysUser sysUser = loginUser.getUser();
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("userName", sysUser.getUserName());
        result.put("nickName", sysUser.getNickName());
        result.put("total", 0L);
        result.put("months", new ArrayList<>());
        // æ³¨æ„ï¼šä¸è¦ç”¨ sys_user_dept.campusid è¿‡æ»¤â€”—这张表的 campusid å¤§é‡ä¸º NULL,
        // å¸¦ä¸Šå®ƒä¼šç›´æŽ¥æŸ¥ä¸å‡ºæƒé™ï¼Œç»Ÿè®¡ç»“果永远是 0。院区权限由 orgid + userId + deptType å·²èƒ½å®šä½ã€‚
        SysUserDept deptQuery = new SysUserDept();
        deptQuery.setUserId(sysUser.getUserId());
        deptQuery.setOrgid(sysUser.getOrgid());
        deptQuery.setDeptType("1");
        List<SysUserDept> sysUserDepts = sysUserDeptService.selectSysUserDeptList(deptQuery);
        SysUserDept wardQuery = new SysUserDept();
        wardQuery.setUserId(sysUser.getUserId());
        wardQuery.setOrgid(sysUser.getOrgid());
        wardQuery.setDeptType("2");
        List<SysUserDept> sysUserWards = sysUserDeptService.selectSysUserDeptList(wardQuery);
        boolean isAdmin = "admin".equals(sysUser.getUserName());
        if (!isAdmin && CollectionUtils.isEmpty(sysUserDepts) && CollectionUtils.isEmpty(sysUserWards)) {
            // æ—¢æ²¡æœ‰ç§‘室也没有病区权限时不统计,避免越权看到全机构数据
            return result;
        }
        // sys_user_dept é‡ŒåŒä¸€ç§‘室/病区会重复很多行,去重后再拼 IN,避免 SQL å‚数过多
        List<String> deptCodes = sysUserDepts.stream()
                .map(SysUserDept::getDeptCode)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        List<String> wardCodes = sysUserWards.stream()
                .map(SysUserDept::getDeptCode)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
        entity.setOrgid(sysUser.getOrgid());
        entity.setLeaveldeptcodes(deptCodes);
        entity.setLeavehospitaldistrictcodes(wardCodes);
        Map<String, Object> stats = serviceSubtaskService.getPendingManualTaskMonthStats(entity);
        if (stats != null) {
            result.putAll(stats);
        }
        return result;
    }
    @ApiOperation("获取当前用户宣教数量统计")
    @PostMapping("/gethelibraryCount")
    public Map<String, Object> getHeLibraryCount(@RequestBody HeLibraryCountVO heLibraryCountVO) {
ruoyi-task/src/main/java/com/ruoyi/task/mapper/ServiceSubtaskMapper.java
@@ -264,6 +264,17 @@
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * å½“前登录人待处理随访任务,按出院年月分组统计
     * <p>
     * ç»Ÿè®¡å£å¾„:出院随访/门诊随访(service_type in 2,3)+ äººå·¥ï¼ˆcurrent_preachform = '1')
     * + å¾…随访状态(sendstate in 1,2,3,5,7)+ å‡ºé™¢æ—¶é—´æ—©äºŽç­‰äºŽä»Šå¤© - 7 å¤©ã€‚
     *
     * @param serviceSubtaskVO æŸ¥è¯¢æ¡ä»¶ï¼ˆorgid、科室、病区)
     * @return æ¯è¡ŒåŒ…含 month(yyyy-MM)与 cnt(数量),数量为 0 çš„æœˆä»½ä¸ä¼šè¿”回
     */
    public List<Map<String, Object>> countPendingManualTaskByMonth(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * èŽ·å–é—¨è¯Šéšè®¿äººæ•°
     *
     * @param patMedReq
ruoyi-task/src/main/java/com/ruoyi/task/service/IServiceSubtaskPreachformService.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/IServiceSubtaskPreachformService.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.smartor.service;
package com.ruoyi.task.service;
import java.util.List;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
ruoyi-task/src/main/java/com/ruoyi/task/service/IServiceSubtaskService.java
@@ -180,6 +180,19 @@
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity entity);
    /**
     * å½“前登录人待处理随访任务,按出院年月分组统计(出院随访、门诊随访分开计数)
     * <p>
     * å£å¾„:出院随访 service_type='2'、门诊随访 service_type='3'
     * + å¾…随访状态(sendstate in 1,2,3,5,7)
     * + å‡ºé™¢æ»¡ 7 å¤©ï¼ˆå«ã€Œ7 å¤©å‰é‚£ä¸€å¤©ã€å‡ºé™¢çš„æ‚£è€…),且只看最近 4 ä¸ªå‡ºé™¢æœˆä»½ï¼ˆå«å½“月)。
     *
     * @param entity æŸ¥è¯¢æ¡ä»¶ï¼ˆorgid、科室、病区)
     * @return { total: æ€»æ•°é‡, months: [{ month: 'yyyy-MM', dischargeCount: å‡ºé™¢éšè®¿æ•°é‡, outpatientCount: é—¨è¯Šéšè®¿æ•°é‡ }] }
     * åªè¿”回有数据的月份,没有数据的月份由前端补 0
     */
    public Map<String, Object> getPendingManualTaskMonthStats(ServiceSubtaskEntity entity);
    /**
     * æŒ‰ç—…区或科室统计延续护理数量
     * éƒ½ä¸ä¼ æ—¶åŒæ—¶æŒ‰ç—…区和科室各统计一遍
     *
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskPreachformServiceImpl.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskPreachformServiceImpl.java ÐÞ¸Ä
@@ -1,11 +1,11 @@
package com.smartor.service.impl;
package com.ruoyi.task.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.mapper.ServiceSubtaskPreachformMapper;
import com.smartor.service.IServiceSubtaskPreachformService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.service.IServiceSubtaskPreachformService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
/**
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java
@@ -101,11 +101,8 @@
import com.ruoyi.task.mapper.ServiceOutPathMapper;
import com.ruoyi.task.service.IServiceOutPathService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.api.spi.TaskArchivePort;
import com.ruoyi.task.api.spi.TaskFtpPort;
import com.ruoyi.task.api.spi.TaskSysConfigPort;
import com.ruoyi.task.api.spi.TaskSysDeptPort;
import com.ruoyi.task.common.ScheduleSubtaskBuilder;
import com.ruoyi.task.domain.ServiceTaskScheduleVO;
import com.ruoyi.task.service.IServiceSubtaskService;
@@ -124,6 +121,8 @@
import com.ruoyi.task.domain.ServiceSubtaskTemplateVO;
import com.ruoyi.task.domain.ServiceTaskVO;
import com.ruoyi.task.domain.VO.TransferDeptVO;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.mapper.ext.SysDept2Mapper;
/**
 * å•一任务(随访)Service业务层处理
@@ -166,7 +165,7 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private TaskPreachformPort taskPreachformPort;
    private ServiceSubtaskPreachformMapper taskPreachformPort;
    @Autowired
    private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
@@ -221,9 +220,6 @@
    @Autowired
    private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    @Autowired
    private TaskFtpPort taskFtpPort;
@@ -236,7 +232,7 @@
    @Autowired
    private TaskSysConfigPort taskSysConfigPort;
    private ISysConfigService sysConfigService;
    /**
     * æ¶ˆæ¯å‘送方工厂(短信/微信公众号),替代原来直接调用各站点发送代码的写法
@@ -255,7 +251,7 @@
    @Autowired
    private TaskSysDeptPort taskSysDeptPort;
    private SysDept2Mapper sysDept2Mapper;
    @Value("${spring.profiles.active}")
    private String active;
@@ -1085,7 +1081,7 @@
            }
            serviceTask.setLeaveldeptcodes(serviceTaskVO.getLeaveldeptcodes());
            if (StringUtils.isEmpty(serviceTask.getLeavehospitaldistrictname()) && StringUtils.isNotEmpty(serviceTask.getLeavehospitaldistrictcode())) {
                SysDept sysDept = taskSysDeptPort.selectDeptByCode(serviceTask.getLeavehospitaldistrictcode(), null);
                SysDept sysDept = sysDept2Mapper.selectDeptByCode(serviceTask.getLeavehospitaldistrictcode(), null);
                serviceTask.setLeavehospitaldistrictname(sysDept.getDeptName());
            }
            if (serviceTaskVO.getLongTask() == 1) serviceTask.setSendState(2L);
@@ -3574,6 +3570,55 @@
        return serviceSubtaskMapper.getCurrentUserServiceSubtaskCount(entity);
    }
    /**
     * å½“前登录人待处理随访任务,按出院年月分组统计(出院随访、门诊随访分开计数)
     * <p>
     * åªè¿”回有数据的月份,前端按「当月 + å‰ 3 ä¸ªæœˆã€è¡¥é½ï¼Œæ²¡æœ‰æ•°æ®æ˜¾ç¤º 0 ä¸ªã€‚
     */
    @Override
    public Map<String, Object> getPendingManualTaskMonthStats(ServiceSubtaskEntity entity) {
        List<Map<String, Object>> rows = serviceSubtaskMapper.countPendingManualTaskByMonth(entity);
        List<Map<String, Object>> months = new ArrayList<>();
        long total = 0L;
        if (rows != null) {
            for (Map<String, Object> row : rows) {
                if (row == null || row.get("month") == null) {
                    continue;
                }
                long dischargeCount = parsePendingCount(row.get("dischargeCnt"));
                long outpatientCount = parsePendingCount(row.get("outpatientCnt"));
                if (dischargeCount <= 0 && outpatientCount <= 0) {
                    continue;
                }
                Map<String, Object> item = new LinkedHashMap<>();
                item.put("month", row.get("month").toString());
                item.put("dischargeCount", dischargeCount);
                item.put("outpatientCount", outpatientCount);
                months.add(item);
                total += dischargeCount + outpatientCount;
            }
        }
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("total", total);
        result.put("months", months);
        return result;
    }
    /**
     * ç»Ÿè®¡ç»“果里的数量转 long,解析失败按 0 å¤„理
     */
    private long parsePendingCount(Object value) {
        if (value == null) {
            return 0L;
        }
        try {
            return Long.parseLong(value.toString());
        } catch (NumberFormatException e) {
            log.warn("统计待处理随访任务失败,数量无法解析:{}", value);
            return 0L;
        }
    }
    @Override
    public Map<String, Object> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo) {
        boolean hasDistrict = !CollectionUtils.isEmpty(vo.getLeavehospitaldistrictcodes());
@@ -3641,8 +3686,8 @@
    public void setFailSubTaskDefalutVal(Long failDay) {
        //1.先去sys_config中,获取哪些科室或病区需要默认问卷默认值
        IConfigService configService = SpringUtils.getBean(IConfigService.class);
        String deptConfigValue = taskSysConfigPort.selectConfigValue("hosp.default.dept");
        String wardConfigValue = taskSysConfigPort.selectConfigValue("hosp.default.ward");
        String deptConfigValue = sysConfigService.selectConfigByKey("hosp.default.dept");
        String wardConfigValue = sysConfigService.selectConfigByKey("hosp.default.ward");
        List<String> leaveWard = null;
        List<String> leaveDept = null;
        if (deptConfigValue != null && !deptConfigValue.isEmpty()) {
@@ -3870,8 +3915,8 @@
        // å‚数值经端口取用(原为 sysConfigMapper.checkConfigKeyUnique + getConfigValue)。
        // è¯­ä¹‰ç­‰ä»·ï¼šåŽŸåˆ¤å®š"行存在"、这里判定"值非 null",而 sys_config.config_value æ˜¯
        // varchar(500) NOT NULL DEFAULT '' â‡’ äºŒè€…不可能不同(详见 TaskSysConfigPort javadoc)。
        String smsContemt = taskSysConfigPort.findConfigValueByKey("wj.sms.template");
        // varchar(500) NOT NULL DEFAULT '' â‡’ äºŒè€…不可能不同(详见 ISysConfigService javadoc)。
        String smsContemt = sysConfigService.selectConfigByKey("wj.sms.template");
        if (smsContemt != null) {
            sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
@@ -4214,7 +4259,7 @@
            return null;
        }
        try {
            SysDept sysDept = taskSysDeptPort.selectDeptByCode(deptCode, orgid);
            SysDept sysDept = sysDept2Mapper.selectDeptByCode(deptCode, orgid);
            return sysDept == null ? null : sysDept.getCampusid();
        } catch (Exception e) {
            log.warn("按编码反查院区失败:deptCode={}, orgid={}, err={}", deptCode, orgid, e.getMessage());
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceTaskScheduleServiceImpl.java
@@ -20,7 +20,7 @@
import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper;
import com.ruoyi.task.mapper.ServiceTaskScheduleMapper;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.domain.ServiceTaskScheduleVO;
import com.ruoyi.task.service.IServiceTaskScheduleService;
@@ -44,7 +44,7 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private TaskPreachformPort taskPreachformPort;
    private ServiceSubtaskPreachformMapper taskPreachformPort;
    /** å•次扫描的最大计划数,避免长事务。 */
    private static final int ROLL_BATCH_LIMIT = 200;
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceTaskServiceImpl.java
@@ -48,7 +48,7 @@
import com.ruoyi.task.mapper.ServiceTaskdeptMapper;
import com.ruoyi.task.mapper.ServiceTaskMapper;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.api.spi.TaskArchivePort;
import com.ruoyi.task.service.IServiceTaskService;
/**
@@ -85,7 +85,7 @@
    @Autowired
    private ServiceTaskdeptMapper serviceTaskdeptMapper;
    @Autowired
    private TaskPreachformPort taskPreachformPort;
    private ServiceSubtaskPreachformMapper taskPreachformPort;
    @Autowired
    private SvyTaskTemplateScriptMapper svyTaskTemplateScriptMapper;
    @Autowired
ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
@@ -3278,6 +3278,46 @@
        </if>
    </select>
    <!--
        å½“前登录人「待处理」随访任务,按出院年月(endtime)分组统计,出院随访 / é—¨è¯Šéšè®¿åˆ†å¼€è®¡æ•°ã€‚
        å£å¾„(与随访列表「待随访」页签一致):
          1) å‡ºé™¢éšè®¿ service_type = '2',门诊随访 service_type = '3'
          2) å¾…随访(未完成)→ sendstate IN (1,2,3,5,7),排除 4 ä¸æ‰§è¡Œ / 6 å®Œæˆ
          3) å‡ºé™¢æ»¡ 7 å¤© â†’ endtime < (今天 - 7 å¤©) + 1 å¤©ï¼Œ
             å³ã€Œ7 å¤©å‰é‚£ä¸€å¤©ã€å‡ºé™¢çš„也计入(用 <= DATE_SUB(...) åªä¼šæˆªåˆ°å½“天 0 ç‚¹ï¼Œä¼šæ¼æŽ‰ 9 æ¡ï¼‰
          4) åªçœ‹æœ€è¿‘ 4 ä¸ªå‡ºé™¢æœˆä»½ï¼ˆå«å½“月)→ endtime >= å½“月往前推 3 ä¸ªæœˆçš„ 1 å·
          5) ç§‘室/病区权限用 OR(与列表 deptOrDistrict=2 ä¸€è‡´ï¼‰ï¼š
             åªæœ‰ç—…区权限的用户,任务 leaveldeptcode ä¸Žæœ¬äººç§‘室对不上时也能量到,
             å¦åˆ™ä¼šæŠŠæ•´æœˆæ•°æ®è¿‡æ»¤æˆ 0。
        è¯´æ˜Žï¼šGROUP BY åªäº§å‡ºæœ‰æ•°æ®çš„æœˆä»½ï¼Œå‰ç«¯æŒ‰ã€Œå½“月 + å‰ 3 ä¸ªæœˆã€è¡¥é½ï¼Œæ²¡æ•°æ®å°±æ˜¾ç¤º 0 ä¸ªã€‚
              ä¸å†é™åˆ¶ current_preachform(人工):该字段只是执行方式,
              å¾…随访任务里还有短信等方式,限定 '1' ä¼šæ¼æ•°ã€‚
    -->
    <select id="countPendingManualTaskByMonth"
            parameterType="com.ruoyi.task.domain.entity.ServiceSubtaskEntity"
            resultType="java.util.Map">
        SELECT DATE_FORMAT(endtime, '%Y-%m') AS month,
        SUM(CASE WHEN service_type = '2' THEN 1 ELSE 0 END) AS dischargeCnt,
        SUM(CASE WHEN service_type = '3' THEN 1 ELSE 0 END) AS outpatientCnt
        FROM service_subtask
        WHERE del_flag = '0'
        AND service_type IN ('2', '3')
        AND sendstate IN (1, 2, 3, 5, 7)
        AND endtime IS NOT NULL
        AND endtime &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL 7 DAY), INTERVAL 1 DAY)
        AND endtime &gt;= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m-01')
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
        </if>
        <if test="campusid != null and campusid != ''">
            AND campusid = #{campusid}
        </if>
        <!-- ç¦»é™¢ç§‘室/病区:有科室按科室、有病区按病区,两者都有时取 OR -->
        <include refid="filterLeaveDimOr"/>
        GROUP BY DATE_FORMAT(endtime, '%Y-%m')
        ORDER BY month
    </select>
    <select id="getCurrentUserServiceSubtaskCount" parameterType="com.ruoyi.task.domain.entity.ServiceSubtaskEntity"
            resultType="map">
        SELECT
smartor/pom.xml
@@ -234,6 +234,27 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-task</artifactId>
        </dependency>
        <!--
            æ‚£è€…档案模块(pat_archive å®¶æ—ï¼‰2026-11 è¿å‡º smartor:
            æ¡£æ¡ˆçš„ Mapper / Service / SQL å…¨åœ¨ ruoyi-patarchive,smartor åªç»å®ƒå–数据
            ï¼ˆæ–¹å‘ smartor -> ruoyi-patarchive,反向不成立)。
        -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-patarchive</artifactId>
        </dependency>
        <!--
            æ•°æ®é‡‡é›†æ¨¡å—(2026-11):新华/河南/省立同德采集器与预约停诊迁入 ruoyi-datacollection。
            smartor ä¾§ä»æœ‰é‡‡é›†è°ƒç”¨æ–¹ï¼ˆHisGatherApiBridge / é‡‡é›†ç›¸å…³ Controller),
            æ–¹å‘ smartor -> ruoyi-datacollection,反向不成立。
        -->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-datacollection</artifactId>
        </dependency>
    </dependencies>
smartor/src/main/java/com/smartor/common/DistinctByProperty.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/common/enums/EmergencyLevelEnum.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/common/enums/ImportFlagEnum.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ExternalDiagnosisInfo.java
@@ -7,6 +7,7 @@
import lombok.Data;
import java.util.Date;
import com.ruoyi.common.core.domain.entity.Icd10;
/**
 * @author æŽ¥æ”¶ç¬¬ä¸‰æ–¹æ‚£è€…诊断信息
smartor/src/main/java/com/smartor/domain/ExternalInHospPatientDiagnoseInfo.java
@@ -7,6 +7,7 @@
import lombok.Data;
import java.util.Date;
import com.ruoyi.common.core.domain.entity.Icd10;
/**
 * @author æŽ¥æ”¶ç¬¬ä¸‰æ–¹å…¥é™¢æ‚£è€…诊断信息
smartor/src/main/java/com/smartor/domain/HnDataGatherVO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/Icd10.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/MedicationDoseInfo.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/MedicationItem.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceAppointRecord.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDCommonVO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDContactsResDTO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDDeptReqVO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDDiagnosisResDTO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospResDTO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ServiceSLTDMedicalRecordResDTO.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ThiedInhospCheckInfo.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ThiedInhospInfo.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ThiedOutHospCheckInfo.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/domain/ThiedOutHospInfo.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/HNGatherPatArchiveMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/Icd10Mapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/MedicationDoseInfoMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/MedicationItemMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/ServiceAppointRecordMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskPreachformMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskRecordMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/SysDept2Mapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/SysUser2Mapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/SysUserDeptMapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/mapper/SysUserRole2Mapper.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IIcd10Service.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IIvrTaskVisitResultService.java
@@ -51,12 +51,4 @@
     * @return ç»“æžœ
     */
    public int deleteIvrTaskVisitResultByIds(Long[] ids);
    /**
     * åˆ é™¤ä»»åŠ¡éšè®¿ç»“æžœä¿¡æ¯
     *
     * @param id ä»»åŠ¡éšè®¿ç»“æžœä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteIvrTaskVisitResultById(Long id);
}
smartor/src/main/java/com/smartor/service/IMedicationDoseInfoService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IMedicationItemService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IPatMedInhospService.java
@@ -1,16 +1,10 @@
package com.smartor.service;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.service.dto.PatMedReq;
import com.ruoyi.common.core.service.dto.PatMedRes;
import com.smartor.domain.*;
import com.ruoyi.inhospvisit.domain.PatMedInhospDTO;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
import com.ruoyi.inhospvisit.domain.PatMedInhospVO;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.ruoyi.common.core.domain.entity.PatArchive;
@@ -23,13 +17,6 @@
 * @date 2023-03-04
 */
public interface IPatMedInhospService {
    /**
     * æŸ¥è¯¢æ‚£è€…住院记录
     *
     * @param inhospid æ‚£è€…住院记录主键
     * @return æ‚£è€…住院记录
     */
    public PatMedInhosp selectPatMedInhospByInhospid(Long inhospid);
    public List<PatMedInhosp> selectPatMedInhosp(PatMedInhosp patMedInhosp);
@@ -53,8 +40,6 @@
    public PatMedInhosp getDeptCodeByPatId(PatMedInhosp patMedInhosp);
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq);
    /**
     * æ–°å¢žæ‚£è€…住院记录
     *
@@ -72,40 +57,6 @@
    public int updatePatMedInhosp(PatMedInhosp patMedInhosp);
    /**
     * æ‰¹é‡åˆ é™¤æ‚£è€…住院记录
     *
     * @param inhospids éœ€è¦åˆ é™¤çš„æ‚£è€…住院记录主键集合
     * @return ç»“æžœ
     */
    public int deletePatMedInhospByInhospids(Long[] inhospids);
    /**
     * åˆ é™¤æ‚£è€…住院记录信息
     *
     * @param inhospid æ‚£è€…住院记录主键
     * @return ç»“æžœ
     */
    public int deletePatMedInhospByInhospid(Long inhospid);
    public int deletePatMedInhospByInhospno(String inhospno);
    /**
     * å¤„理从his取来的出院数据
     *
     * @param
     * @return ç»“æžœ
     */
    public int dealOutHospInfo(String config);
    /**
     * å¤„理从his取来的出院数据 ä»»åŠ¡ç»„ç”Ÿæˆ
     *
     * @param
     * @return ç»“æžœ
     */
    public int dealOutHospInfoBySchedule(String config);
    /**
     * èŽ·å–å‡ºé™¢ï¼Œä½é™¢ï¼Œé—¨è¯ŠæœåŠ¡äººæ¬¡
     *
     * @param patMedReq
@@ -121,65 +72,5 @@
     */
    public List<PatMedInhosp> getDocAndPat(PatMedInhosp patMedInhosp);
    /**
     * å¤„理从his取来的手术信息
     *
     * @param
     * @return ç»“æžœ
     */
    public void addOperationSubTask(String config);
    public ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type);
    // ==========================================================================
    // å‡ºå…¥é™¢éšè®¿æ¨¡å—化(第一批)—— ä¾› VisitTaskCreateApiBridge / OtherVisitApiBridge å¤ç”¨çš„过渡入口
    //
    // âš ï¸ è¿™ 3 ä¸ªæ–¹æ³•是<b>刻意新增</b>的过渡期入口(纯转发,零业务逻辑),
    //    ä¸æ˜¯è¯¯åŠ ã€ä¹Ÿä¸è¦"顺手删掉":
    //      Â· runOperationVisit(config)              â€”— è®© OtherVisitApiBridge æœ‰ä¸ª"随访能力"形状的入口
    //      Â· persistSubtask(subtask)                â€”— è®© VisitTaskCreateApiBridge æœ‰å”¯ä¸€çš„落库入口
    //      Â· selectPendingDeptPatientsForVisit()    â€”— è®© PatMedInhospController åˆ‡åˆ°æ–°å…¥å£åŽ
    //                                                  ä»èƒ½æŠŠåˆ—表交给院外/门诊合并
    //    ç”± sql/_probe/verify_step16_service_restore.py ä¸Ž audit_worktree_changes.py ç™»è®°æŠŠå…³ã€‚
    // ==========================================================================
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘手术随访扫描。
     * <p>
     * ä¸Ž {@link #addOperationSubTask(String)} <b>完全等价</b>(本方法就是转发到它),
     * å­˜åœ¨çš„唯一理由是给 {@code OtherVisitApiBridge} ä¸€ä¸ª"看起来属于随访能力"的入口,
     * è®©æ‰‹æœ¯éšè®¿å°†æ¥æ¬åŽ» {@code ruoyi-othervisit} æ—¶åªæ¢å®žçŽ°æ–¹ã€‚
     * <p>
     * æ³¨æ„ï¼š{@code addOperationSubTask} <b>不能删</b> â€”— å®ƒè¢«
     * {@code PatMedInhospController#addOperationSubTask}(URL ä¸å˜ï¼‰ç›´æŽ¥è°ƒç”¨ã€‚
     *
     * @param config {@code sys_config: visit.early.day}
     * @return å¤„理的手术记录数
     */
    int runOperationVisit(String config);
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘把「科室维度未处理的在院患者」列表读出来。
     * <p>
     * ä¾› {@code PatMedInhospController#dealOutHospInfo}(URL ä¸å˜ï¼‰åœ¨åˆ‡æ¢åˆ°æ–°å…¥å£åŽ
     * ä»èƒ½æŠŠåˆ—表交给 {@code IPatMedOuthospService} åš"院外门诊 + åœ¨é™¢"合并。
     * <p>
     * æ¡ä»¶ä¸ŽåŽŸ {@code dealOutHospInfo} çš„第一段查询<b>完全一致</b>:
     * {@code deptcheck_flag='0'} + {@code inhospstate='1'} + {@code fuflag='1'}。
     * å®žçŽ°æ˜¯çº¯è½¬å‘ï¼ˆ{@code selectPatMedInhospList}),零逻辑改动。
     *
     * @return ç§‘室维度未处理的在院患者
     */
    List<PatMedInhosp> selectPendingDeptPatientsForVisit();
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘把一条已组装好的子任务落库。
     * <p>
     * å•独抽出来的理由:让 {@code VisitTaskCreateApiBridge} æœ‰ä¸€ä¸ªå¯æŽ§çš„写入口,
     * ä¾¿äºŽ"搬迁前后逐行等价"的探针比对;将来「随访任务创建模块」接管时替换实现方。
     *
     * @param serviceSubtask å·²ç»„装好的子任务(调用方负责填全字段)
     * @return true = è½åº“成功
     */
    boolean persistSubtask(ServiceSubtask serviceSubtask);
}
smartor/src/main/java/com/smartor/service/IServiceAppointRecordService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IServiceSubtaskRecordService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/IServiceTaskRuleService.java
@@ -50,12 +50,4 @@
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleByIds(Long[] ids);
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¿¡æ¯
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteServiceTaskRuleById(Long id);
}
smartor/src/main/java/com/smartor/service/ISvyLibTemplateScriptService.java
@@ -54,15 +54,6 @@
     * @return ç»“æžœ
     */
    public int deleteSvyLibTemplateScriptByTopicids(Long[] topicids);
    /**
     * åˆ é™¤æ¨¡æ¿é—®å·é¢˜ç›®ä¿¡æ¯
     *
     * @param topicid æ¨¡æ¿é—®å·é¢˜ç›®ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteSvyLibTemplateScriptByTopicid(Long topicid);
    /**
     * æ ¹æ®é—®é¢˜id统计选项
     *
smartor/src/main/java/com/smartor/service/IXHGatherPatArchiveService.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/PersonWorkbenchService.java
@@ -1,7 +1,7 @@
package com.smartor.service;
import com.ruoyi.template.domain.BaseTag;
import com.smartor.domain.PerSonWorkbenchDto;
import com.ruoyi.patarchive.domain.PerSonWorkbenchDto;
import java.util.List;
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/Icd10ServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/IvrTaskVisitResultServiceImpl.java
@@ -77,14 +77,4 @@
        return ivrTaskVisitResultMapper.deleteIvrTaskVisitResultByIds(ids);
    }
    /**
     * åˆ é™¤ä»»åŠ¡éšè®¿ç»“æžœä¿¡æ¯
     *
     * @param id ä»»åŠ¡éšè®¿ç»“æžœä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteIvrTaskVisitResultById(Long id) {
        return ivrTaskVisitResultMapper.deleteIvrTaskVisitResultById(id);
    }
}
smartor/src/main/java/com/smartor/service/impl/MedicationDoseInfoServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/MedicationItemServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -5,13 +5,10 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.service.IConfigService;
import com.ruoyi.common.core.service.dto.PatMedReq;
import com.ruoyi.common.core.service.dto.PatMedRes;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.ruoyi.inhospvisit.domain.PatMedInhospDTO;
@@ -24,12 +21,9 @@
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import com.ruoyi.othervisit.domain.PatMedOperationItem;
import com.ruoyi.inhospvisit.domain.PatMedInhospVO;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
@@ -39,7 +33,6 @@
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.domain.ServiceTaskdept;
import com.ruoyi.task.domain.ServiceTaskdiag;
import com.ruoyi.task.domain.ServiceTaskmedical;
import com.ruoyi.task.domain.ServiceTaskoper;
import com.ruoyi.task.domain.ServiceTaskRule;
import com.ruoyi.task.domain.ServiceTaskSchedule;
@@ -48,13 +41,16 @@
import com.ruoyi.task.mapper.ServiceTaskdeptMapper;
import com.ruoyi.task.mapper.ServiceTaskdiagMapper;
import com.ruoyi.task.mapper.ServiceTaskMapper;
import com.ruoyi.task.mapper.ServiceTaskmedicalMapper;
import com.ruoyi.task.mapper.ServiceTaskoperMapper;
import com.ruoyi.task.mapper.ServiceTaskRuleMapper;
import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper;
import com.ruoyi.task.mapper.ServiceTaskScheduleMapper;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.common.ScheduleSubtaskBuilder;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.patarchive.domain.PatArchiveImport;
import com.ruoyi.patarchive.mapper.PatArchiveImportMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
/**
 * æ‚£è€…住院记录Service业务层处理
 *
@@ -64,6 +60,7 @@
@Slf4j
@Service
public class PatMedInhospServiceImpl implements IPatMedInhospService {
    @Autowired
    private InhospVisitFacade inhospVisitFacade;
@@ -89,14 +86,10 @@
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private ServiceTaskmedicalMapper serviceTaskmedicalMapper;
    @Autowired
    private ServiceTaskRuleMapper serviceTaskRuleMapper;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private IConfigService iSysConfigService;
    @Autowired
    private ServiceTaskScheduleMapper serviceTaskScheduleMapper;
@@ -104,18 +97,6 @@
    private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    @Autowired
    private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper;
    /**
     * æŸ¥è¯¢æ‚£è€…住院记录
     *
     * @param inhospid æ‚£è€…住院记录主键
     * @return æ‚£è€…住院记录
     */
    @Override
    public PatMedInhosp selectPatMedInhospByInhospid(Long inhospid) {
        return inhospVisitFacade.selectPatMedInhospByInhospid(inhospid);
    }
    @Override
    public List<PatMedInhosp> selectPatMedInhosp(PatMedInhosp patMedInhosp) {
@@ -267,20 +248,6 @@
    }
    /**
     * æŸ¥è¯¢å‡ºå…¥é™¢äººæ¬¡
     *
     * @param patMedReq
     * @return
     */
    @Override
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq) {
        PatMedRes patMedRes = null;
        // èŽ·å–å½“å‰ç™»é™†äººçš„éƒ¨é—¨æƒé™
        patMedRes = inhospVisitFacade.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
    /**
     * æ–°å¢žæ‚£è€…住院记录
     *
     * @param patMedInhosp æ‚£è€…住院记录
@@ -304,333 +271,6 @@
        patMedInhosp.setUpdateTime(DateUtils.getNowDate());
        return inhospVisitFacade.updatePatMedInhosp(patMedInhosp);
    }
    /**
     * æ‰¹é‡åˆ é™¤æ‚£è€…住院记录
     *
     * @param inhospids éœ€è¦åˆ é™¤çš„æ‚£è€…住院记录主键
     * @return ç»“æžœ
     */
    @Override
    public int deletePatMedInhospByInhospids(Long[] inhospids) {
        return inhospVisitFacade.deletePatMedInhospByInhospids(inhospids);
    }
    /**
     * åˆ é™¤æ‚£è€…住院记录信息
     *
     * @param inhospid æ‚£è€…住院记录主键
     * @return ç»“æžœ
     */
    @Override
    public int deletePatMedInhospByInhospid(Long inhospid) {
        return inhospVisitFacade.deletePatMedInhospByInhospid(inhospid);
    }
    /**
     * åˆ é™¤æ‚£è€…住院记录信息
     *
     * @param inhospno æ‚£è€…住院编码
     * @return ç»“æžœ
     */
    @Override
    public int deletePatMedInhospByInhospno(String inhospno) {
        return inhospVisitFacade.deletePatMedInhospByInhospno(inhospno);
    }
    @Override
    public int dealOutHospInfo(String config) {
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = inhospVisitFacade.selectPatMedInhospList(pmks);
        //1.入院宣教
        String helibrarySwitch = iSysConfigService.selectConfigByKey("in.helibrary.switch");
        if (StringUtils.isNotEmpty(helibrarySwitch) && "2".equals(helibrarySwitch)) {
            //1.1 ç§‘室
            for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                try {
                    //根据患者所在科室,获取该科室的入院长期宣教任务
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                    serviceTaskdept.setLongtask(1L);
                    serviceTaskdept.setDeptCode(patMedInhosp1.getDeptcode());
                    serviceTaskdept.setDeptType("1");
                    serviceTaskdept.setServiceType("17");
                    serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
                    List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                        PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                        patMedInhosp1.setInDeptcheckFlag("2");
                        patMedInhosp1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + "该患者所在科室未配置入院长期宣教任务;" : "该患者所在科室未配置入院长期宣教任务;");
                        inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    } else {
                        for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 4, config);
                        }
                    }
                } catch (Exception e) {
                    log.error("人员入院科室处理出异常了:{}", e.getMessage());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了");
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                }
            }
            //1.2 ç—…区
            pmks.setInDeptcheckFlag(null);
            pmks.setInWardcheckFlag("0");
            pmks.setDeptcheckFlag(null);
            List<PatMedInhosp> inPatMedInhospsWard = inhospVisitFacade.selectPatMedInhospList(pmks);
            for (PatMedInhosp patMedInhosp1 : inPatMedInhospsWard) {
                //获取患者信息
                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
                if (Objects.isNull(patArchive)) {
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("患者基本信息为空");
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                    continue;
                }
                //根据患者所在病区,获取该病区的入院长期宣教任务(会出现一个问题,科室和病区发的同一个模板)
                ServiceTaskdept serviceTaskWard = new ServiceTaskdept();
                serviceTaskWard.setLongtask(1L);
                serviceTaskWard.setDeptCode(patMedInhosp1.getHospitaldistrictcode());
                serviceTaskWard.setDeptType("2");
                serviceTaskWard.setServiceType("17");
                serviceTaskWard.setOrgid(patMedInhosp1.getOrgid());
                List<ServiceTaskdept> serviceTaskWardList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskWardList) || serviceTaskWardList.size() == 0) {
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在病区未配置入院长期宣教任务;");
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskWardList) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 5, config);
                    }
                }
            }
        }
        //2.药品宣教(省立同德的需求,其它地方没提)
        if (active.equals("sltd")) {
            for (PatMedInhosp patMedInhosp : patMedInhosps) {
                String medicalCode = patMedInhosp.getMedicalCode();
                if (StringUtils.isNotEmpty(medicalCode)) {
                    String[] split = medicalCode.split(",");
                    // é˜²å¾¡æ€§ç¼–程:确保 medicalCompany å’Œ medicalName ä¸ä¸º null
                    String medicalCompanyStr = patMedInhosp.getMedicalCompany() != null ? patMedInhosp.getMedicalCompany() : "";
                    String medicalNameStr = patMedInhosp.getMedicalName() != null ? patMedInhosp.getMedicalName() : "";
                    String[] medicalCompanyArray = medicalCompanyStr.split(",");
                    String[] medicalNameArray = medicalNameStr.split(",");
                    for (int i = 0; i < split.length; i++) {
                        ServiceTaskmedical serviceTaskmedical = new ServiceTaskmedical();
                        //拿药品编码和公司去查
                        serviceTaskmedical.setMedicalCode(split[i]);
                        // é˜²æ­¢ä¸‹æ ‡è¶Šç•Œï¼šå¦‚果数组长度不一致,取最小长度
                        if (i < medicalCompanyArray.length) {
                            serviceTaskmedical.setMedicalCompany(medicalCompanyArray[i]);
                        } else {
                            log.warn("【药品宣教】药品编码{}对应的公司信息下标越界,medicalCompany æ•°ç»„长度={}, å½“前索引={}", split[i], medicalCompanyArray.length, i);
                            serviceTaskmedical.setMedicalName(""); // è¶Šç•Œæ—¶è®¾ç½®ä¸ºç©º
                        }
                        List<ServiceTaskmedical> serviceTaskmedicals = serviceTaskmedicalMapper.selectServiceTaskmedicalList(serviceTaskmedical);
                        if (CollectionUtils.isNotEmpty(serviceTaskmedicals)) {
                            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
                            // check=true,让 writeInSubTask å†…部做去重校验
                            writeInSubTask(serviceTaskmedicals.get(0).getTaskId(), true, patMedInhosp, patArchive, 0, config);
                        }
                        //查不到的药品就是不需要宣教的,就不管了
                    }
                }
            }
        }
        //3.出院随访 - åŸºäºŽè§„则的任务生成
        // èŽ·å–æ‰€æœ‰éœ€è¦å¤„ç†çš„å‡ºé™¢æ‚£è€…ï¼ˆç§‘å®¤ç»´åº¦æœªå¤„ç†ï¼‰
        addSubTaskByRule(config, patMedInhosps);
        if (!active.equals("xh")) {
            addOperationSubTask(config);
        }
        //获取未处理在院的数据(如果刚刚出院的患者数据的出院时间,在下面查询出的入院时间之前,那之前的出院患者的数据,也得停掉,因为又入院了)
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setDeptcheckFlag("0");
        patMedInhosp.setInhospstate("0");
        List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp);
        if (CollectionUtils.isNotEmpty(patMedInhospList) && patMedInhospList.size() > 0) {
            dealInHospInfo(patMedInhospList);
        }
        return 1;
    }
    /**
     * ä»»åŠ¡ç»„éšè®¿
     *
     * @param config
     * @return
     */
    public int dealOutHospInfoBySchedule(String config) {
        ServiceTask serviceTaskVo = new ServiceTask();
        serviceTaskVo.setLongTask(1);
        serviceTaskVo.setAppltype("5");
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(serviceTaskVo);
        if (CollectionUtils.isNotEmpty(serviceTasks)) {
            for (ServiceTask serviceTask : serviceTasks) {
                if (!ObjectUtils.isEmpty(serviceTask.getTaskid())) {
                    ServiceTaskSchedule serviceTaskSchedule = new ServiceTaskSchedule();
                    ServiceTaskSchedule taskSchedule = new ServiceTaskSchedule();
                    taskSchedule.setTaskid(serviceTask.getTaskid());
                    List<ServiceTaskSchedule> serviceTaskSchedules = serviceTaskScheduleMapper.selectServiceTaskScheduleList(taskSchedule);
                    if (CollectionUtils.isNotEmpty(serviceTaskSchedules)) {
                        serviceTaskSchedule = serviceTaskSchedules.get(0);
                        String deptCodes = serviceTaskSchedule.getDeptCodes();
                        String wardCodes = serviceTaskSchedule.getWardCodes();
                        String icd10Codes = serviceTaskSchedule.getIcd10Codes();
                        String opLevelCodes = serviceTaskSchedule.getOplevelCodes();
                        List<String> icd10CodeList = new ArrayList<>();
                        List<String> opLevelCodeList = new ArrayList<>();
                        List<String> deptCodeList = new ArrayList<>();
                        List<String> wardCodeList = new ArrayList<>();
                        /**
                         * éšè®¿ç±»åž‹(1-科室,2-病区,3-疾病 4-入院科室 5-入院病区 6-手术)
                         */
                        Integer type = 1;
                        if (StringUtils.isNotEmpty(deptCodes)) {
                            type = 1;
                            deptCodeList = new ArrayList<>(Arrays.asList(deptCodes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(wardCodes)) {
                            type = 2;
                            wardCodeList = new ArrayList<>(Arrays.asList(wardCodes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(icd10Codes)) {
                            type = 3;
                            icd10CodeList = new ArrayList<>(Arrays.asList(icd10Codes.split(",")));
                        }
                        if (StringUtils.isNotEmpty(opLevelCodes)) {
                            type = 6;
                            opLevelCodeList = new ArrayList<>(Arrays.asList(opLevelCodes.split(",")));
                        }
                        //非手术处理方式
                        if (type != 6) {
                            PatMedInhosp patMedInhospVo = new PatMedInhosp();
                            patMedInhospVo.setScheduleCheckFlag("0");
                            patMedInhospVo.setInhospstate("1");
                            patMedInhospVo.setFuflag("1");
//                            patMedInhospVo.setDeptcodeList(deptCodeList);
                            patMedInhospVo.setLeaveldeptcodes(deptCodeList);
                            patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList);
                            patMedInhospVo.setIcd10codeList(icd10CodeList);
                            List<PatMedInhosp> patList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo);
                            log.info("dealOutHospInfoBySchedule ä»»åŠ¡ç»„éšè®¿, taskid = {}, æ‰«ææ‚£è€…人数 {}", serviceTask.getTaskid(), patList.size());
                            for (PatMedInhosp patMedInhosp : patList) {
                                ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                                scheduleDetailVo.setTaskid(serviceTask.getTaskid());
                                scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
                                List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
                                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
                                if (Objects.isNull(patArchive)) {
                                    continue;
                                }
                                //封装serviceSubtask
                                ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp, patArchive, config, type);
                                List<Map<String, Object>> preachformList = new ArrayList<>();
                                if (StringUtils.isNotEmpty(serviceTask.getPreachformDesc())) {
                                    try {
                                        ObjectMapper objectMapper = new ObjectMapper();
                                        preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class);
                                    } catch (Exception e) {
                                        log.error("任务组preachformDesc解析失败,taskid={},inhospid={}", serviceTask.getTaskid(), patMedInhosp.getInhospid());
                                    }
                                }
                                scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList);
                                //置首轮纳入标记,避免下次扫描重复生成(后续轮次由 rollTaskGroupCycle è´Ÿè´£ï¼‰
                                PatMedInhosp flagUpd = new PatMedInhosp();
                                flagUpd.setInhospid(patMedInhosp.getInhospid());
                                flagUpd.setScheduleCheckFlag("1");
                                inhospVisitFacade.updatePatMedInhosp(flagUpd);
                            }
                        } else {
                            //任务组 - æ‰‹æœ¯éšè®¿
                            if (CollectionUtils.isNotEmpty(opLevelCodeList)) {
                                PatMedOperationItem pmoi = new PatMedOperationItem();
                                //获取需要出院疾病随访,未处理的数据
                                pmoi.setOpercheckFlag("0");
                                pmoi.setMainFlag("1");
                                pmoi.setDeptCodes(deptCodeList);
                                pmoi.setWardCodes(wardCodeList);
                                pmoi.setOpLevelCodes(opLevelCodeList);
                                //每次查询只查最大的手术等级记录
                                List<PatMedOperationItem> patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi);
                                for (PatMedOperationItem patMedOperationItem : patMedOperationItems) {
                                    PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperationItem.getPatid());
                                    if (Objects.isNull(patArchive)) {
                                        continue;
                                    }
                                    PatMedInhosp patMedInhospVo = new PatMedInhosp();
                                    patMedInhospVo.setPatid((patMedOperationItem.getPatid()));
                                    patMedInhospVo.setScheduleCheckFlag("0");
                                    patMedInhospVo.setInhospstate("1");
                                    patMedInhospVo.setFuflag("1");
                                    List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhospVo);
                                    if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                                        ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                                        scheduleDetailVo.setTaskid(serviceTask.getTaskid());
                                        scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
                                        List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
                                        //封装serviceSubtask
                                        ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedInhospList.get(0), patMedOperationItem, patArchive, config);
                                        List<Map<String, Object>> preachformList = new ArrayList<>();
                                        if (StringUtils.isNotEmpty(serviceTask.getPreachformDesc())) {
                                            try {
                                                ObjectMapper objectMapper = new ObjectMapper();
                                                preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class);
                                            } catch (Exception e) {
                                                log.error("任务组(手术)preachformDesc解析失败,taskid={}", serviceTask.getTaskid());
                                            }
                                        }
                                        scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList);
                                        //置首轮纳入标记,避免重复生成
                                        PatMedInhosp flagUpd = new PatMedInhosp();
                                        flagUpd.setInhospid(patMedInhospList.get(0).getInhospid());
                                        flagUpd.setScheduleCheckFlag("1");
                                        inhospVisitFacade.updatePatMedInhosp(flagUpd);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return 1;
    }
    /**
     * èŽ·å–å‡ºé™¢ï¼Œä½é™¢ï¼Œé—¨è¯ŠæœåŠ¡äººæ¬¡
@@ -1376,297 +1016,6 @@
        }
    }
    @Override
    public void addOperationSubTask(String config) {
        //            æ‰‹æœ¯éšè®¿
        PatMedOperationItem pmoi = new PatMedOperationItem();
        //获取需要出院手术随访,未处理的数据
        if(!active.equals("hzszlyy")){
            pmoi.setInhospstate("1");
        }
        pmoi.setOpercheckFlag("0");
        pmoi.setMainFlag("1");
        //每次查询只查最大的手术等级记录
        List<PatMedOperationItem> patMedOperationItems = otherVisitFacade.selectOperationItemListMaxLevel(pmoi);
        log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null);
        for (PatMedOperationItem opItem : patMedOperationItems) {
            try {
                if (StringUtils.isEmpty(opItem.getOplevelcode())) {
                    continue;
                }
                // æ ¹æ®æ‚£è€…的疾病,获取该疾病的长期任务
                List<ServiceTaskoper> serviceTaskopersDept = new ArrayList<>();
                if(StringUtils.isNotEmpty(opItem.getLeaveldeptcode())){
                    ServiceTaskoper serviceTaskoper1 = new ServiceTaskoper();
                    serviceTaskoper1.setLongtask(1L);
                    serviceTaskoper1.setOrgid(opItem.getOrgid());
                    serviceTaskoper1.setOplevelcode(opItem.getOplevelcode());
                    serviceTaskoper1.setDeptCode(opItem.getLeaveldeptcode());
                    serviceTaskopersDept = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper1);
                }
                List<ServiceTaskoper> serviceTaskopersWard = new ArrayList<>();
                if(StringUtils.isNotEmpty(opItem.getLeavehospitaldistrictcode())){
                    ServiceTaskoper serviceTaskoper2 = new ServiceTaskoper();
                    serviceTaskoper2.setLongtask(1L);
                    serviceTaskoper2.setOrgid(opItem.getOrgid());
                    serviceTaskoper2.setOplevelcode(opItem.getOplevelcode());
                    serviceTaskoper2.setWardCode(opItem.getLeavehospitaldistrictcode());
                    serviceTaskopersWard = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper2);
                }
                List<ServiceTaskoper> serviceTaskopers = new ArrayList<>();
                serviceTaskopers.addAll(serviceTaskopersDept);
                serviceTaskopers.addAll(serviceTaskopersWard);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                    PatMedOperationItem patMedOperationItem = otherVisitFacade.selectOperationItemById(opItem.getId());
                    patMedOperationItem.setOpercheckFlag("2");
                    patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;");
                    patMedOperationItem.setUpdateTime(new Date());
                    otherVisitFacade.updateOperationItem(patMedOperationItem);
                } else {
                    for (ServiceTaskoper serviceTaskoper : serviceTaskopers) {
                        writeInSubTaskForOp(serviceTaskoper.getTaskId(), true, opItem, config);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员手术处理出异常了:{}", e.getMessage());
                opItem.setUpdateTime(new Date());
                opItem.setOpercheckFlag("2");
                opItem.setLongTaskReason("人员手术处理异常");
                otherVisitFacade.updateOperationItem(opItem);
            }
        }
    }
    private void addIcd10SubTask(String config) {
        PatMedInhosp pmjb = new PatMedInhosp();
        //获取需要出院疾病随访,未处理的数据
        pmjb.setDiagcheckFlag("0");
        pmjb.setInhospstate("1");
        pmjb.setFuflag("1");
        List<PatMedInhosp> patMedInhospJBs = inhospVisitFacade.selectPatMedInhospList(pmjb);
        log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospJBs) ? patMedInhospJBs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospJBs) {
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        for (PatMedInhosp pmiJB : patMedInhospJBs) {
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiJB.getPatid());
            if (Objects.isNull(patArchive)) {
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("患者基本信息为空");
                inhospVisitFacade.updatePatMedInhosp(pmiJB);
                continue;
            }
            try {
                String errorIcd = null;
                if (StringUtils.isEmpty(pmiJB.getLeaveicd10code())) {
                    continue;
                }
                // æ ¹æ®æ‚£è€…的疾病,获取该疾病的长期任务
                ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag();
                serviceTaskdiag.setLongtask(1L);
//                serviceTaskdiag.setServiceType("2");
                if (active.equals("nhfy")) {
                    //南华附一的icd10code有重复,所以用主诊断名称去查询
                    serviceTaskdiag.setIcd10name(pmiJB.getLeavediagname());
                    if (StringUtils.isEmpty(pmiJB.getLeavediagname())) {
                        errorIcd = "该患者主诊断名称为空;";
                    }
                } else {
                    serviceTaskdiag.setIcd10code(pmiJB.getLeaveicd10code());
                    if (StringUtils.isEmpty(pmiJB.getLeaveicd10code())) {
                        errorIcd = "该患者主诊断ICD10码为空;";
                    }
                }
                serviceTaskdiag.setOrgid(pmiJB.getOrgid());
                List<ServiceTaskdiag> serviceTaskdiags = serviceTaskdiagMapper.selectServiceTaskdiagListByIcdName(serviceTaskdiag);
                //如果部门模板为空(将deptIsNull设置为true)
                if (StringUtils.isNotEmpty(errorIcd)) {
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    pmiJB.setDiagcheckFlag("2");
                    pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                    inhospVisitFacade.updatePatMedInhosp(pmiJB);
                } else if (CollectionUtils.isEmpty(serviceTaskdiags)) {
                    errorIcd = "该患者所患疾病未配置长期任务;";
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                    pmiJB.setDiagcheckFlag("2");
                    pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                    inhospVisitFacade.updatePatMedInhosp(pmiJB);
                } else {
                    int flag = 0;
                    for (ServiceTaskdiag serviceTaskdept1 : serviceTaskdiags) {
                        //必须科室或病区能匹配上,才可以用这个疾病创建子任务(主要处理一个疾病在多个病区或科室出现)
                        if (StringUtils.isNotEmpty(serviceTaskdept1.getDeptCode()) && serviceTaskdept1.getDeptCode().equals(pmiJB.getLeaveldeptcode())) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiJB, patArchive, 3, config);
                            flag = 1;
                        } else if (StringUtils.isNotEmpty(serviceTaskdept1.getWardCode()) && serviceTaskdept1.getWardCode().equals(pmiJB.getLeavehospitaldistrictcode())) {
                            writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiJB, patArchive, 3, config);
                            flag = 1;
                        }
                    }
                    if (flag == 0) {
                        log.error("该科室或病区对于患者所患疾病未配置长期任务,患者:{}", pmiJB.getInhospid());
                        errorIcd = "该科室或病区对于患者所患疾病未配置长期任务;";
                        PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiJB.getInhospid());
                        pmiJB.setDiagcheckFlag("2");
                        pmiJB.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorIcd : errorIcd);
                        inhospVisitFacade.updatePatMedInhosp(pmiJB);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员疾病处理出异常了:{}", e.getMessage());
                pmiJB.setDiagcheckFlag("2");
                pmiJB.setLongTaskReason("人员疾病处理异常");
                inhospVisitFacade.updatePatMedInhosp(pmiJB);
            }
        }
    }
    private void addWardSubTask(String config) {
        PatMedInhosp pmbq = new PatMedInhosp();
        //获取需要出院部门随访,未处理的数据
        pmbq.setWardcheckFlag("0");
        pmbq.setInhospstate("1");
        pmbq.setFuflag("1");
        List<PatMedInhosp> patMedInhospBQs = inhospVisitFacade.selectPatMedInhospList(pmbq);
        log.info("dealOutHospInfo需要处理的出院病区患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospBQs) ? patMedInhospBQs.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhospBQs) {
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        //病区数据处理
        for (PatMedInhosp pmiBQ1 : patMedInhospBQs) {
            if ("1".equals(pmiBQ1.getLeavehospitaldistrictcode()) && pmiBQ1.getDiagcheckFlag().equals("1")) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("根据交叉生成随访任务规则,病区任务可以不用生成");
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                continue;
            }
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiBQ1.getPatid());
            if (Objects.isNull(patArchive)) {
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("患者基本信息为空");
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                continue;
            }
            try {
                String errorreason = null;
                List<ServiceTaskdept> serviceTaskdeptList = null;
                if (!StringUtils.isEmpty(pmiBQ1.getLeavehospitaldistrictcode())) {
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                    serviceTaskdept.setLongtask(1L);
                    serviceTaskdept.setDeptCode(pmiBQ1.getLeavehospitaldistrictcode());
                    serviceTaskdept.setDeptType("2");
                    serviceTaskdept.setServiceType("2");
                    serviceTaskdept.setOrgid(pmiBQ1.getOrgid());
                    serviceTaskdeptList = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                    if (CollectionUtils.isEmpty(serviceTaskdeptList)) {
                        errorreason = "该患者所在病区未配置长期任务;";
                    }
                } else {
                    errorreason = "离院病区为空;";
                }
                //如果部门模板为空(将deptIsNull设置为true)
                if (StringUtils.isNotEmpty(errorreason)) {
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(pmiBQ1.getInhospid());
                    pmiBQ1.setWardcheckFlag("2");
                    pmiBQ1.setLongTaskReason(StringUtils.isNotEmpty(patMedInhosp.getLongTaskReason()) ? patMedInhosp.getLongTaskReason() + errorreason : errorreason);
                    inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdeptList) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, pmiBQ1, patArchive, 2, config);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员病区处理出异常了:{}", e.getMessage());
                pmiBQ1.setWardcheckFlag("2");
                pmiBQ1.setLongTaskReason("人员病区处理异常");
                inhospVisitFacade.updatePatMedInhosp(pmiBQ1);
            }
        }
    }
    private void addDeptSubTask(String config) {
        //获取需要出院部门随访,未处理的数据
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        List<PatMedInhosp> patMedInhosps = inhospVisitFacade.selectPatMedInhospList(pmks);
        log.info("dealOutHospInfo需要处理的出院部门患者信息:{}", CollectionUtils.isNotEmpty(patMedInhosps) ? patMedInhosps.size() : null);
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            String tagname = inhospVisitFacade.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        //科室
        for (PatMedInhosp patMedInhosp1 : patMedInhosps) {
            if ("1".equals(patMedInhosp1.getLeavehospitaldistrictcode()) && patMedInhosp1.getDiagcheckFlag().equals("1")) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("根据交叉生成随访任务规则,部门任务可以不用生成");
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            //获取患者信息
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
            if (Objects.isNull(patArchive)) {
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("患者基本信息为空");
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                continue;
            }
            try {
                //根据患者所在科室,获取该科室的长期任务
                ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                serviceTaskdept.setLongtask(1L);
                serviceTaskdept.setDeptCode(patMedInhosp1.getLeaveldeptcode());
                serviceTaskdept.setDeptType("1");
                serviceTaskdept.setServiceType("2");
                serviceTaskdept.setOrgid(patMedInhosp1.getOrgid());
                List<ServiceTaskdept> serviceTaskdepts = serviceTaskdeptMapper.selectServiceTaskdeptList(serviceTaskdept);
                //如果部门模板为空(将deptIsNull设置为true)
                if (CollectionUtils.isEmpty(serviceTaskdepts) || serviceTaskdepts.size() == 0) {
                    PatMedInhosp patMedInhosp = inhospVisitFacade.selectPatMedInhospByInhospid(patMedInhosp1.getInhospid());
                    patMedInhosp1.setDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason(patMedInhosp.getLongTaskReason() + "该患者所在科室未配置离院长期任务;");
                    inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
                } else {
                    for (ServiceTaskdept serviceTaskdept1 : serviceTaskdepts) {
                        writeInSubTask(serviceTaskdept1.getTaskId(), true, patMedInhosp1, patArchive, 1, config);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("人员科室处理出异常了:{}", e.getMessage());
                patMedInhosp1.setDeptcheckFlag("2");
                patMedInhosp1.setLongTaskReason("人员科室处理异常");
                inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
            }
        }
    }
    /**
     * ç»Ÿä¸€æ›´æ–°pat_med_inhosp的check_flag
     *
@@ -2016,49 +1365,6 @@
            inhospVisitFacade.updatePatMedInhosp(patMedInhosp1);
        }
        return generatedCount;
    }
    // ==========================================================================
    // å‡ºå…¥é™¢éšè®¿æ¨¡å—化(第一批)—— 3 ä¸ªè¿‡æ¸¡æœŸå…¥å£ï¼ˆçº¯è½¬å‘,零业务逻辑)
    //
    // âš ï¸ è¿™ 3 ä¸ªæ–¹æ³•是刻意新增的,不是误加:
    //    è§ IPatMedInhospService é‡ŒåŒåçš„æŽ¥å£å£°æ˜Žæ³¨é‡Šï¼Œä»¥åŠ
    //    sql/_probe/verify_step16_service_restore.py çš„ expected_added æ–­è¨€ã€‚
    // ==========================================================================
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘手术随访扫描 â€”— ä¸Ž {@link #addOperationSubTask(String)} å®Œå…¨ç­‰ä»·ã€‚
     * <p>
     * âš ï¸ {@code addOperationSubTask} åŽŸå®žçŽ°è¿”å›ž {@code void},所以这里按"处理了 1 è½®"返回 1,
     * ä»…用于日志;<b>调用方不得依赖该返回值的业务含义</b>。
     */
    @Override
    public int runOperationVisit(String config) {
        addOperationSubTask(config);
        return 1;
    }
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘科室维度未处理的在院患者。
     * <p>
     * æ¡ä»¶ä¸ŽåŽŸ {@code dealOutHospInfo} ç¬¬ä¸€æ®µæŸ¥è¯¢é€å­—一致:
     * {@code deptcheckFlag="0"} + {@code inhospstate="1"} + {@code fuflag="1"}。
     */
    @Override
    public List<PatMedInhosp> selectPendingDeptPatientsForVisit() {
        PatMedInhosp pmks = new PatMedInhosp();
        pmks.setDeptcheckFlag("0");
        pmks.setInhospstate("1");
        pmks.setFuflag("1");
        return inhospVisitFacade.selectPatMedInhospList(pmks);
    }
    /**
     * ã€è¿‡æ¸¡æœŸç”¨ã€‘把一条已组装好的子任务落库(原 {@code serviceSubtaskMapper.insertServiceSubtask})。
     */
    @Override
    public boolean persistSubtask(ServiceSubtask serviceSubtask) {
        return serviceSubtaskMapper.insertServiceSubtask(serviceSubtask) == 1;
    }
}
smartor/src/main/java/com/smartor/service/impl/PersonWorkbenchServiceImpl.java
@@ -2,8 +2,8 @@
import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
import com.ruoyi.outpatientvisit.domain.PatMedOuthospQueryReq;
import com.smartor.domain.PerSonWorkbenchDto;
import com.smartor.mapper.PatArchiveOutMapper;
import com.ruoyi.patarchive.domain.PerSonWorkbenchDto;
import com.ruoyi.patarchive.mapper.PatArchiveOutMapper;
import com.ruoyi.outpatientvisit.mapper.PatMedOuthospMapper;
import com.smartor.service.PersonWorkbenchService;
import org.springframework.beans.factory.annotation.Autowired;
smartor/src/main/java/com/smartor/service/impl/ServicPhoneServiceImpl.java
@@ -16,7 +16,6 @@
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.FtpService;
import com.ruoyi.common.utils.PhoneUtils;
import com.smartor.domain.*;
import com.ruoyi.template.domain.VO.HeLibraryCountVO;
smartor/src/main/java/com/smartor/service/impl/ServiceAppointRecordServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -47,6 +47,13 @@
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
import com.ruoyi.patarchive.mapper.PatArchivecontactMapper;
import com.ruoyi.common.core.domain.entity.Icd10;
import com.ruoyi.common.mapper.Icd10Mapper;
import com.ruoyi.system.mapper.ext.SysUser2Mapper;
import com.ruoyi.system.mapper.ext.SysDept2Mapper;
import com.ruoyi.system.mapper.ext.SysUserDeptMapper;
/**
 * ä¸»é”®Service业务层处理
 *
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -63,6 +63,8 @@
import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.service.IServiceTaskService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
/**
 * ä»»åŠ¡é—®å·é—®é¢˜é€‰é¡¹Service业务层处理
 *
@@ -920,7 +922,8 @@
        Map<String, Object> map = new HashMap<>();
        if (serviceSubTaskQueryReq.getSubId() != null) {
            ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubTaskQueryReq.getSubId());
            if (serviceSubtask.getSendstate() == 4L) {
            // ä»»åŠ¡å¯èƒ½å·²è¢«åˆ é™¤/查不到,sendstate ä¹Ÿå¯èƒ½ä¸ºç©ºï¼Œè¿™é‡Œå¿…须判空,否则拆箱会 NPE
            if (serviceSubtask != null && Long.valueOf(4L).equals(serviceSubtask.getSendstate())) {
                log.info("患者子任务ID为:{},状态为:{}", serviceSubTaskQueryReq.getSubId(), serviceSubtask.getSendstate());
                throw new BaseException("该任务不执行");
            }
@@ -933,7 +936,7 @@
        //获取上次的问答结果
        ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubTaskQueryReq.getSubId());
        map.put("upScriptResult", null);
        map.put("templateName", serviceSubtask.getTemplatename());
        map.put("templateName", serviceSubtask == null ? null : serviceSubtask.getTemplatename());
        map.put("upTaskName", null);
        if (ObjectUtils.isNotEmpty(serviceSubtask) && serviceSubtask.getUpid() != null) {
            Map<String, Object> scriptInfoByCondition2 = serviceTaskService.getScriptInfoByCondition(serviceSubTaskQueryReq.getTaskid(), serviceSubTaskQueryReq.getPatid(), serviceSubTaskQueryReq.getIsFinish(), serviceSubTaskQueryReq.getPatfrom(), serviceSubTaskQueryReq.getSubId());
@@ -951,7 +954,7 @@
    private Map<String, Object> getMap(Map<String, Object> scriptInfoByCondition, Long subid, Long patid) {
        Map<String, Object> map = new HashMap<>();
        if (ObjectUtils.isNotEmpty(scriptInfoByCondition) && ObjectUtils.isNotEmpty(scriptInfoByCondition.get("script"))) {
            if (scriptInfoByCondition.get("type").equals("1")) {
            if ("1".equals(scriptInfoByCondition.get("type"))) {
                List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOS = (List<IvrTaskTemplateScriptVO>) scriptInfoByCondition.get("script");
                // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰æ˜Žç»†ï¼Œé¿å…å¾ªçŽ¯ä¸­é€æ¡æŸ¥æ•°æ®åº“ï¼ˆN+1问题优化)
                Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
@@ -964,7 +967,7 @@
                }
                map.put("scriptResult", ivrTaskTemplateScriptVOS);
                map.put("taskName", scriptInfoByCondition.get("taskName"));
            } else if (scriptInfoByCondition.get("type").equals("2")) {
            } else if ("2".equals(scriptInfoByCondition.get("type"))) {
                List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOList = (List) scriptInfoByCondition.get("script");
                // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰æ˜Žç»†ï¼Œé¿å…å¾ªçŽ¯ä¸­é€æ¡æŸ¥æ•°æ®åº“ï¼ˆN+1问题优化)
                Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
@@ -980,7 +983,7 @@
                }
                map.put("scriptResult", svyTaskTemplateScriptVOList);
                map.put("taskName", scriptInfoByCondition.get("taskName"));
            } else if (scriptInfoByCondition.get("type").equals("3")) {
            } else if ("3".equals(scriptInfoByCondition.get("type"))) {
                //宣教不需要查看
                List<HeLibrary> heLibraryList = (List) scriptInfoByCondition.get("script");
                map.put("scriptResult", heLibraryList);
@@ -1220,6 +1223,8 @@
            //非满意度意见异常自动填入空
            subtaskDetailTrace.setMatchedtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException());
            subtaskDetailTrace.setAsrtext(stt != null ? stt.getOptioncontent() : svyTaskTemplateScriptVO.getIsMydException());
            //补充描述(选了"其他/有症状"时填的文字)一并带到 trace è¡¨
            subtaskDetailTrace.setAnswerps(serviceSubtaskDetail.getAnswerps());
            subtaskDetailTrace.setIsMydException(svyTaskTemplateScriptVO.getIsMydException());
            subtaskDetailTrace.setRecordpath(null);
@@ -1513,6 +1518,8 @@
            subtaskDetailTrace.setType(ivrLibaScriptAssort != null ? ivrLibaScriptAssort.getType() : null);
            subtaskDetailTrace.setScriptid(ivrTaskTemplateScriptVO.getId() == null ? ivrTaskTemplateScriptVO.getScriptID() : ivrTaskTemplateScriptVO.getId());
            subtaskDetailTrace.setAsrtext(ivrTaskTemplateScriptVO.getIvrtext());
            //补充描述一并带到 trace è¡¨
            subtaskDetailTrace.setAnswerps(serviceSubtaskDetail.getAnswerps());
            subtaskDetailTrace.setRecordpath(null);
            subtaskDetailTrace.setPatid(selectServiceSubtaskList.get(0).getPatid());
            JSONObject patdescJson2 = new JSONObject();
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskRecordServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/service/impl/ServiceTaskRuleServiceImpl.java
@@ -82,15 +82,4 @@
        return serviceTaskRuleMapper.deleteServiceTaskRuleByIds(ids);
    }
    /**
     * åˆ é™¤ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¿¡æ¯
     *
     * @param id ä»»åŠ¡æ‰§è¡Œè§„åˆ™ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteServiceTaskRuleById(Long id)
    {
        return serviceTaskRuleMapper.deleteServiceTaskRuleById(id);
    }
}
smartor/src/main/java/com/smartor/service/impl/SvyLibTemplateScriptServiceImpl.java
@@ -102,18 +102,6 @@
        return svyLibTemplateScriptMapper.deleteSvyLibTemplateScriptByTopicids(topicids);
    }
    /**
     * åˆ é™¤æ¨¡æ¿é—®å·é¢˜ç›®ä¿¡æ¯
     *
     * @param topicid æ¨¡æ¿é—®å·é¢˜ç›®ä¸»é”®
     * @return ç»“æžœ
     */
    @Override
    public int deleteSvyLibTemplateScriptByTopicid(Long topicid)
    {
        return svyLibTemplateScriptMapper.deleteSvyLibTemplateScriptByTopicid(topicid);
    }
    public Map<Long, ServiceSubtaskScriptCount> countPatByScript(ServiceSubtaskCountReq serviceSubtaskCountReq)
    {
        Map<Long, ServiceSubtaskScriptCount> result = new HashMap<>();
smartor/src/main/java/com/smartor/service/impl/SvyTaskServiceImpl.java
@@ -28,6 +28,7 @@
import com.smartor.mapper.SvyTaskMapper;
import com.smartor.mapper.SvyTaskSingleMapper;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
/**
 * ç»¼åˆé—®å·ä»»åŠ¡ï¼ˆä»»åŠ¡ï¼‰Service业务层处理
 *
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java
@@ -13,7 +13,7 @@
import com.smartor.common.LyraTokenUtil;
import com.smartor.domain.*;
import com.smartor.mapper.BaseOrganizationMapper;
import com.smartor.mapper.PatArchiveMapper;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
import com.smartor.service.ISvyTaskSingleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/HNGatherPatArchiveMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/Icd10Mapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/MedicationDoseInfoMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/MedicationItemMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/ServiceAppointRecordMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/ServiceSubtaskRecordMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/SysDeptMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/SysUserMapper.xml
ÎļþÒÑɾ³ý
smartor/src/main/resources/mapper/smartor/SysUserRole2Mapper.xml
ÎļþÒÑɾ³ý