From 35c4634d4f146e286a852307dd179604276f8042 Mon Sep 17 00:00:00 2001 From: wyb <1977763549@qq.com> Date: Mon, 30 Dec 2024 13:58:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=84=E7=90=86=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SyncBasicDataController.java | 18 + .../com/docus/demo/dto/BasicChooseDto.java | 32 ++ .../com/docus/demo/entity/ScanAssort.java | 3 + .../demo/facade/ISyncBasicDataService.java | 2 + .../docus/demo/mapper/mysql/BasicMapper.java | 6 + .../demo/mapper/mysql/ScanAssortMapper.java | 4 + .../docus/demo/service/SyncBasicDataImpl.java | 526 +++++++++++++----- .../resources/mapper/mysql/BasicMapper.xml | 28 + .../mapper/mysql/ScanAssortMapper.xml | 36 +- 9 files changed, 525 insertions(+), 130 deletions(-) create mode 100644 src/main/java/com/docus/demo/dto/BasicChooseDto.java diff --git a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java index 4bc8e2e..326cdd1 100644 --- a/src/main/java/com/docus/demo/controller/SyncBasicDataController.java +++ b/src/main/java/com/docus/demo/controller/SyncBasicDataController.java @@ -130,4 +130,22 @@ public class SyncBasicDataController { return CommonResult.failed("保存失败!异常处理" + e.getMessage()); } } + + + + + @ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条") + @GetMapping("/choose") + public CommonResult choose(){ + log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条"); + try { + syncBasicDataService.choose(); + log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,已完成!"); + return CommonResult.success("筛选完成!"); + } catch (Exception ex) { + log.error("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,出现异常!" + ex.getMessage(), ex); + return CommonResult.failed("筛选异常!"); + } + } + } diff --git a/src/main/java/com/docus/demo/dto/BasicChooseDto.java b/src/main/java/com/docus/demo/dto/BasicChooseDto.java new file mode 100644 index 0000000..b8e2ae7 --- /dev/null +++ b/src/main/java/com/docus/demo/dto/BasicChooseDto.java @@ -0,0 +1,32 @@ +package com.docus.demo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author YongBin Wen + * @date 2024/9/6 16:05 + */ +@Data +@ApiModel("基础数据选择处理对象") +public class BasicChooseDto { + @ApiModelProperty("病案主键") + private String patientId; + + @ApiModelProperty("病案号") + private String inpatientNo; + + @ApiModelProperty("患者出院日期 yyyy-MM-dd") + private String disDate; + + @ApiModelProperty("患者姓名") + private String name; + + @ApiModelProperty("患者姓名") + private Integer admissTimes; + + @ApiModelProperty("优先级") + private int priority; + +} diff --git a/src/main/java/com/docus/demo/entity/ScanAssort.java b/src/main/java/com/docus/demo/entity/ScanAssort.java index 132b41c..5351642 100644 --- a/src/main/java/com/docus/demo/entity/ScanAssort.java +++ b/src/main/java/com/docus/demo/entity/ScanAssort.java @@ -49,6 +49,9 @@ public class ScanAssort { @ApiModelProperty(value = "页数") private Integer filePages; + @ApiModelProperty(value = "是否作废,0未作废") + private Integer isDel; + private String creater; private String createrName; diff --git a/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java b/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java index d70d4ba..b5bbceb 100644 --- a/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java +++ b/src/main/java/com/docus/demo/facade/ISyncBasicDataService.java @@ -15,4 +15,6 @@ public interface ISyncBasicDataService { CommonResult syncLzBasicData(SyncBasicDataDto syncBasicDataDto); void scanBasicCorrect(List basicCorrectDtos); + + void choose(); } diff --git a/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java b/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java index 27c9763..dd1fddf 100644 --- a/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java +++ b/src/main/java/com/docus/demo/mapper/mysql/BasicMapper.java @@ -44,4 +44,10 @@ public interface BasicMapper { Boolean delTbasicByAdmissId(@Param("admissId")String admissId); int updateScanBasicCorrect(@Param("oldPatId") String oldBasicPatientId, @Param("newPatId") String newPatientId,@Param("ph") String ph); + + int delTbasic(@Param("pidList") List patientIds); + + List getTbasicByInpatientNo(@Param("inpatientNo") String inpatientNo); + + List getInpatientNos(); } diff --git a/src/main/java/com/docus/demo/mapper/mysql/ScanAssortMapper.java b/src/main/java/com/docus/demo/mapper/mysql/ScanAssortMapper.java index e345976..28f49a1 100644 --- a/src/main/java/com/docus/demo/mapper/mysql/ScanAssortMapper.java +++ b/src/main/java/com/docus/demo/mapper/mysql/ScanAssortMapper.java @@ -33,5 +33,9 @@ public interface ScanAssortMapper { int updatePatientId(@Param("oldPatId") String oldBasicPatientId, @Param("newPatId") String newPatientId); + int updatePatientIdById(@Param("ids") List ids, @Param("newPatId") String newPatientId); + int delScanAssortById(@Param("id") Long id); + + List getListByPids(@Param("pidList") List patientIds); } diff --git a/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java b/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java index 4326a97..ab8301e 100644 --- a/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java +++ b/src/main/java/com/docus/demo/service/SyncBasicDataImpl.java @@ -2,11 +2,14 @@ package com.docus.demo.service; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.docus.demo.dto.BasicChooseDto; import com.docus.demo.dto.BasicCorrectDto; import com.docus.demo.dto.SyncBasicDataDto; import com.docus.demo.entity.CommonResult; +import com.docus.demo.entity.ScanAssort; import com.docus.demo.entity.Tbasic; import com.docus.demo.entity.TbasicSub; import com.docus.demo.entity.sqlserver.CardInfo; @@ -57,45 +60,45 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { //每页1000条数据 List tpatientvisitList; for (int current = 1; ; current++) { - syncBasicDataDto.setStartDate(startDate +" 00:00:00"); - syncBasicDataDto.setEndDate(startDate +" 23:59:59"); + syncBasicDataDto.setStartDate(startDate + " 00:00:00"); + syncBasicDataDto.setEndDate(startDate + " 23:59:59"); - log.info(syncBasicDataDto.getStartDate()+" --- " +syncBasicDataDto.getEndDate()); + log.info(syncBasicDataDto.getStartDate() + " --- " + syncBasicDataDto.getEndDate()); //根据出院时间查询省厅数据 tpatientvisitList = paintVisitMapper.getTpatientVisitList(0, 0, syncBasicDataDto); - if (tpatientvisitList.size() == 0){ + if (tpatientvisitList.size() == 0) { break; } - log.info("开始同步"+tpatientvisitList.size()); + log.info("开始同步" + tpatientvisitList.size()); // tpatientvisitList = paintVisitMapper.getTpatientVisitList((current - 1) * limit, current*limit, syncBasicDataDto); for (Tpatientvisit e : tpatientvisitList) { - if(StrUtil.isNotBlank(e.getFprn())){ + if (StrUtil.isNotBlank(e.getFprn())) { e.setFprn(e.getFprn().toLowerCase(Locale.ROOT)); } } List fprnList = tpatientvisitList.stream().map(Tpatientvisit::getFprn).collect(Collectors.toList()); List ftimesList = tpatientvisitList.stream().map(Tpatientvisit::getFtimes).distinct().collect(Collectors.toList()); - log.info("fprnList"+fprnList.size()+ " ftimesList" +ftimesList.size()); + log.info("fprnList" + fprnList.size() + " ftimesList" + ftimesList.size()); //诊断数据 - List tdiagnoses = paintVisitMapper.getTdiagnose(fprnList,ftimesList); - log.info("tdiagnoses"+tdiagnoses.size()); + List tdiagnoses = paintVisitMapper.getTdiagnose(fprnList, ftimesList); + log.info("tdiagnoses" + tdiagnoses.size()); List toperations = paintVisitMapper.getToperation(fprnList); - log.info("toperations"+toperations.size()); + log.info("toperations" + toperations.size()); //数据map转换 List oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto); - log.info("oldBasicList"+oldBasicList.size()); + log.info("oldBasicList" + oldBasicList.size()); List tbasicList = this.getTbasicList(oldBasicList, tpatientvisitList, tdiagnoses, toperations); - log.info("tbasicList"+tbasicList.size()); + log.info("tbasicList" + tbasicList.size()); List tbasicSubList = this.getTbasicSubList(tbasicList); - log.info("tbasicSubList"+tbasicSubList.size()); + log.info("tbasicSubList" + tbasicSubList.size()); //数据入库 basicDeptService.handleDept(tbasicList); basicMapper.insertOrUpdateByid(tbasicList); basicMapper.insertOrUpdateTbasicSub(tbasicSubList); - log.info("数据库入库"+tbasicList.size() +"子表"+tbasicSubList.size()); + log.info("数据库入库" + tbasicList.size() + "子表" + tbasicSubList.size()); - if (startDate.compareTo(endDate)>0) { + if (startDate.compareTo(endDate) > 0) { break; } startDate = startDate.plusDays(1); @@ -158,16 +161,284 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { } } + + @Override + public void choose() { + int count = 0; + List inpatientNos = basicMapper.getInpatientNos(); + log.info("本次筛选病案号数量为:{}", inpatientNos.size()); + for (String inpatientNo : inpatientNos) { + choose(inpatientNo); + count++; + log.info("已经筛选病案号:{} 个", count); + } + log.info("本次筛选完成!"); + } + + /** + * 根据 病案号、姓名、出院日期、住院次数 判断是同一个人,进行数据筛选。 + * 有盘号/箱号 优先级 +10 + * 如果有现场扫描文件数据 优先级 +4。 + * 如果有联众文件数据 优先级 +3。 + * 文件数量更多的,判断现场和联众 现场多优先级 +2 ,联众多优先级 +1。 + * 根据最后优先级选择最高的,如果有相同选择,随机挑选一条。 + * 文件数据合并到选择的患者(选择的患者没有的文件来源随机挑选一个患者)。 + * 未被选择的删除基础信息。 + */ + private void choose(String inpatientNo) { + List basicList = basicMapper.getTbasicByInpatientNo(inpatientNo); + if (basicList.size() == 1) { + return; + } + Map> group = new HashMap<>(); + for (Tbasic tbasic : basicList) { + String groupKey = tbasic.getInpatientNo() + "_" + tbasic.getName() + "_" + DateUtil.formatDate(tbasic.getDisDate()) + "_" + tbasic.getAdmissTimes(); + List groupOrDefault = group.getOrDefault(groupKey, new ArrayList<>()); + groupOrDefault.add(tbasic); + group.put(groupKey, groupOrDefault); + } + + Set>> entries = group.entrySet(); + for (Map.Entry> entry : entries) { + List value = entry.getValue(); + if (value.size() <= 1) { + continue; + } + groupChoose(value); + } + } + + /** + * 根据重复数据已经分组进行处理 + */ + private void groupChoose(List basicList) { + if (basicList.size() <= 1) { + return; + } + + List chooseDtoList = new ArrayList<>(); + for (Tbasic basic : basicList) { + BasicChooseDto chooseDto = new BasicChooseDto(); + chooseDto.setPatientId(basic.getPatientId()); + chooseDto.setName(basic.getName()); + chooseDto.setInpatientNo(basic.getInpatientNo()); + chooseDto.setAdmissTimes(basic.getAdmissTimes()); + chooseDto.setDisDate(DateUtil.formatDate(basic.getDisDate())); + if (StrUtil.isBlank(basic.getPh())) { + chooseDto.setPriority(0); + } else { + chooseDto.setPriority(10); + } + chooseDtoList.add(chooseDto); + } + if (judgeAndProcess(chooseDtoList)) { + return; + } + + Map>> groupByPatientGroupBySource = new HashMap<>(10); + for (BasicChooseDto basicChooseDto : chooseDtoList) { + List assorts = scanAssortMapper.getListByPid(basicChooseDto.getPatientId()); + assorts = assorts.stream().filter(f -> { + if (f.getSource() == null) { + f.setSource("unknow"); + } + Integer del = 1; + return ObjectUtil.notEqual(del, f.getIsDel()); + }).collect(Collectors.toList()); + if (CollUtil.isEmpty(assorts)) { + continue; + } + Map> groupBySource = assorts.stream().collect(Collectors.groupingBy(ScanAssort::getSource)); + if (groupBySource.containsKey("-1")) { + basicChooseDto.setPriority(basicChooseDto.getPriority() + 4); + } + if (groupBySource.containsKey("lianzhong")) { + basicChooseDto.setPriority(basicChooseDto.getPriority() + 3); + } + groupByPatientGroupBySource.put(basicChooseDto.getPatientId(), groupBySource); + } + if (judgeAndProcess(chooseDtoList)) { + return; + } + + int siteMaxSize = 0; + int lianzhongMaxSize = 0; + HashMap> siteFileCountMap = new HashMap<>(); + HashMap> lianzhongFileCountMap = new HashMap<>(); + for (BasicChooseDto chooseDto : chooseDtoList) { + Map> groupBySource = groupByPatientGroupBySource.getOrDefault(chooseDto.getPatientId(), new HashMap<>()); + + List siteScan = groupBySource.getOrDefault("-1", new ArrayList<>()); + int siteSize = siteScan.size(); + List lianzhong = groupBySource.getOrDefault("lianzhong", new ArrayList<>()); + int lianzhongSize = lianzhong.size(); + + List siteGroup = siteFileCountMap.getOrDefault(siteSize, new ArrayList<>()); + siteGroup.add(chooseDto); + List lianzhongGroup = lianzhongFileCountMap.getOrDefault(lianzhongSize, new ArrayList<>()); + lianzhongGroup.add(chooseDto); + + siteFileCountMap.put(siteSize, siteGroup); + lianzhongFileCountMap.put(lianzhongSize, lianzhongGroup); + + siteMaxSize = Math.max(siteMaxSize, siteSize); + lianzhongMaxSize = Math.max(lianzhongMaxSize, lianzhongSize); + } + List siteCountChoose = siteFileCountMap.get(siteMaxSize); + List lianzhongCountChoose = lianzhongFileCountMap.get(lianzhongMaxSize); + for (BasicChooseDto dto : siteCountChoose) { + dto.setPriority(dto.getPriority() + 2); + } + for (BasicChooseDto dto : lianzhongCountChoose) { + dto.setPriority(dto.getPriority() + 1); + } + // 最后无需再判定,直接取最大优先权中的一条 + processSelection(chooseDtoList, electedOneData(chooseDtoList)); + } + + /** + * 判定选择并且处理 + * + * @return 如果已经选择且处理 返回true + */ + private boolean judgeAndProcess(List chooseDtoList) { + if (elected(chooseDtoList) && electedOne(chooseDtoList)) { + processSelection(chooseDtoList, electedOneData(chooseDtoList)); + return true; + } + return false; + } + + /** + * 处理选择后的逻辑, + * 文件数据合并到选择的患者(选择的患者没有的文件来源随机挑选一个患者)。 + * 未被选择的删除基础信息。 + * + * @param chooseDtoList 选择的集合 + * @param finalElected 最终的选择数据 + */ + private void processSelection(List chooseDtoList, BasicChooseDto finalElected) { + String selectPatientId = finalElected.getPatientId(); + List allPatientIds = chooseDtoList.stream().map(BasicChooseDto::getPatientId).collect(Collectors.toList()); + List allScanAssorts = scanAssortMapper.getListByPids(allPatientIds); + allScanAssorts = allScanAssorts.stream().filter(f -> { + if (f.getSource() == null) { + f.setSource("unknow"); + } + Integer del = 1; + return ObjectUtil.notEqual(del, f.getIsDel()); + }).collect(Collectors.toList()); + + if (CollUtil.isEmpty(allScanAssorts)) { + return; + } + + Set allSources = allScanAssorts.stream().map(ScanAssort::getSource).collect(Collectors.toSet()); + Set selectPatientSources = allScanAssorts.stream() + .filter(e -> ObjectUtil.equals(selectPatientId, e.getPatientId())) + .map(ScanAssort::getSource) + .collect(Collectors.toSet()); + + for (String source : allSources) { + if (selectPatientSources.contains(source)) { + continue; + } + transferScanAssortBySource(allScanAssorts, selectPatientId, source); + selectPatientSources.add(source); + } + + List notSelectedPids = allPatientIds.stream().filter(e -> !e.equals(selectPatientId)).collect(Collectors.toList()); + basicMapper.delTbasic(notSelectedPids); + for (String notSelectedPid : notSelectedPids) { + basicMapper.delTbasicSub(notSelectedPid); + } + + } + + /** + * 文件数据合并到选择的患者(选择的患者没有的文件来源随机挑选一个患者)。 + * + * @param allScanAssorts 所有的文件数据 + * @param selectPatientId 选择的患者主键 + * @param source 来源 + */ + private void transferScanAssortBySource(List allScanAssorts, String selectPatientId, String source) { + // 选择该来源的其他患者中这个来源数量最多的 + Map> groupByPatient = allScanAssorts.stream() + .filter(e -> !ObjectUtil.equals(selectPatientId, e.getPatientId()) && ObjectUtil.equals(source, e.getSource())) + .collect(Collectors.groupingBy(ScanAssort::getPatientId)); + int maxSize = 0; + String maxSizePatient = null; + Set>> entries = groupByPatient.entrySet(); + for (Map.Entry> entry : entries) { + List assorts = entry.getValue(); + int size = assorts.size(); + if (size > maxSize) { + maxSize = size; + maxSizePatient = assorts.get(0).getPatientId(); + } + } + List updateScanAssort = groupByPatient.get(maxSizePatient); + List updateScanAssortIds = updateScanAssort.stream() + .map(ScanAssort::getId) + .collect(Collectors.toList()); + scanAssortMapper.updatePatientIdById(updateScanAssortIds, selectPatientId); + } + + /** + * 是否已经有选举,判定集合中是否已经有优先级大于0的数据 + */ + private boolean elected(List chooseDtoList) { + for (BasicChooseDto dto : chooseDtoList) { + if (dto.getPriority() > 0) { + return true; + } + } + return false; + } + + /** + * 只存在一条选举,判定集合中优先级最大的只有一条 + */ + private boolean electedOne(List chooseDtoList) { + List list = electedMaxPriorityData(chooseDtoList); + return list.size() == 1; + } + + /** + * 从最大选举权的数据选择一条 + */ + private BasicChooseDto electedOneData(List chooseDtoList) { + List list = electedMaxPriorityData(chooseDtoList); + return list.get(0); + } + + /** + * 取得最大选举权的集合 + */ + private List electedMaxPriorityData(List chooseDtoList) { + Map> groupByPriority = chooseDtoList.stream() + .collect(Collectors.groupingBy(BasicChooseDto::getPriority)); + int maxPriority = 0; + for (BasicChooseDto chooseDto : chooseDtoList) { + int priority = chooseDto.getPriority(); + maxPriority = Math.max(priority, maxPriority); + } + return groupByPriority.get(maxPriority); + } + + public static void main(String[] args) { LocalDate startDate = LocalDate.parse("2024-05-06"); System.out.println(startDate); } + private List getTbasicSubList(List tbasicList) { - return tbasicList.stream().map(m->{ + return tbasicList.stream().map(m -> { TbasicSub tbasicSub = new TbasicSub(); tbasicSub.setBirthday(m.getBirthday()); tbasicSub.setPatientId(m.getPatientId()); - return tbasicSub; + return tbasicSub; }).collect(Collectors.toList()); } @@ -177,83 +448,83 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { // 根据病案号 住院次数 名称 做去重判断 return tpatientvisitList.stream().map(m -> { - Tbasic oldBasic = oldBasicList.stream() - .filter(old -> ObjectUtil.equal(m.getFprn(), old.getInpatientNo().toLowerCase(Locale.ROOT)) - && ObjectUtil.equal(m.getFtimes(), old.getAdmissTimes()) - && ObjectUtil.equal(m.getFname(), old.getName()) - && sdf.format(m.getFcydate()).equals(sdf.format(old.getDisDate())) - ) - .findFirst() - .orElse(null); - - - String fprn = m.getFprn(); - Integer ftimes = m.getFtimes(); - - Tdiagnose tdiagnose = tdiagnoses.stream() - .filter(f -> ObjectUtil.equal(f.getFprn(), fprn) - && ObjectUtil.equal(f.getFtimes(), ftimes) - && ObjectUtil.equal(f.getFzdlx(), "1") - ) - .findFirst() - .orElse(null); - - Toperation toperation = toperations.stream() - .filter(f -> ObjectUtil.equal(f.getFprn(), fprn) - && ObjectUtil.equal(f.getFtimes(), ftimes) - && ObjectUtil.equal(f.getFpx(), 1L) - ) - .findFirst() - .orElse(null); - - Tbasic tbasic = new Tbasic(); - if (oldBasic!=null){ - tbasic.setPatientId(oldBasic.getPatientId()); - }else { - tbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId())); - } - tbasic.setAdmissTimes(m.getFtimes()); - tbasic.setInpatientNo(m.getFprn()); - tbasic.setName(m.getFname()); - tbasic.setSex(m.getFsexbh()); - tbasic.setSexName(m.getFsex()); - if (m.getFage().contains("Y")){ - tbasic.setAge(Integer.valueOf(m.getFage().split("Y")[1])); - }else if (m.getFage().contains("M")){ - tbasic.setAgeMonth(Integer.valueOf(m.getFage().split("M")[1])); - }else if (m.getFage().contains("D")){ - tbasic.setAgeDay(Integer.valueOf(m.getFage().split("D")[1])); - } + Tbasic oldBasic = oldBasicList.stream() + .filter(old -> ObjectUtil.equal(m.getFprn(), old.getInpatientNo().toLowerCase(Locale.ROOT)) + && ObjectUtil.equal(m.getFtimes(), old.getAdmissTimes()) + && ObjectUtil.equal(m.getFname(), old.getName()) + && sdf.format(m.getFcydate()).equals(sdf.format(old.getDisDate())) + ) + .findFirst() + .orElse(null); - tbasic.setIdCard(m.getFidcard()); - tbasic.setTelphone(""); - tbasic.setAdmissDate(m.getFrydate()); - tbasic.setAdmissDept(m.getFrytykh()); - tbasic.setAdmissDeptName(m.getFrydept()); - tbasic.setDisDate(m.getFcydate()); - tbasic.setDisDept(m.getFcytykh()); - tbasic.setDisDeptName(m.getFcydept()); - tbasic.setAdmissDays(m.getFdays()); - tbasic.setAttending(m.getFzzdoctbh()); - tbasic.setAttendingName(m.getFzzdoct()); - tbasic.setBirthday(m.getFbirthday()); - if (tdiagnose != null) { - tbasic.setMainDiagCode(tdiagnose.getFicdm()); - tbasic.setMainDiagName(tdiagnose.getFjbname()); - } - if (toperation != null) { - tbasic.setMainOperateCode(toperation.getFopcode()); - tbasic.setMainOperateName(toperation.getFop()); - } + + String fprn = m.getFprn(); + Integer ftimes = m.getFtimes(); + + Tdiagnose tdiagnose = tdiagnoses.stream() + .filter(f -> ObjectUtil.equal(f.getFprn(), fprn) + && ObjectUtil.equal(f.getFtimes(), ftimes) + && ObjectUtil.equal(f.getFzdlx(), "1") + ) + .findFirst() + .orElse(null); + + Toperation toperation = toperations.stream() + .filter(f -> ObjectUtil.equal(f.getFprn(), fprn) + && ObjectUtil.equal(f.getFtimes(), ftimes) + && ObjectUtil.equal(f.getFpx(), 1L) + ) + .findFirst() + .orElse(null); + + Tbasic tbasic = new Tbasic(); + if (oldBasic != null) { + tbasic.setPatientId(oldBasic.getPatientId()); + } else { + tbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId())); + } + tbasic.setAdmissTimes(m.getFtimes()); + tbasic.setInpatientNo(m.getFprn()); + tbasic.setName(m.getFname()); + tbasic.setSex(m.getFsexbh()); + tbasic.setSexName(m.getFsex()); + if (m.getFage().contains("Y")) { + tbasic.setAge(Integer.valueOf(m.getFage().split("Y")[1])); + } else if (m.getFage().contains("M")) { + tbasic.setAgeMonth(Integer.valueOf(m.getFage().split("M")[1])); + } else if (m.getFage().contains("D")) { + tbasic.setAgeDay(Integer.valueOf(m.getFage().split("D")[1])); + } + + tbasic.setIdCard(m.getFidcard()); + tbasic.setTelphone(""); + tbasic.setAdmissDate(m.getFrydate()); + tbasic.setAdmissDept(m.getFrytykh()); + tbasic.setAdmissDeptName(m.getFrydept()); + tbasic.setDisDate(m.getFcydate()); + tbasic.setDisDept(m.getFcytykh()); + tbasic.setDisDeptName(m.getFcydept()); + tbasic.setAdmissDays(m.getFdays()); + tbasic.setAttending(m.getFzzdoctbh()); + tbasic.setAttendingName(m.getFzzdoct()); + tbasic.setBirthday(m.getFbirthday()); + if (tdiagnose != null) { + tbasic.setMainDiagCode(tdiagnose.getFicdm()); + tbasic.setMainDiagName(tdiagnose.getFjbname()); + } + if (toperation != null) { + tbasic.setMainOperateCode(toperation.getFopcode()); + tbasic.setMainOperateName(toperation.getFop()); + } // tbasic.setIsDead(m.getFbody()); - tbasic.setCreateTime(new Date()); - tbasic.setSexName(m.getFsex()); - tbasic.setArchiveFileStorageType(2); - tbasic.setScanUploadState(0); - tbasic.setIsArchive(1); - tbasic.setFileSource(3); - return tbasic; - }).collect(Collectors.toList()); + tbasic.setCreateTime(new Date()); + tbasic.setSexName(m.getFsex()); + tbasic.setArchiveFileStorageType(2); + tbasic.setScanUploadState(0); + tbasic.setIsArchive(1); + tbasic.setFileSource(3); + return tbasic; + }).collect(Collectors.toList()); } @@ -261,45 +532,45 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { public CommonResult syncLzBasicData(SyncBasicDataDto syncBasicDataDto) { // executor.execute(()->{ - //页码 - int current; - //每页1000条数据 - int limit = syncBasicDataDto.getLimit(); - List cardInfoList; - for (current = 1; ; current++) { - cardInfoList = tcardMapper.getCardInfo((current - 1) * limit, current * limit, syncBasicDataDto); - if (null == cardInfoList || cardInfoList.size() == 0) { - break; + //页码 + int current; + //每页1000条数据 + int limit = syncBasicDataDto.getLimit(); + List cardInfoList; + for (current = 1; ; current++) { + cardInfoList = tcardMapper.getCardInfo((current - 1) * limit, current * limit, syncBasicDataDto); + if (null == cardInfoList || cardInfoList.size() == 0) { + break; + } + log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "开始同步" + cardInfoList.size()); + for (CardInfo e : cardInfoList) { + if (StrUtil.isNotBlank(e.getPatNo())) { + e.setPatNo(e.getPatNo().toLowerCase(Locale.ROOT)); } - log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "开始同步" + cardInfoList.size()); - for (CardInfo e : cardInfoList) { - if(StrUtil.isNotBlank(e.getPatNo())){ - e.setPatNo(e.getPatNo().toLowerCase(Locale.ROOT)); - } - if (e.getPatNum()==null) { - e.setPatNum(0); - } + if (e.getPatNum() == null) { + e.setPatNum(0); } - List fprnList = cardInfoList.stream().map(CardInfo::getPatNo).collect(Collectors.toList()); - //数据map转换 - List oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto); - log.info("获取到旧数据"+oldBasicList.size()); - List tbasicList = this.getInsertTbasic(oldBasicList, cardInfoList); - if (ObjectUtil.isNotEmpty(tbasicList)) { - //判断数据量 如果文件数据大于五百条 需要做拆分分批次插入 - int batchSize = 1000; - // 拆分列表 - for (int i = 0; i < tbasicList.size(); i += batchSize) { - int endIndex = Math.min(i + batchSize, tbasicList.size()); - List sublist = tbasicList.subList(i, endIndex); - basicDeptService.handleDept(tbasicList); - //数据入库 - basicMapper.insertOrUpdateByid(sublist); - log.info("数据入库"+sublist.size()); - } + } + List fprnList = cardInfoList.stream().map(CardInfo::getPatNo).collect(Collectors.toList()); + //数据map转换 + List oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto); + log.info("获取到旧数据" + oldBasicList.size()); + List tbasicList = this.getInsertTbasic(oldBasicList, cardInfoList); + if (ObjectUtil.isNotEmpty(tbasicList)) { + //判断数据量 如果文件数据大于五百条 需要做拆分分批次插入 + int batchSize = 1000; + // 拆分列表 + for (int i = 0; i < tbasicList.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, tbasicList.size()); + List sublist = tbasicList.subList(i, endIndex); + basicDeptService.handleDept(tbasicList); + //数据入库 + basicMapper.insertOrUpdateByid(sublist); + log.info("数据入库" + sublist.size()); } } - log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "结束同步" ); + } + log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "结束同步"); // }); @@ -307,7 +578,6 @@ public class SyncBasicDataImpl implements ISyncBasicDataService { } - private List getInsertTbasic(List oldBasicList, List cardInfoList) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List cardInfos = cardInfoList.stream().filter(f -> { diff --git a/src/main/resources/mapper/mysql/BasicMapper.xml b/src/main/resources/mapper/mysql/BasicMapper.xml index 8b6ac01..7832e34 100644 --- a/src/main/resources/mapper/mysql/BasicMapper.xml +++ b/src/main/resources/mapper/mysql/BasicMapper.xml @@ -80,6 +80,13 @@ delete from docus_medicalrecord.t_basic_sub where patient_id=#{patientId} + + delete from docus_medicalrecord.t_basic + where patient_id in + + #{pid} + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/mysql/ScanAssortMapper.xml b/src/main/resources/mapper/mysql/ScanAssortMapper.xml index 7c33b4b..4b99dde 100644 --- a/src/main/resources/mapper/mysql/ScanAssortMapper.xml +++ b/src/main/resources/mapper/mysql/ScanAssortMapper.xml @@ -47,6 +47,13 @@ update docus_archivefile.t_scan_assort set patient_id=#{newPatId} where patient_id=#{oldPatId} + + update docus_archivefile.t_scan_assort set patient_id=#{newPatId} + where id in + + #{id} + + delete FROM docus_archivefile.t_scan_assort where patient_id in @@ -74,7 +81,9 @@ file_pages, creater, create_time, - sort + sort, + is_del, + source FROM docus_archivefile.t_scan_assort WHERE patient_id = #{pid} @@ -90,7 +99,9 @@ file_pages, creater, create_time, - sort + sort, + is_del, + source FROM docus_archivefile.t_scan_assort WHERE assort_id = #{assortId} and patient_id = #{pid} and source='jy' @@ -98,5 +109,26 @@ + \ No newline at end of file