梅州三院基础数据同步

master
宇宙皮皮娃 11 months ago
parent 79464688e8
commit 1945b1fdb1

@ -1 +1,4 @@
{"startDate": "2024-01-01"}
{ "startDate": "2024-01-01",
"startTime": "2020-01-01 00:00:00",
"cyrqStart": "2020-01-01 00:00:00"
}

@ -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;
}
}

@ -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;
}

@ -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;
}
}
}

@ -21,4 +21,7 @@ public interface TBasicMapper {
int insertBatch(@Param("basicList") List<TBasic> basicList);
int updateBatch(@Param("basicList") List<TBasic> updateList);
int updateExtend(@Param("basicList") List<TBasic> basicList);
}

@ -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);
}

@ -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<MzsyPatientInfoView> patientInfoViews = mzsyPatientInfoViewMapper.pageByViwe(cyrqStart, startTime, pageNumber, size);
if (Func.isNotEmpty(patientInfoViews)) {
List<TBasic> 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<TBasic> iuBasicList) {
Date nowDate = new Date();
List<String> iuJzhList1 = iuBasicList.stream()
.map(TBasic::getJzh)
.collect(Collectors.toList());
List<String> iuJzhList = new ArrayList<>();
iuJzhList.addAll(iuJzhList1);
List<TBasic> existsBasicList = tBasicMapper.getByJzh(iuJzhList);
Map<String, TBasic> existsJzhBasicMap = existsBasicList.stream().collect(Collectors.toMap(TBasic::getJzh, Function.identity()));
List<TBasic> insertBasicList = new ArrayList<>();
List<TBasic> updateBasicList = new ArrayList<>();
List<TBasic> 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);
}
}
}

@ -60,6 +60,11 @@ public class ZqDyRyPatientInfoSyncServiceImpl implements PatientInfoSyncService
}
}
@Override
public void syncByModifyTimeAndCyrq(String cyrqStart, String startTime) {
log.error("肇庆第一人民医院未开发按照出院时间和修改时间同步患者基础数据!");
}
/**
* JZHjzh @
*

@ -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;
}

@ -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<MzsyPatientInfoView> pageByViwe(@Param("cyrqStart") String cyrqStart,@Param("startTime") String startTime,@Param("pageNum") Integer pageNum, @Param("pageNum") Integer pageSize);
}

@ -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:
# 采集任务补偿地址

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.mzsy.mapper.MzsyPatientInfoViewMapper">
<select id="pageByViwe" resultType="com.docus.server.mzsy.entity.MzsyPatientInfoView">
SELECT v.*
FROM
(select ROW_NUMBER()over(order by jzh) as ROWNUMBER,* from V_JSWZH_BASE_ZL
where cyrq &gt; #{cyrqStart}
and updated_time &gt; #{startTime}
) AS v
WHERE v.ROWNUMBER BETWEEN ${(pageNum-1)+pageSize+1}
AND ${pageNum*pageSize}
</select>
</mapper>

@ -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
<foreach collection="basicList" separator="," item="basic">
(
#{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}
)
</foreach>
</insert>
@ -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};
</foreach>
</update>
<update id="updateExtend">
<foreach collection="basicList" item="basic">
INSERT INTO `docus_medicalrecord`.`t_basic_extend`
(`patient_id`,leave_method)
VALUES
(#{basic.patientId},#{basic.leaveMethod})
on DUPLICATE KEY UPDATE
leave_method=#{basic.leaveMethod};
</foreach>
</update>
<select id="getByJzh" resultType="com.docus.server.archive.entity.TBasic">
select `patient_id`, `admiss_times`, `inpatient_no`, `name`, `name_spell`,

Loading…
Cancel
Save