liusheng
8 天以前 7eb4c98f4d96bebf28685d801e7b978d6c3d251e
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java
@@ -2,38 +2,19 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
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 com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IPatMedPhysicalService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
 * 患者档案Service业务层处理
@@ -51,7 +32,13 @@
    private SysUser2Mapper sysUser2Mapper;
    @Autowired
    private SysUserRole2Mapper sysUserRoleMapper;
    @Autowired
    private SysDept2Mapper sysDept2Mapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    @Autowired
    private Icd10Mapper icd10Mapper;
@@ -65,62 +52,84 @@
    @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) {
        Long patArchiveCount = hnGatherPatArchiveMapper.selectPatArchiveCount(null);
        Long patOffst = (patArchiveCount + 1000 - 1) / 1000;
        PatArchive patArchive = new PatArchive();
        Long patSize = 0L;
        for (int i = 0; i <= patOffst; i++) {
            patArchive.setPs(1000);
            patArchive.setPn(1000 * i);
        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 (patArchives != null && !patArchives.isEmpty()) {
                patArchiveMapper.insertPatArchive(patArchives);
            if (CollectionUtils.isEmpty(patArchives)) {
                //空了直接丢掉
                continue;
            }
            patSize = patSize + patArchives.size();
            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());
            }
            patMedInhospMapper.insertPatMedInhosp(pm);
        }
        log.info("patArchives处理结束一共:{}", patSize);
        Long count = hnGatherPatArchiveMapper.selectPatMedInhospListCount(null);
        Long aa = (count + 1000 - 1) / 1000;
        //进行分页查询
        for (int i = 0; i <= aa; i++) {
            patMedInhosp.setPs(1000);
            patMedInhosp.setPn(1000 * i);
            List<PatMedInhosp> patMedInhospList = hnGatherPatArchiveMapper.selectPatMedInhospList(patMedInhosp);
            for (PatMedInhosp pm : patMedInhospList) {
                String patno = pm.getPatno();
                PatArchive pa = new PatArchive();
                //先去我们自己的表里通过patno查询该患者是否存在
                pa.setPatientno(patno);
                List<PatArchive> patArchives = patArchiveMapper.selectPatArchiveList(pa);
                if (CollectionUtils.isEmpty(patArchives)) {
                    continue;
                } else {
                    //直接将patid放到出入院表中
                    pm.setPatid(patArchives.get(0).getId());
                }
            }
            if (patMedInhospList != null && !patMedInhospList.isEmpty()) {
                patMedInhospMapper.insertPatMedInhospBatch(patMedInhospList);
            }
        }
        return null;
        return 0;
    }
    @Override
    public Integer selectPatMedOuthospList(PatMedOuthosp patMedOuthosp) {
        List<PatMedOuthosp> patMedOuthosps = hnGatherPatArchiveMapper.selectPatMedOuthospList(patMedOuthosp);
        log.info("selectPatMedOuthospList的采集到的数量为:{}", patMedOuthosps.size());
        int i = patMedOuthospMapper.batchPatMedOuthosp(patMedOuthosps);
        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 {
                patArchiveMapper.insertPatArchiveSingle(patArchives.get(0));
                patMedOuthosp1.setPatid(patArchives.get(0).getId());
            }
            i = patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp1);
        }
        return i;
    }
@@ -138,6 +147,33 @@
        List<SysUser> 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<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;
    }
@@ -148,5 +184,35 @@
        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);
        }
    }
}