diff --git a/data-config/job-config/ViewPatientInfoSyncJob.json b/data-config/job-config/ViewPatientInfoSyncJob.json index f978a92..c13412c 100644 --- a/data-config/job-config/ViewPatientInfoSyncJob.json +++ b/data-config/job-config/ViewPatientInfoSyncJob.json @@ -1 +1,4 @@ -{"startDate": "2024-01-01"} \ No newline at end of file +{ "startDate": "2024-01-01", + "startTime": "2020-01-01 00:00:00", + "cyrqStart": "2020-01-01 00:00:00" +} diff --git a/src/main/java/com/docus/server/archive/converter/MzsyPatientInfoConverter.java b/src/main/java/com/docus/server/archive/converter/MzsyPatientInfoConverter.java new file mode 100644 index 0000000..d58e201 --- /dev/null +++ b/src/main/java/com/docus/server/archive/converter/MzsyPatientInfoConverter.java @@ -0,0 +1,69 @@ +package com.docus.server.archive.converter; + +import com.docus.server.archive.entity.TBasic; +import com.docus.server.archive.utils.PinYinUtil; +import com.docus.server.mzsy.entity.MzsyPatientInfoView; + +public class MzsyPatientInfoConverter { + public static TBasic convertPatientInfo(MzsyPatientInfoView view) { + if (view == null) { + return null; + } + + TBasic tBasic = new TBasic(); + tBasic.setJzh(view.getJZH()); + tBasic.setInpatientNo(view.getZYH()); + tBasic.setAdmissTimes(view.getZYCS()); + tBasic.setName(view.getXM()); + tBasic.setNameSpell(getPinyinFirstSpell(view.getXM())); + tBasic.setSex(getSexCodeBySex(view.getXB())); + tBasic.setSexName(getSexNameBySex(view.getXB())); + tBasic.setAdmissDate(view.getRYRQ()); + tBasic.setAdmissDept(view.getRYBQ()); + tBasic.setAdmissDeptName(view.getRYKS()); + tBasic.setBedNo(view.getCWDM()); + tBasic.setAttending(view.getDQYS()); + tBasic.setAge(view.getNL()); + tBasic.setAgeMonth(0); + tBasic.setAgeDay(0); + tBasic.setIdCard(view.getSFZH()); + tBasic.setTelphone(view.getLXDH()); + tBasic.setDisDate(view.getCYRQ()); + tBasic.setDisDept(view.getCYBQ()); + tBasic.setDisDeptName(view.getCYKS()); + tBasic.setAdmissDays(view.getZYTS()); + tBasic.setTotalCost(view.getZJINE()); + tBasic.setIsDead(view.getSFSW()); + tBasic.setFileSource(1); + tBasic.setLeaveMethod(view.getCYQK()); + return tBasic; + } + + public static String getPinyinFirstSpell(String str) { + try { + return PinYinUtil.getFirstSpell(str); + } catch (Exception ex) { + return null; + } + } + + public static String getSexCodeBySex(String sexName) { + if ("M".equals(sexName)) { + return "1"; + } + if ("F".equals(sexName)) { + return "2"; + } + return null; + } + + public static String getSexNameBySex(String sexName) { + if ("M".equals(sexName)) { + return "男"; + } + if ("F".equals(sexName)) { + return "女"; + } + return null; + } +} diff --git a/src/main/java/com/docus/server/archive/entity/TBasic.java b/src/main/java/com/docus/server/archive/entity/TBasic.java index d276c50..fc6016a 100644 --- a/src/main/java/com/docus/server/archive/entity/TBasic.java +++ b/src/main/java/com/docus/server/archive/entity/TBasic.java @@ -113,4 +113,9 @@ public class TBasic implements Serializable { @ApiModelProperty(value = "数据来源 1:需质控归档") private Integer fileSource; + @ApiModelProperty(value = "实际住院天数") + private Integer admissDays; + + @ApiModelProperty(value = "离院方式代码") + private Integer leaveMethod; } diff --git a/src/main/java/com/docus/server/archive/job/PatientInfoSyncJob.java b/src/main/java/com/docus/server/archive/job/PatientInfoSyncJob.java index e55dd98..67003b3 100644 --- a/src/main/java/com/docus/server/archive/job/PatientInfoSyncJob.java +++ b/src/main/java/com/docus/server/archive/job/PatientInfoSyncJob.java @@ -1,5 +1,6 @@ package com.docus.server.archive.job; +import com.docus.core.util.DateUtil; import com.docus.core.util.Func; import com.docus.infrastructure.core.utils.TableJsonRead; import com.docus.server.archive.config.DocusProperties; @@ -64,8 +65,40 @@ public class PatientInfoSyncJob { } + @XxlJob("MzsyPatientInfoSyncByModifyTimeJob") + public void mzsyPatientInfoSyncByModifyTimeJob() { + String syncServicePrefix = docusProperties.getSyncServicePrefix(); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> {} 患者基础数据按照最后修改时间同步开始了!", syncServicePrefix); + String serviceName = syncServicePrefix + SyncConstant.PATIENT_INFO_SYNC_SERVICE_SUFFIX; + PatientInfoSyncService patientInfoSyncService = patientInfoSyncServiceMap.get(serviceName); + if (patientInfoSyncService == null) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 患者基础数据同步服务 {} 未找到!", serviceName); + return; + } + String jobConfigPath = "data-config\\job-config"; + String jobConfigName = "ViewPatientInfoSyncJob.json"; + TableJsonRead jsonReader = new TableJsonRead(); + PatientInfoSyncJobConfig syncJobConfig = jsonReader.Read(jobConfigPath, jobConfigName, PatientInfoSyncJobConfig.class); + syncJobConfig = PatientInfoSyncJobConfig.checkAndInit(syncJobConfig); + String cyrqStart = syncJobConfig.getCyrqStart(); + String startTime = syncJobConfig.getStartTime(); + String now = DateUtil.format(DateUtil.now(),DateUtil.PATTERN_DATETIME); + try { + patientInfoSyncService.syncByModifyTimeAndCyrq(cyrqStart,startTime); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> {} 患者基础数据按照最后修改时间 {} 同步结束了!", syncServicePrefix, startTime); + syncJobConfig.setStartTime(now); + jsonReader.Save(jobConfigPath, jobConfigName, Func.toJson(syncJobConfig)); + } catch (Exception ex) { + log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> " + syncServicePrefix + " 患者基础数据按照最后修改时间 " + startTime + " 出现异常!" + ex.getMessage(), ex); + } + + } + + private static class PatientInfoSyncJobConfig { private String startDate; + private String startTime; + private String cyrqStart; public static PatientInfoSyncJobConfig checkAndInit(PatientInfoSyncJobConfig jobConfig) { @@ -85,5 +118,17 @@ public class PatientInfoSyncJob { public void setStartDate(String startDate) { this.startDate = startDate; } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getCyrqStart() { + return cyrqStart; + } } } diff --git a/src/main/java/com/docus/server/archive/mapper/TBasicMapper.java b/src/main/java/com/docus/server/archive/mapper/TBasicMapper.java index 4b54005..2a4aa8a 100644 --- a/src/main/java/com/docus/server/archive/mapper/TBasicMapper.java +++ b/src/main/java/com/docus/server/archive/mapper/TBasicMapper.java @@ -21,4 +21,7 @@ public interface TBasicMapper { int insertBatch(@Param("basicList") List basicList); int updateBatch(@Param("basicList") List updateList); + + int updateExtend(@Param("basicList") List basicList); + } diff --git a/src/main/java/com/docus/server/archive/service/PatientInfoSyncService.java b/src/main/java/com/docus/server/archive/service/PatientInfoSyncService.java index bd36567..d656d86 100644 --- a/src/main/java/com/docus/server/archive/service/PatientInfoSyncService.java +++ b/src/main/java/com/docus/server/archive/service/PatientInfoSyncService.java @@ -26,4 +26,13 @@ public interface PatientInfoSyncService { * @author YongBin Wen */ void syncByModifyTime(LocalDateTime start, LocalDateTime end); + + /** + * 根据最后修改时间和出院开始时间同步 + * + * @param cyrqStart 出院开始时间 + * @param startTime 最后修改时间 + */ + void syncByModifyTimeAndCyrq(String cyrqStart,String startTime); + } diff --git a/src/main/java/com/docus/server/archive/service/impl/MzsyPatientInfoSyncServiceImpl.java b/src/main/java/com/docus/server/archive/service/impl/MzsyPatientInfoSyncServiceImpl.java new file mode 100644 index 0000000..3eb128f --- /dev/null +++ b/src/main/java/com/docus/server/archive/service/impl/MzsyPatientInfoSyncServiceImpl.java @@ -0,0 +1,134 @@ +package com.docus.server.archive.service.impl; + +import com.docus.core.util.Func; +import com.docus.core.util.ObjectUtil; +import com.docus.infrastructure.redis.service.IdService; +import com.docus.server.archive.constans.SyncConstant; +import com.docus.server.archive.converter.MzsyPatientInfoConverter; +import com.docus.server.archive.entity.TBasic; +import com.docus.server.archive.mapper.TBasicMapper; +import com.docus.server.archive.service.PatientInfoSyncService; +import com.docus.server.mzsy.entity.MzsyPatientInfoView; +import com.docus.server.mzsy.mapper.MzsyPatientInfoViewMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + + +@Service("Mzsy" + SyncConstant.PATIENT_INFO_SYNC_SERVICE_SUFFIX) +@Slf4j +public class MzsyPatientInfoSyncServiceImpl implements PatientInfoSyncService { + @Resource + private TBasicMapper tBasicMapper; + @Resource + private MzsyPatientInfoViewMapper mzsyPatientInfoViewMapper; + @Resource + private IdService idService; + + @Override + public void syncByDisDate(LocalDateTime start, LocalDateTime end) { + log.error("梅州三院未开发按照出院时间同步患者基础数据!"); + } + + @Override + public void syncByModifyTime(LocalDateTime start, LocalDateTime end) { + log.error("梅州三院未开发按照修改时间同步患者基础数据!"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncByModifyTimeAndCyrq(String cyrqStart, String startTime) { + int size = 1000; + int pageNumber = 1; + while (true) { + List patientInfoViews = mzsyPatientInfoViewMapper.pageByViwe(cyrqStart, startTime, pageNumber, size); + if (Func.isNotEmpty(patientInfoViews)) { + List basicList = patientInfoViews.stream() + .map(MzsyPatientInfoConverter::convertPatientInfo) + .collect(Collectors.toList()); + saveOrUpdate(basicList); + } + if (Func.isEmpty(patientInfoViews) || patientInfoViews.size() < size) { + break; + } + pageNumber++; + } + } + + /** + * + * @param iuBasicList 修改的患者基础信息 + */ + private void saveOrUpdate(List iuBasicList) { + Date nowDate = new Date(); + List iuJzhList1 = iuBasicList.stream() + .map(TBasic::getJzh) + .collect(Collectors.toList()); + List iuJzhList = new ArrayList<>(); + iuJzhList.addAll(iuJzhList1); + List existsBasicList = tBasicMapper.getByJzh(iuJzhList); + Map existsJzhBasicMap = existsBasicList.stream().collect(Collectors.toMap(TBasic::getJzh, Function.identity())); + List insertBasicList = new ArrayList<>(); + List updateBasicList = new ArrayList<>(); + List leaveMethodList = new ArrayList<>(); + for (TBasic iuBasic : iuBasicList) { + if (existsJzhBasicMap.containsKey(iuBasic.getJzh())) { + TBasic tBasic = existsJzhBasicMap.get(iuBasic.getJzh()); + tBasic.setName(iuBasic.getName()); + tBasic.setInpatientNo(iuBasic.getInpatientNo()); + tBasic.setAdmissTimes(iuBasic.getAdmissTimes()); + tBasic.setSex(iuBasic.getSex()); + tBasic.setSexName(iuBasic.getSexName()); + tBasic.setNameSpell(iuBasic.getNameSpell()); + tBasic.setJzh(iuBasic.getJzh()); + tBasic.setAdmissDate(iuBasic.getAdmissDate()); + tBasic.setAdmissDept(iuBasic.getAdmissDept()); + tBasic.setAdmissDeptName(iuBasic.getAdmissDeptName()); + tBasic.setBedNo(iuBasic.getBedNo()); + tBasic.setAttending(iuBasic.getAttending()); + tBasic.setAttendingName(iuBasic.getAttendingName()); + tBasic.setAge(iuBasic.getAge()); + tBasic.setAgeMonth(iuBasic.getAgeMonth()); + tBasic.setAgeDay(iuBasic.getAgeDay()); + tBasic.setIdCard(iuBasic.getIdCard()); + tBasic.setTelphone(iuBasic.getTelphone()); + tBasic.setDisDate(iuBasic.getDisDate()); + tBasic.setDisDept(iuBasic.getDisDept()); + tBasic.setDisDeptName(iuBasic.getDisDeptName()); + tBasic.setIsDead(iuBasic.getIsDead()); + tBasic.setTotalCost(iuBasic.getTotalCost()); + tBasic.setFileSource(iuBasic.getFileSource()); + tBasic.setUpdateTime(nowDate); + updateBasicList.add(tBasic); + if(ObjectUtil.isNotEmpty(iuBasic.getLeaveMethod())){ + tBasic.setLeaveMethod(iuBasic.getLeaveMethod()); + leaveMethodList.add(tBasic); + } + continue; + } + iuBasic.setPatientId(String.valueOf(idService.getDateSeq())); + iuBasic.setCreateTime(nowDate); + iuBasic.setUpdateTime(nowDate); + if(ObjectUtil.isNotEmpty(iuBasic.getLeaveMethod())){ + leaveMethodList.add(iuBasic); + } + insertBasicList.add(iuBasic); + } + + if (Func.isNotEmpty(insertBasicList)) { + tBasicMapper.insertBatch(insertBasicList); + } + if (Func.isNotEmpty(updateBasicList)) { + tBasicMapper.updateBatch(updateBasicList); + } + if (Func.isNotEmpty(leaveMethodList)) { + tBasicMapper.updateExtend(leaveMethodList); + } + } +} diff --git a/src/main/java/com/docus/server/archive/service/impl/ZqDyRyPatientInfoSyncServiceImpl.java b/src/main/java/com/docus/server/archive/service/impl/ZqDyRyPatientInfoSyncServiceImpl.java index 9b0e68e..9361a9d 100644 --- a/src/main/java/com/docus/server/archive/service/impl/ZqDyRyPatientInfoSyncServiceImpl.java +++ b/src/main/java/com/docus/server/archive/service/impl/ZqDyRyPatientInfoSyncServiceImpl.java @@ -60,6 +60,11 @@ public class ZqDyRyPatientInfoSyncServiceImpl implements PatientInfoSyncService } } + @Override + public void syncByModifyTimeAndCyrq(String cyrqStart, String startTime) { + log.error("肇庆第一人民医院未开发按照出院时间和修改时间同步患者基础数据!"); + } + /** * 根据修改的患者基础信息,根据JZH查询是否存在,并进行相应数据的修改和新增。注:肇庆之前的jzh模式为 住院号@住院次数 组成,需要用两种方式查询 * diff --git a/src/main/java/com/docus/server/mzsy/entity/MzsyPatientInfoView.java b/src/main/java/com/docus/server/mzsy/entity/MzsyPatientInfoView.java new file mode 100644 index 0000000..5fcf818 --- /dev/null +++ b/src/main/java/com/docus/server/mzsy/entity/MzsyPatientInfoView.java @@ -0,0 +1,56 @@ +package com.docus.server.mzsy.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel("梅州三院患者信息视图") +@Data +public class MzsyPatientInfoView { + @ApiModelProperty("id号码 唯一标识") + private String JZH; + @ApiModelProperty("住院号") + private String ZYH; + @ApiModelProperty("住院次数") + private Integer ZYCS; + @ApiModelProperty("病人姓名") + private String XM; + @ApiModelProperty("性别 M男F女") + private String XB; + @ApiModelProperty("入院时间") + private Date RYRQ; + @ApiModelProperty("入院科室id") + private String RYBQ; + @ApiModelProperty("入院科室") + private String RYKS; + @ApiModelProperty("床位号码") + private String CWDM; + @ApiModelProperty("主治医师编码") + private String DQYS; + @ApiModelProperty("年龄") + private Integer NL; + @ApiModelProperty("身份证件号码") + private String SFZH; + @ApiModelProperty("手机号") + private String LXDH; + @ApiModelProperty("出院时间") + private Date CYRQ; + @ApiModelProperty("出院科室编码") + private String CYBQ; + @ApiModelProperty("出院科室名称") + private String CYKS; + @ApiModelProperty("住院天数") + private Integer ZYTS; + @ApiModelProperty("主要诊断(出院诊断)") + private String ZYZD; + @ApiModelProperty("是否死亡 1死亡 0非死亡") + private Integer SFSW; + @ApiModelProperty("离院方式1.医嘱离院2.医嘱转院3.医嘱转社区卫生服务机构/乡镇卫生院4.非医嘱离院5.死亡6.其他") + private Integer CYQK; + @ApiModelProperty("患者本次住院总费用") + private String ZJINE; + @ApiModelProperty("删除标志(取消出院)0未删除3直接删除") + private Integer BRBZ; +} diff --git a/src/main/java/com/docus/server/mzsy/mapper/MzsyPatientInfoViewMapper.java b/src/main/java/com/docus/server/mzsy/mapper/MzsyPatientInfoViewMapper.java new file mode 100644 index 0000000..00efcc5 --- /dev/null +++ b/src/main/java/com/docus/server/mzsy/mapper/MzsyPatientInfoViewMapper.java @@ -0,0 +1,18 @@ +package com.docus.server.mzsy.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.docus.server.mzsy.entity.MzsyPatientInfoView; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +@DS("mzsy") +public interface MzsyPatientInfoViewMapper { + + + /** + * @return 患者视图数据根据上次同步时间往后查询 + */ + List pageByViwe(@Param("cyrqStart") String cyrqStart,@Param("startTime") String startTime,@Param("pageNum") Integer pageNum, @Param("pageNum") Integer pageSize); +} diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml index 31906bd..61645b9 100644 --- a/src/main/resources/bootstrap.yml +++ b/src/main/resources/bootstrap.yml @@ -33,28 +33,34 @@ spring: test-on-borrow: false test-on-return: false validation-query: select 1 - zqdyry: - url: jdbc:oracle:thin:@10.20.28.15:1521:cdrdb - username: zqry_blgd - password: zqry_blgd666 - driver-class-name: oracle.jdbc.driver.OracleDriver +# zqdyry: +# url: jdbc:oracle:thin:@10.20.28.15:1521:cdrdb +# username: zqry_blgd +# password: zqry_blgd666 +# driver-class-name: oracle.jdbc.driver.OracleDriver +# type: com.alibaba.druid.pool.DruidDataSource +# # 初始化配置 +# initial-size: 3 +# # 最小连接数 +# min-idle: 3 +# # 最大连接数 +# max-active: 10 +# # 获取连接超 时时间 +# max-wait: 5000 +# # 连接有效性检测时间 +# time-between-eviction-runs-millis: 90000 +# # 最大空闲时间 +# min-evictable-idle-time-millis: 1800000 +# test-while-idle: true +# test-on-borrow: false +# test-on-return: false +# validation-query: select 1 from dual + mzsy: + url: jdbc:sqlserver://192.168.0.109:1433;DatabaseName=interface_xmjs + username: xmjs + password: xmjs + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver type: com.alibaba.druid.pool.DruidDataSource - # 初始化配置 - initial-size: 3 - # 最小连接数 - min-idle: 3 - # 最大连接数 - max-active: 10 - # 获取连接超 时时间 - max-wait: 5000 - # 连接有效性检测时间 - time-between-eviction-runs-millis: 90000 - # 最大空闲时间 - min-evictable-idle-time-millis: 1800000 - test-while-idle: true - test-on-borrow: false - test-on-return: false - validation-query: select 1 from dual redis: host: redis.docus.cn password: JSdocus@702 @@ -73,7 +79,7 @@ spring: docus: - sync-service-prefix: ZqDyRy + sync-service-prefix: Mzsy default-user-pwd: fd29cd53ec12616e5f36b77d4afffbff url: # 采集任务补偿地址 diff --git a/src/main/resources/mapper/MzsyPatientInfoViewMapper.xml b/src/main/resources/mapper/MzsyPatientInfoViewMapper.xml new file mode 100644 index 0000000..f96b97c --- /dev/null +++ b/src/main/resources/mapper/MzsyPatientInfoViewMapper.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/src/main/resources/mapper/TBasicMapper.xml b/src/main/resources/mapper/TBasicMapper.xml index 3b75f1b..eae7c43 100644 --- a/src/main/resources/mapper/TBasicMapper.xml +++ b/src/main/resources/mapper/TBasicMapper.xml @@ -12,7 +12,7 @@ `attending`, `attending_name`, `is_dead`,`file_source`, `jzh`,`bed_no`, `jz_card_no`, `total_cost`, - `create_time`, `update_time`) VALUES + `create_time`, `update_time`,`admiss_days`) VALUES ( #{basic.patientId},#{basic.admissTimes},#{basic.inpatientNo},#{basic.name},#{basic.nameSpell}, @@ -22,7 +22,7 @@ #{basic.attending},#{basic.attendingName}, #{basic.isDead},#{basic.fileSource}, #{basic.jzh},#{basic.bedNo},#{basic.jzCardNo},#{basic.totalCost}, - #{basic.createTime},#{basic.updateTime} + #{basic.createTime},#{basic.updateTime},#{basic.admissDays} ) @@ -37,10 +37,21 @@ `attending`= #{basic.attending}, `attending_name`=#{basic.attendingName}, `is_dead`=#{basic.isDead},`file_source`=#{basic.fileSource}, `jzh`= #{basic.jzh},`bed_no`=#{basic.bedNo}, `jz_card_no`=#{basic.jzCardNo}, `total_cost`=#{basic.totalCost}, - `create_time`= #{basic.createTime}, `update_time`=#{basic.updateTime} + `create_time`= #{basic.createTime}, `update_time`=#{basic.updateTime}, + `admiss_days`=#{basic.admissDays} WHERE patient_id= #{basic.patientId}; + + + INSERT INTO `docus_medicalrecord`.`t_basic_extend` + (`patient_id`,leave_method) + VALUES + (#{basic.patientId},#{basic.leaveMethod}) + on DUPLICATE KEY UPDATE + leave_method=#{basic.leaveMethod}; + +