improvement: 扫描视图取消住院次数匹配,采用病案号,出院日期,患者姓名 匹配

collector-patient-scan
wyb 2 years ago
parent 5b37537b5a
commit 3c544dae7d

@ -1,6 +1,7 @@
package com.docus.server.collect.controller;
import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.collect.dto.PatientScanConditionDTO;
import com.docus.server.collect.entity.PatientScan;
@ -14,7 +15,10 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
*
@ -32,19 +36,41 @@ public class PatientScanController {
private PatientScanSynchronizer synchronizer;
@PostMapping("/get/byInpatientNoAndTimes")
@ApiOperation("根据住院号和住院次数,进行患者电子病历扫描数据查询,返回需要同步的数据!")
public CommonResult<List<PatientScan>> collectByInpatientNoAndTimes(@RequestBody List<PatientScanConditionDTO> patientScanConditionDTOList) {
@PostMapping("/get/byCondition")
@ApiOperation("根据条件,进行患者电子病历扫描数据查询,返回需要同步的数据!")
public CommonResult<List<PatientScan>> collectBybyCondition(@RequestBody List<PatientScanConditionDTO> patientScanConditionDTOList) {
if (Func.isEmpty(patientScanConditionDTOList)) {
return CommonResult.failed("请输入正确的请求参数!");
}
return CommonResult.success(patientScanService.getScanDataByInpatientNoAndTimes(patientScanConditionDTOList));
checkCondition(patientScanConditionDTOList);
return CommonResult.success(patientScanService.getScanDataByConditions(patientScanConditionDTOList));
}
private static void checkCondition(List<PatientScanConditionDTO> patientScanConditionDTOList) {
String pattern = "yyyy-MM-dd";
try {
for (PatientScanConditionDTO dto : patientScanConditionDTOList) {
Date date = Func.parseDate(dto.getDisDate(), pattern);
Objects.requireNonNull(date);
}
} catch (Exception ex) {
log.error(ex.getMessage(),ex);
throw new BaseException("请正确填入出院日期,格式为 " + pattern);
}
}
public static void main(String[] args) {
PatientScanConditionDTO dto = new PatientScanConditionDTO();
System.out.println(dto);
checkCondition(Collections.singletonList(dto));
System.out.println(dto);
}
@PostMapping("/collect/collectByDisDate")
@ApiOperation("根据出院日期区间同步扫描患者数据 yyyy-MM-dd")
public CommonResult<PatScanSyncResult> collectByInpatientNoAndTimes(@RequestParam String disDateStart, @RequestParam String disDateEnd) {
public CommonResult<PatScanSyncResult> collectByDisDate(@RequestParam String disDateStart, @RequestParam String disDateEnd) {
log.info("根据出院日期区间 {} —— {} 同步扫描患者数据接口。", disDateStart, disDateEnd);
LocalDate disDateStartDate = LocalDate.parse(disDateStart);
LocalDate disDateEndDate = LocalDate.parse(disDateEnd);
@ -77,4 +103,6 @@ public class PatientScanController {
result.setMsg(syncMsgStringBuilder.toString());
return CommonResult.success(result);
}
}

@ -8,6 +8,7 @@ import javax.validation.constraints.NotBlank;
/**
*
*
* @author wyb
*/
@Data
@ -17,7 +18,15 @@ public class PatientScanConditionDTO {
@NotBlank(message = "住院号不能为空!")
private String inpatientNo;
@ApiModelProperty("住院次数")
@NotBlank(message = "住院次数不能为空!")
private String admissTimes;
@ApiModelProperty("出院日期 yyyy-MM-dd")
@NotBlank(message = "出院日期不能为空!")
private String disDate;
@ApiModelProperty("病人姓名")
@NotBlank(message = "病人姓名不能为空!")
private String name;
@ApiModelProperty(value = "为出院日期的 00:00:00,只在后端查询中使用", hidden = true)
private String disDateTime;
}

@ -28,9 +28,14 @@ public class TBasicQrDto {
@ApiModelProperty(value = "记账号")
private String jzh;
@ApiModelProperty(value = "患者姓名")
private String name;
@ApiModelProperty(value = "省中医患者主索引号")
private String empId;
@ApiModelProperty(value = "是否忽略ph字段为1 则添加条件 ph is null")
private int ignorePh;

@ -14,14 +14,14 @@ public interface PatientScanService {
* @param patientScanConditionDTOList
* @return
*/
List<PatientScan> getScanDataByInpatientNoAndTimes(List<PatientScanConditionDTO> patientScanConditionDTOList);
List<PatientScan> getScanDataByConditions(List<PatientScanConditionDTO> patientScanConditionDTOList);
/**
* -
* @param patientScanConditionDto
* @return
*/
List<PatientScan> getScanDataByInpatientNoAndTimes(PatientScanConditionDTO patientScanConditionDto);
List<PatientScan> getScanDataByConditions(PatientScanConditionDTO patientScanConditionDto);
/**

@ -53,19 +53,27 @@ public class PatientScanSynchronizer {
for (PatientScanConditionDTO condition : patientScanConditionDTOList) {
List<TBasic> basicList = getBasicInfo(condition);
if (Func.isEmpty(basicList)) {
log.warn("{},住院号:{},住院次数:{} 查询基础数据没有数据,请检查!", source, condition.getInpatientNo(), condition.getAdmissTimes());
syncMsgStringBuilder.append(source).append(",住院号:").append(condition.getInpatientNo()).append("住院次数:").append(condition.getAdmissTimes()).append(" 查询基础数据没有数据,请检查!");
log.warn("{},住院号:{},出院日期:{},患者姓名:{} 查询基础数据没有数据,请检查!", source, condition.getInpatientNo(),condition.getDisDate(),condition.getName());
syncMsgStringBuilder.append(source)
.append(",住院号:").append(condition.getInpatientNo())
.append(",出院日期:").append(condition.getDisDate())
.append(",患者姓名:").append(condition.getName())
.append(" 查询基础数据没有数据,请检查!");
continue;
}
if (basicList.size() > 1) {
log.warn("{},住院号:{},住院次数:{} 查询基础数据有多条数据,请检查!", source, condition.getInpatientNo(), condition.getAdmissTimes());
syncMsgStringBuilder.append(source).append(",住院号:").append(condition.getInpatientNo()).append("住院次数:").append(condition.getAdmissTimes()).append(" 查询基础数据有多条数据,请检查!");
log.warn("{},住院号:{},出院日期:{},患者姓名:{} 查询基础数据有多条数据,请检查!", source,condition.getInpatientNo(), condition.getDisDate(),condition.getName());
syncMsgStringBuilder.append(source)
.append(",住院号:").append(condition.getInpatientNo())
.append(",出院日期:").append(condition.getDisDate())
.append(",患者姓名:").append(condition.getName())
.append(" 查询基础数据有多条数据,请检查!");
continue;
}
List<PatientScan> patientScanList = patientScanService.getScanDataByInpatientNoAndTimes(condition);
log.info("{},住院号:{},住院次数:{} 采集视图数据:{} 条!", source, condition.getInpatientNo(), condition.getAdmissTimes(), patientScanList.size());
List<PatientScan> patientScanList = patientScanService.getScanDataByConditions(condition);
log.info("{},住院号:{},出院日期:{},患者姓名{} 采集视图数据:{} 条!", source, condition.getInpatientNo(), condition.getDisDate(),condition.getName(), patientScanList.size());
saveCollectTaskAndReport(basicList.get(0), patientScanList);
log.info("{},住院号:{},住院次数{} 采集视图数据:{} 条,执行成功!", source, condition.getInpatientNo(), condition.getAdmissTimes(), patientScanList.size());
log.info("{},住院号:{},出院日期:{},患者姓名{} 采集视图数据:{} 条,执行成功!", source, condition.getInpatientNo(), condition.getDisDate(),condition.getName(), patientScanList.size());
fileCount += patientScanList.size();
successPatientCount++;
}
@ -89,9 +97,13 @@ public class PatientScanSynchronizer {
}
private List<TBasic> getBasicInfo(PatientScanConditionDTO patientScanConditionDTO) {
String disDate = patientScanConditionDTO.getDisDate();
TBasicQrDto basicQrDto = new TBasicQrDto();
basicQrDto.setInpatientNo(patientScanConditionDTO.getInpatientNo());
basicQrDto.setAdmissTimes(Integer.parseInt(patientScanConditionDTO.getAdmissTimes()));
basicQrDto.setName(patientScanConditionDTO.getName());
basicQrDto.setDisDateStart(disDate+" 00:00:00");
basicQrDto.setDisDateEnd(disDate+" 23:59:59");
basicQrDto.setIgnorePh(1);
return patientBasicMapper.getBasicInfo(basicQrDto);
}

@ -23,11 +23,11 @@ public class PatientScanServiceImpl implements PatientScanService {
private PatientScanMapper patientScanMapper;
@Override
public List<PatientScan> getScanDataByInpatientNoAndTimes(List<PatientScanConditionDTO> patientScanConditionDTOList) {
List<PatientScanConditionDTO> distinctPatientScanConditionDTOList = distinctForInpatientNoAndTimes(patientScanConditionDTOList);
public List<PatientScan> getScanDataByConditions(List<PatientScanConditionDTO> patientScanConditionDTOList) {
List<PatientScanConditionDTO> distinctPatientScanConditionDTOList = distinctCondition(patientScanConditionDTOList);
List<PatientScan> list = new LinkedList<>();
for (PatientScanConditionDTO patientScanConditionDTO : distinctPatientScanConditionDTOList) {
List<PatientScan> patientScanList = getScanDataByInpatientNoAndTimes(patientScanConditionDTO);
List<PatientScan> patientScanList = getScanDataByConditions(patientScanConditionDTO);
list.addAll(patientScanList);
}
return list;
@ -35,7 +35,8 @@ public class PatientScanServiceImpl implements PatientScanService {
@Override
public List<PatientScan> getScanDataByInpatientNoAndTimes(PatientScanConditionDTO patientScanConditionDto) {
public List<PatientScan> getScanDataByConditions(PatientScanConditionDTO patientScanConditionDto) {
patientScanConditionDto.setDisDateTime(patientScanConditionDto.getDisDate()+" 00:00:00");
return patientScanMapper.getScanData(patientScanConditionDto);
}
@ -55,11 +56,11 @@ public class PatientScanServiceImpl implements PatientScanService {
* @param patientScanConditionDTOList
* @return
*/
private List<PatientScanConditionDTO> distinctForInpatientNoAndTimes(List<PatientScanConditionDTO> patientScanConditionDTOList) {
private List<PatientScanConditionDTO> distinctCondition(List<PatientScanConditionDTO> patientScanConditionDTOList) {
Map<String, String> duplicateValidators = new HashMap<>();
LinkedList<PatientScanConditionDTO> list = new LinkedList<>();
for (PatientScanConditionDTO dto : patientScanConditionDTOList) {
String key = dto.getInpatientNo() + "valid" + dto.getAdmissTimes();
String key = dto.getInpatientNo() + "valid" + dto.getDisDate()+"valid"+dto.getName();
// 病案号和住院次数生成key根据哈希map的特性去重
if (duplicateValidators.containsKey(key)) {
continue;

@ -43,6 +43,9 @@
<if test="dto.disDateStart != null and dto.disDateStart != ''">
and `dis_date` between #{dto.disDateStart} and #{dto.disDateEnd}
</if>
<if test="dto.name != null and dto.name != ''">
and `name` = #{dto.name}
</if>
<if test="dto.ignorePh==1">
and ph is null
</if>

@ -23,24 +23,27 @@
from pat_sm
where
住院号=#{dto.inpatientNo}
and 次数=#{dto.admissTimes}
and 病人姓名=#{dto.name}
and 出院日期=#{dto.disDateTime}
and 扫描盘号 like 'G%'
</select>
<select id="getScanPatientConditionByScanDate" resultType="com.docus.server.collect.dto.PatientScanConditionDTO">
select 住院号 as inpatientNo,
次数 as admissTimes
出院日期 as disDate,
病人姓名 as name
from pat_sm
where 扫描日期 between #{start} and #{end}
and 扫描盘号 like 'G%'
group by 住院号, 次数
group by 住院号, 出院日期,病人姓名
</select>
<select id="getScanPatientConditionByDisDate" resultType="com.docus.server.collect.dto.PatientScanConditionDTO">
select 住院号 as inpatientNo,
次数 as admissTimes
出院日期 as disDate,
病人姓名 as name
from pat_sm
where 出院日期 between #{start} and #{end}
and 扫描盘号 like 'G%'
group by 住院号, 次数
group by 住院号, 出院日期,病人姓名
</select>
</mapper>

Loading…
Cancel
Save