|
|
|
@ -14,13 +14,18 @@ import com.docus.demo.mapper.mysql.BasicMapper;
|
|
|
|
|
import com.docus.demo.mapper.sqlserver.TcardMapper;
|
|
|
|
|
import com.docus.demo.mapper.sqlserver1.PaintVisitMapper;
|
|
|
|
|
import com.docus.demo.utils.SnowflakeIdWorker;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
|
import java.util.concurrent.Executors;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Service
|
|
|
|
|
public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
@Autowired
|
|
|
|
@ -31,6 +36,8 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
@Autowired
|
|
|
|
|
private TcardMapper tcardMapper;
|
|
|
|
|
|
|
|
|
|
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
private final ExecutorService executor = Executors.newFixedThreadPool(7);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResult<?> syncBasicData(SyncBasicDataDto syncBasicDataDto) {
|
|
|
|
@ -41,7 +48,7 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
List<Tpatientvisit> tpatientvisitList;
|
|
|
|
|
for (current = 1; ; current++) {
|
|
|
|
|
//根据出院时间查询省厅数据
|
|
|
|
|
tpatientvisitList = paintVisitMapper.getTpatientVisitList((current-1)*limit, limit,syncBasicDataDto);
|
|
|
|
|
tpatientvisitList = paintVisitMapper.getTpatientVisitList((current - 1) * limit, current*limit, syncBasicDataDto);
|
|
|
|
|
if (null == tpatientvisitList || tpatientvisitList.size() == 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -50,8 +57,8 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
List<Tdiagnose> tdiagnoses = paintVisitMapper.getTdiagnose(fprnList);
|
|
|
|
|
List<Toperation> toperations = paintVisitMapper.getToperation(fprnList);
|
|
|
|
|
//数据map转换
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(fprnList,syncBasicDataDto);
|
|
|
|
|
List<Tbasic> tbasicList = this.getTbasicList(oldBasicList,tpatientvisitList,tdiagnoses,toperations);
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto);
|
|
|
|
|
List<Tbasic> tbasicList = this.getTbasicList(oldBasicList, tpatientvisitList, tdiagnoses, toperations);
|
|
|
|
|
//数据入库
|
|
|
|
|
basicMapper.insertOrUpdateByid(tbasicList);
|
|
|
|
|
}
|
|
|
|
@ -59,122 +66,139 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private List<Tbasic> getTbasicList(List<Tbasic> oldBasicList,List<Tpatientvisit> tpatientvisitList, List<Tdiagnose> tdiagnoses, List<Toperation> toperations) {
|
|
|
|
|
private List<Tbasic> getTbasicList(List<Tbasic> oldBasicList, List<Tpatientvisit> tpatientvisitList, List<Tdiagnose> tdiagnoses, List<Toperation> toperations) {
|
|
|
|
|
|
|
|
|
|
return tpatientvisitList.stream()
|
|
|
|
|
.filter(f->{
|
|
|
|
|
// 根据病案号 住院次数 名称 做去重判断
|
|
|
|
|
|
|
|
|
|
return tpatientvisitList.stream().map(m -> {
|
|
|
|
|
Tbasic oldBasic = oldBasicList.stream()
|
|
|
|
|
.filter(old->ObjectUtil.equal(f.getFprn(),old.getInpatientNo())
|
|
|
|
|
&&ObjectUtil.equal(f.getFtimes(),old.getAdmissTimes())
|
|
|
|
|
.filter(old -> ObjectUtil.equal(m.getFprn(), old.getInpatientNo())
|
|
|
|
|
&& ObjectUtil.equal(m.getFtimes(), old.getAdmissTimes())
|
|
|
|
|
&& ObjectUtil.equal(m.getFname(), old.getName())
|
|
|
|
|
)
|
|
|
|
|
.findFirst()
|
|
|
|
|
.orElse(null);
|
|
|
|
|
return oldBasic ==null;
|
|
|
|
|
})
|
|
|
|
|
.map(m->{
|
|
|
|
|
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);
|
|
|
|
|
String fprn = m.getFprn();
|
|
|
|
|
Integer ftimes = m.getFtimes();
|
|
|
|
|
|
|
|
|
|
Tbasic tbasic = new Tbasic();
|
|
|
|
|
tbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId()));
|
|
|
|
|
tbasic.setAdmissTimes(m.getFtimes());
|
|
|
|
|
tbasic.setInpatientNo(m.getFprn());
|
|
|
|
|
tbasic.setName(m.getFname());
|
|
|
|
|
tbasic.setSex(m.getFsex());
|
|
|
|
|
tbasic.setAge(0);
|
|
|
|
|
|
|
|
|
|
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());
|
|
|
|
|
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);
|
|
|
|
|
Tdiagnose tdiagnose = tdiagnoses.stream()
|
|
|
|
|
.filter(f -> ObjectUtil.equal(f.getFprn(), fprn)
|
|
|
|
|
&& ObjectUtil.equal(f.getFtimes(), ftimes)
|
|
|
|
|
&& ObjectUtil.equal(f.getFzdlx(), "1")
|
|
|
|
|
)
|
|
|
|
|
.findFirst()
|
|
|
|
|
.orElse(null);
|
|
|
|
|
|
|
|
|
|
return tbasic;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
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.getFsex());
|
|
|
|
|
tbasic.setAge(0);
|
|
|
|
|
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());
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
return tbasic;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResult<?> syncLzBasicData(SyncBasicDataDto syncBasicDataDto) {
|
|
|
|
|
//页码
|
|
|
|
|
int current;
|
|
|
|
|
//每页1000条数据
|
|
|
|
|
int limit = syncBasicDataDto.getLimit();
|
|
|
|
|
List<CardInfo> cardInfoList;
|
|
|
|
|
for (current = 1; ; current++) {
|
|
|
|
|
cardInfoList = tcardMapper.getCardInfo((current-1)*limit, limit,syncBasicDataDto);
|
|
|
|
|
if (null == cardInfoList || cardInfoList.size() == 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
List<String> fprnList = cardInfoList.stream().map(CardInfo::getPatNo).collect(Collectors.toList());
|
|
|
|
|
//数据map转换
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(fprnList,syncBasicDataDto);
|
|
|
|
|
List<Tbasic> 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<Tbasic> sublist = tbasicList.subList(i, endIndex);
|
|
|
|
|
//数据入库
|
|
|
|
|
basicMapper.insertOrUpdateByid(sublist);
|
|
|
|
|
|
|
|
|
|
executor.execute(()->{
|
|
|
|
|
//页码
|
|
|
|
|
int current;
|
|
|
|
|
//每页1000条数据
|
|
|
|
|
int limit = syncBasicDataDto.getLimit();
|
|
|
|
|
List<CardInfo> 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());
|
|
|
|
|
List<String> fprnList = cardInfoList.stream().map(CardInfo::getPatNo).collect(Collectors.toList());
|
|
|
|
|
//数据map转换
|
|
|
|
|
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto);
|
|
|
|
|
log.info("获取到旧数据"+oldBasicList.size());
|
|
|
|
|
List<Tbasic> 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<Tbasic> sublist = tbasicList.subList(i, endIndex);
|
|
|
|
|
//数据入库
|
|
|
|
|
basicMapper.insertOrUpdateByid(sublist);
|
|
|
|
|
log.info("数据入库"+sublist.size());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "结束同步" );
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return CommonResult.success("同步成功");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<Tbasic> getInsertTbasic(List<Tbasic> oldBasicList, List<CardInfo> cardInfoList) {
|
|
|
|
|
return cardInfoList.stream().filter(f->{
|
|
|
|
|
|
|
|
|
|
List<CardInfo> cardInfos = cardInfoList.stream().filter(f -> {
|
|
|
|
|
//根据病案号 名称 住院次数 出院时间 去重
|
|
|
|
|
String pno = f.getPatNo();
|
|
|
|
|
String name = f.getPatName();
|
|
|
|
|
Integer pNum = f.getPatNum();
|
|
|
|
|
Date date = f.getOutDate();
|
|
|
|
|
Tbasic tbasic = oldBasicList.stream().filter(o->
|
|
|
|
|
ObjectUtil.equal(o.getInpatientNo(),pno)
|
|
|
|
|
&&ObjectUtil.equal(name,o.getName())
|
|
|
|
|
&&ObjectUtil.equal(pNum,o.getAdmissTimes())
|
|
|
|
|
&&ObjectUtil.equal(date,o.getDisDate()))
|
|
|
|
|
|
|
|
|
|
Tbasic tbasic = oldBasicList.stream().filter(o ->
|
|
|
|
|
ObjectUtil.equal(pno, o.getInpatientNo())
|
|
|
|
|
&& ObjectUtil.equal(name, o.getName())
|
|
|
|
|
&& ObjectUtil.equal(pNum, o.getAdmissTimes())
|
|
|
|
|
)
|
|
|
|
|
.findAny()
|
|
|
|
|
.orElse(null);
|
|
|
|
|
return tbasic==null;
|
|
|
|
|
}).map(m->{
|
|
|
|
|
//根据病案号 名称 住院次数 出院时间 去重
|
|
|
|
|
|
|
|
|
|
return tbasic == null;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
List<Tbasic> tbasicList = cardInfos.stream().map(m -> {
|
|
|
|
|
|
|
|
|
|
Tbasic tbasic = new Tbasic();
|
|
|
|
|
tbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId()));
|
|
|
|
|
tbasic.setAdmissTimes(m.getPatNum());
|
|
|
|
@ -194,8 +218,16 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
|
|
|
|
|
tbasic.setMainDiagCode(m.getIcdeCode11());
|
|
|
|
|
tbasic.setMainOperateName(m.getOperName1());
|
|
|
|
|
tbasic.setMainOperateCode(m.getOperIcpm1());
|
|
|
|
|
tbasic.setBColumn5(m.getCuid());
|
|
|
|
|
tbasic.setBColumn8(1);
|
|
|
|
|
tbasic.setIsArchive(1);
|
|
|
|
|
tbasic.setArchiveFileStorageType(2);
|
|
|
|
|
tbasic.setCreateTime(new Date());
|
|
|
|
|
tbasic.setFileSource(2);
|
|
|
|
|
return tbasic;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
return tbasicList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|