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<PatArchive> 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<PatMedInhosp> patMedInhospList = hnGatherPatArchiveMapper.selectPatMedInhospList(patMedInhosp); 
 | 
        for (PatMedInhosp pm : patMedInhospList) { 
 | 
            PatArchive patArchive = new PatArchive(); 
 | 
            patArchive.setPatientno(pm.getPatno()); 
 | 
            List<PatArchive> patArchives = hnGatherPatArchiveMapper.selectPatArchiveList(patArchive); 
 | 
            if (CollectionUtils.isEmpty(patArchives)) { 
 | 
                //空了直接丢掉 
 | 
                continue; 
 | 
            } 
 | 
            PatArchive pa = new PatArchive(); 
 | 
            pa.setPatientno(patArchives.get(0).getPatientno()); 
 | 
            List<PatArchive> 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()); 
 | 
            } 
 | 
            if (!Objects.isNull(patMedInhosp.getStartInHospTime()) && !Objects.isNull(patMedInhosp.getEndInHospTime())) { 
 | 
                //入院 
 | 
                pm.setInhospstate("0"); 
 | 
                pm.setCreateTime(new Date()); 
 | 
                patMedInhospMapper.insertPatMedInhosp(pm); 
 | 
            } else if (!Objects.isNull(patMedInhosp.getStartOutHospTime()) && !Objects.isNull(patMedInhosp.getEndOutHospTime())) { 
 | 
                //出院 
 | 
                pm.setInhospstate("1"); 
 | 
                pm.setUpdateTime(new Date()); 
 | 
                PatMedInhosp pmi = new PatMedInhosp(); 
 | 
                pmi.setSerialnum(pm.getSerialnum()); 
 | 
                List<PatMedInhosp> patMedInhospList1 = patMedInhospMapper.selectPatMedInhospList(pmi); 
 | 
                if (CollectionUtils.isEmpty(patMedInhospList1)) { 
 | 
                    pm.setCreateTime(new Date()); 
 | 
                    patMedInhospMapper.insertPatMedInhosp(pm); 
 | 
                } else { 
 | 
                    pm.setInhospid(patMedInhospList1.get(0).getInhospid()); 
 | 
                    patMedInhospMapper.updatePatMedInhosp(pm); 
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Boolean hnDataGather(HnDataGatherVO hnDataGatherVO) { 
 | 
  
 | 
        LocalDate startDate = hnDataGatherVO.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); 
 | 
        LocalDate endDate = hnDataGatherVO.getEndTime().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.setStartInHospTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            dailyCondition.setEndInHospTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            selectPatMedInhospList(dailyCondition); 
 | 
  
 | 
            //处理出院 
 | 
            dailyCondition.setStartInHospTime(null); 
 | 
            dailyCondition.setEndInHospTime(null); 
 | 
            dailyCondition.setStartOutHospTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            dailyCondition.setEndOutHospTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            selectPatMedInhospList(dailyCondition); 
 | 
  
 | 
            //处理门诊 
 | 
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp(); 
 | 
            patMedOuthosp.setBeginTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            patMedOuthosp.setEndTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant())); 
 | 
            selectPatMedOuthospList(patMedOuthosp); 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public Integer selectPatMedOuthospList(PatMedOuthosp patMedOuthosp) { 
 | 
        List<PatMedOuthosp> 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<PatArchive> patArchives = hnGatherPatArchiveMapper.selectPatArchiveList(patArchive); 
 | 
  
 | 
            //根据patno判断本地患者基本信息是否存在 
 | 
            PatArchive pa = new PatArchive(); 
 | 
            pa.setPatientno(patMedOuthosp1.getPatno()); 
 | 
            List<PatArchive> 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<Icd10> icd10s = hnGatherPatArchiveMapper.selectIcd10List(icd10); 
 | 
        log.info("selectIcd10List的采集到的数量为:{}", icd10s.size()); 
 | 
        int i = icd10Mapper.batchIcd10(icd10s); 
 | 
        return i; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Integer selectUserList(SysUser sysUser) { 
 | 
        List<SysUser> sysUserList = hnGatherPatArchiveMapper.selectUserList(sysUser); 
 | 
        if (CollectionUtils.isEmpty(sysUserList)) return null; 
 | 
  
 | 
  
 | 
        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<SysUserRole> 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<SysDept> 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<SysDept> sysDepts = hnGatherPatArchiveMapper.selectDeptList(dept); 
 | 
        log.info("selectDeptList的采集到的数量为:{}", sysDepts.size()); 
 | 
        int i = 0; 
 | 
        if (CollectionUtils.isNotEmpty(sysDepts)) 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); 
 | 
        } 
 | 
    } 
 | 
} 
 |