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

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

@ -1,6 +1,7 @@
package com.docus.server.collect.controller; package com.docus.server.collect.controller;
import com.docus.core.util.Func; import com.docus.core.util.Func;
import com.docus.infrastructure.core.exception.BaseException;
import com.docus.infrastructure.web.api.CommonResult; import com.docus.infrastructure.web.api.CommonResult;
import com.docus.server.collect.dto.PatientScanConditionDTO; import com.docus.server.collect.dto.PatientScanConditionDTO;
import com.docus.server.collect.entity.PatientScan; import com.docus.server.collect.entity.PatientScan;
@ -14,7 +15,10 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Collections;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* *
@ -32,19 +36,41 @@ public class PatientScanController {
private PatientScanSynchronizer synchronizer; private PatientScanSynchronizer synchronizer;
@PostMapping("/get/byInpatientNoAndTimes") @PostMapping("/get/byCondition")
@ApiOperation("根据住院号和住院次数,进行患者电子病历扫描数据查询,返回需要同步的数据!") @ApiOperation("根据条件,进行患者电子病历扫描数据查询,返回需要同步的数据!")
public CommonResult<List<PatientScan>> collectByInpatientNoAndTimes(@RequestBody List<PatientScanConditionDTO> patientScanConditionDTOList) { public CommonResult<List<PatientScan>> collectBybyCondition(@RequestBody List<PatientScanConditionDTO> patientScanConditionDTOList) {
if (Func.isEmpty(patientScanConditionDTOList)) { if (Func.isEmpty(patientScanConditionDTOList)) {
return CommonResult.failed("请输入正确的请求参数!"); 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") @PostMapping("/collect/collectByDisDate")
@ApiOperation("根据出院日期区间同步扫描患者数据 yyyy-MM-dd") @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); log.info("根据出院日期区间 {} —— {} 同步扫描患者数据接口。", disDateStart, disDateEnd);
LocalDate disDateStartDate = LocalDate.parse(disDateStart); LocalDate disDateStartDate = LocalDate.parse(disDateStart);
LocalDate disDateEndDate = LocalDate.parse(disDateEnd); LocalDate disDateEndDate = LocalDate.parse(disDateEnd);
@ -77,4 +103,6 @@ public class PatientScanController {
result.setMsg(syncMsgStringBuilder.toString()); result.setMsg(syncMsgStringBuilder.toString());
return CommonResult.success(result); return CommonResult.success(result);
} }
} }

@ -8,6 +8,7 @@ import javax.validation.constraints.NotBlank;
/** /**
* *
*
* @author wyb * @author wyb
*/ */
@Data @Data
@ -17,7 +18,15 @@ public class PatientScanConditionDTO {
@NotBlank(message = "住院号不能为空!") @NotBlank(message = "住院号不能为空!")
private String inpatientNo; private String inpatientNo;
@ApiModelProperty("住院次数") @ApiModelProperty("出院日期 yyyy-MM-dd")
@NotBlank(message = "住院次数不能为空!") @NotBlank(message = "出院日期不能为空!")
private String admissTimes; 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 = "记账号") @ApiModelProperty(value = "记账号")
private String jzh; private String jzh;
@ApiModelProperty(value = "患者姓名")
private String name;
@ApiModelProperty(value = "省中医患者主索引号") @ApiModelProperty(value = "省中医患者主索引号")
private String empId; private String empId;
@ApiModelProperty(value = "是否忽略ph字段为1 则添加条件 ph is null") @ApiModelProperty(value = "是否忽略ph字段为1 则添加条件 ph is null")
private int ignorePh; private int ignorePh;

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

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

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

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

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

Loading…
Cancel
Save