package com.smartor.service.impl; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUserDept; import com.ruoyi.common.core.domain.entity.SysUserRole; import com.ruoyi.common.utils.StringUtils; import com.smartor.domain.*; import com.smartor.mapper.*; import com.smartor.service.IHNGatherPatArchiveService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; /** * 患者档案Service业务层处理 * * @author smartor * @date 2023-03-04 */ @Slf4j @Service public class HNGatherPatArchiveServiceImpl implements IHNGatherPatArchiveService { @Autowired private HNGatherPatArchiveMapper hnGatherPatArchiveMapper; @Autowired private SysUser2Mapper sysUser2Mapper; @Autowired private SysUserRole2Mapper sysUserRoleMapper; @Autowired private SysDept2Mapper sysDept2Mapper; @Autowired private SysUserDeptMapper sysUserDeptMapper; @Autowired private Icd10Mapper icd10Mapper; @Autowired private PatMedOuthospMapper patMedOuthospMapper; @Autowired private PatMedInhospMapper patMedInhospMapper; @Autowired private PatArchiveMapper patArchiveMapper; @Autowired private ThreadPoolTaskExecutor taskExecutor; @Autowired private ShardingMapper shardingMapper; private static final long SHARDING_THRESHOLD = 5_000_000L; private static final String PAT_ARCHIVE_TABLE = "pat_archive"; private static final String PAT_MED_INHOSP_TABLE = "pat_med_inhosp"; @Override public List selectPatArchiveList(PatArchive patArchive) { return hnGatherPatArchiveMapper.selectPatArchiveList(patArchive); } // @Override // public Integer selectPatMedInhospList(PatMedInhosp patMedInhosp) { // // 异步执行整个数据同步任务 // taskExecutor.execute(() -> { // log.info("开始执行数据同步任务..."); // syncPatArchivesInOrder(); // 先同步患者 // syncPatMedInhosp(); // 再同步出入院 // log.info("数据同步任务提交完毕。"); // }); // return 0; // 返回0表示任务已提交到后台执行 // } @Override public Integer selectPatMedInhospList(PatMedInhosp patMedInhosp) { List patMedInhospList = hnGatherPatArchiveMapper.selectPatMedInhospList(patMedInhosp); for (PatMedInhosp pm : patMedInhospList) { PatArchive patArchive = new PatArchive(); patArchive.setPatientno(pm.getPatno()); List patArchives = hnGatherPatArchiveMapper.selectPatArchiveList(patArchive); if (CollectionUtils.isEmpty(patArchives)) { //空了直接丢掉 continue; } PatArchive pa = new PatArchive(); pa.setPatientno(patArchives.get(0).getPatientno()); List patArchives1 = patArchiveMapper.selectPatArchiveList(pa); if (CollectionUtils.isNotEmpty(patArchives1)) { pm.setPatid(patArchives1.get(0).getId()); } else { patArchiveMapper.insertPatArchiveSingle(patArchives.get(0)); pm.setPatid(patArchives.get(0).getId()); } patMedInhospMapper.insertPatMedInhosp(pm); } return 0; } @Override public Boolean hnDataGather(HnDataGatherVO hnDataGatherVO) { LocalDate startDate = hnDataGatherVO.getStartOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate endDate = hnDataGatherVO.getEndOutHospTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); Integer po = null; // 循环处理每一天 for (LocalDate currentDate = startDate; !currentDate.isAfter(endDate); currentDate = currentDate.plusDays(1)) { PatMedInhosp dailyCondition = new PatMedInhosp(); LocalDateTime dayStart = currentDate.atStartOfDay(); LocalDateTime dayEnd = currentDate.atTime(23, 59, 59); dailyCondition.setStartOutHospTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant())); dailyCondition.setEndOutHospTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant())); Integer pi = selectPatMedInhospList(dailyCondition); PatMedOuthosp patMedOuthosp = new PatMedOuthosp(); patMedOuthosp.setBeginTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant())); patMedOuthosp.setEndTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant())); po = selectPatMedOuthospList(patMedOuthosp); } return true; } @Override public Integer selectPatMedOuthospList(PatMedOuthosp patMedOuthosp) { List patMedOuthosps = hnGatherPatArchiveMapper.selectPatMedOuthospList(patMedOuthosp); log.info("selectPatMedOuthospList的采集到的数量为:{}", patMedOuthosps.size()); Integer i = null; for (PatMedOuthosp patMedOuthosp1 : patMedOuthosps) { //获取患者基本信息 PatArchive patArchive = new PatArchive(); patArchive.setPatientno(patMedOuthosp1.getPatno()); List patArchives = hnGatherPatArchiveMapper.selectPatArchiveList(patArchive); //根据patno判断本地患者基本信息是否存在 PatArchive pa = new PatArchive(); pa.setPatientno(patMedOuthosp1.getPatno()); List patArchives1 = patArchiveMapper.selectPatArchiveList(pa); if (CollectionUtils.isNotEmpty(patArchives1)) { patMedOuthosp1.setPatid(patArchives1.get(0).getId()); } else { if (CollectionUtils.isEmpty(patArchives)) { continue; } patArchiveMapper.insertPatArchiveSingle(patArchives.get(0)); patMedOuthosp1.setPatid(patArchives.get(0).getId()); } i = patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp1); } return i; } @Override public Integer selectIcd10List(Icd10 icd10) { List icd10s = hnGatherPatArchiveMapper.selectIcd10List(icd10); log.info("selectIcd10List的采集到的数量为:{}", icd10s.size()); int i = icd10Mapper.batchIcd10(icd10s); return i; } @Override public Integer selectUserList(SysUser sysUser) { List sysUserList = hnGatherPatArchiveMapper.selectUserList(sysUser); log.info("sysUserList的采集到的数量为:{}", sysUserList.size()); int i = sysUser2Mapper.batchUser(sysUserList); for (SysUser sysUser1 : sysUserList) { log.info("sysUser1的ID为:{}", sysUser1.getUserId()); log.info("sysUser1的HISUSERID为:{}", sysUser1.getHisUserId()); //新增用户与角色 SysUserRole yhyjsxx = hnGatherPatArchiveMapper.yhyjsxx(sysUser1); if (yhyjsxx == null) continue; yhyjsxx.setUserId(sysUser1.getUserId()); List userRoleList = new ArrayList<>(); userRoleList.add(yhyjsxx); sysUserRoleMapper.batchUserRole(userRoleList); //新增用户与部门 if (StringUtils.isEmpty(sysUser1.getHisUserId())) continue; SysUserDept sysUserDept = hnGatherPatArchiveMapper.yhyksxx(sysUser1); if (Objects.isNull(sysUserDept) || sysUserDept.getDeptId() == null) continue; SysDept dept = new SysDept(); dept.setHisDeptId(sysUserDept.getDeptId().toString()); List sysDepts = sysDept2Mapper.selectDeptList(dept); if (CollectionUtils.isNotEmpty(sysDepts)) { sysUserDept.setDeptId(sysDepts.get(0).getDeptId()); sysUserDept.setDeptCode(sysDepts.get(0).getDeptCode()); } sysUserDept.setUserId(sysUser1.getUserId()); sysUserDeptMapper.insertSysUserDept(sysUserDept); } return i; } @Override public Integer selectDeptList(SysDept dept) { List sysDepts = hnGatherPatArchiveMapper.selectDeptList(dept); log.info("selectDeptList的采集到的数量为:{}", sysDepts.size()); int i = sysDept2Mapper.batchDept(sysDepts); return i; } /** * 检查并执行分表的核心方法 * * @param tableName 要检查的表名 */ private synchronized void checkAndShard(String tableName) { long currentCount = shardingMapper.getTableCount(tableName); if (currentCount >= SHARDING_THRESHOLD) { log.warn("表 '{}' 已达到分表阈值 {},准备执行分表操作...", tableName, SHARDING_THRESHOLD); String newTableName = tableName + "_" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy_MM")); Long maxId = shardingMapper.getMaxId(tableName); if (maxId == null) maxId = 0L; shardingMapper.renameTable(tableName, newTableName); log.info("已将表 '{}' 重命名为 '{}'", tableName, newTableName); shardingMapper.createLikeTable(tableName, newTableName); log.info("已创建新表 '{}'", tableName); shardingMapper.setAutoIncrement(tableName, maxId + 1); log.info("已设置新表 '{}' 的自增ID起始值为 {}", tableName, maxId + 1); log.info("表 '{}' 的分表操作完成!", tableName); } } }