Compare commits

...

51 Commits

Author SHA1 Message Date
wyb 34654712d2 imp:按天同步 3 days ago
wyb 801d986052 fix: 广州市一根据报告id查询报告未找到,不同步 1 month ago
wyb 3de32b4d7d feat: 广州市一检验报告同步job近期;优化分页 3 months ago
wyb e4dfed32f2 feat: 广州市一检验报告同步job 3 months ago
wyb 6d68f707c4 feat: 广州市一检验报告同步job 3 months ago
wyb 42e89000b5 feat: 广州市一基础数据同步 3 months ago
wyb 79ef689b6e feat: 广州市一检验报告接口添加 3 months ago
wyb 56f6a984a1 fix: 厦门中医院,异地导入数据排查 5 months ago
wyb 73d716593d fix: 市一判断检验病案号匹配 5 months ago
wyb 52bbdaabef fix:判断第一次删除全部 5 months ago
wyb 1696a88b6c fix:修复文件夹太长 5 months ago
wyb 32794d0791 feat:联众采集服务端 5 months ago
wyb b8364c024b fix: 同步基础数据并发问题 7 months ago
wyb d58c1dba35 fix: 同步基础数据并发问题 7 months ago
wyb a6d5da1f95 fix: 筛选如果基础数据都没有文件,则直接删除 7 months ago
wyb 35c4634d4f feat: 处理重复基础数据 7 months ago
wyb c7fefe0ce0 fix: 添加分批上传接口,基础数据比较,住院次数为空都改为0 7 months ago
wyb 263f3c0b5a fix: 同步基础数据处理科室code,修复出院 9 months ago
wyb aa623490aa fix: 同步基础数据处理科室code 9 months ago
wyb ccf210083e fix: 接口日志添加 10 months ago
wyb 4b7237b9cd fix: 取消admissid匹配,增加同步基础数据接口按照住院号和出院时间 10 months ago
wyb d7a9a0597c fix: 匹配患者病历的时候,需要匹配出院日期 10 months ago
wyb 8861f7c74f feat: get请求同步上个月省厅数据。 11 months ago
wyb 7b0d110d85 fix: 引包修改 11 months ago
wyb 4749c0c2f8 fix: 校验代码方式 11 months ago
wyb f894287a00 feat: 扫描更新箱号和患者病案主键临时方案 11 months ago
wyb 10ca2a5838 fix: 市一联众采集上传接口,来源设置为lianzhong,区分删除的文件 11 months ago
wyb 3da5f80397 fix: 市一同步基础数据为现场扫描来源 3 1 year ago
zhanghai 6d6f8e1388 改成同步部署。解决问题。 1 year ago
zhanghai 19a67a1cc8 如果住院次数为空,则默认是0 1 year ago
linjj 5b047266ba 市一同步联众数据 1 year ago
linjj 2b555ce68c 市一同步联众数据 1 year ago
zhanghai ee27e7246c 如果住院次数为空,则默认是0 1 year ago
linjj 9d5fca7054 市一同步联众数据 1 year ago
linjj 4720b81788 修改命名 1 year ago
linjj 3f58470345 Merge remote-tracking branch 'origin/jp2demo1.0' into jp2demo1.0 1 year ago
linjj 50d705c2e3 市一同步联众数据 1 year ago
zhanghai 9802c75f34 修改patientid 获取cardinfo 的id 1 year ago
linjj 7c3e665fd3 市一同步联众数据 1 year ago
zhanghai bcbbd2a7c1 修改patientid 获取cardinfo 的id 1 year ago
linjj 7fcde2dd52 市一同步联众数据 1 year ago
linjj 6154612116 市一同步联众数据 1 year ago
linjj 4f83d9e259 市一同步联众数据 1 year ago
linjj 9527cb83f8 市一同步联众数据 1 year ago
linjj 2b2a8995d0 市一同步联众数据 1 year ago
linjj 1b2ec6541c Merge remote-tracking branch 'origin/jp2demo1.0' into jp2demo1.0 1 year ago
linjj b515704639 市一同步联众数据 1 year ago
zhanghai e3287f2ade 修改patientid 获取cardinfo 的id 1 year ago
linjj 4fc3943aab 市一同步联众数据 1 year ago
linjj fbabaf6fc8 市一同步联众数据 1 year ago
linjj 14399d929f 市一同步联众数据 1 year ago

@ -16,7 +16,7 @@
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="jp2demo" options="-parameters -extdirs C:\my\jiashi\project\jp2demo/lib" />
<module name="jp2demo" options="-parameters -extdirs F:\xiamen-jiashi\code\jp2demo/lib" />
</option>
</component>
</project>

@ -1,21 +1,41 @@
package com.docus.demo.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.docus.demo.dto.LianZhongUploadInfo;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncFileDto;
import com.docus.demo.dto.SyncLabReportDto;
import com.docus.demo.dto.UploadJpgFileParam;
import com.docus.demo.entity.CommonResult;
import com.docus.demo.facade.ISyncBasicDataService;
import com.docus.demo.facade.ISyncBasicFileService;
import com.docus.demo.facade.IWebService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Api(value = "数据同步接口", tags = "数据同步接口")
@RestController("/sync")
@RestController
@Slf4j
public class SyncBasicDataController {
@Autowired
@ -25,39 +45,267 @@ public class SyncBasicDataController {
@Autowired
private IWebService webService;
private static final ConcurrentHashMap<String, Object> SYNC_BASIC_DATA_BLOCK_MAP = new ConcurrentHashMap<>();
@ApiOperation("去除文件不存在的数据")
@PostMapping("/deleteSync")
public CommonResult<?> deleteSync(@RequestBody SyncBasicDataDto syncBasicDataDto){
public CommonResult<?> deleteSync(@RequestBody SyncBasicDataDto syncBasicDataDto) {
return syncBasicFileService.deleteSync(syncBasicDataDto);
}
@ApiOperation("省厅-同步基础数据")
@PostMapping("/syncBasicData")
public CommonResult<?> syncBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){
return syncBasicDataService.syncBasicData(syncBasicDataDto);
public CommonResult<?> syncBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto) {
if (syncBasicDataDto == null) {
return CommonResult.failed("无效的请求参数!");
}
String blockKey = "syncBasicData:" + JSON.toJSONString(syncBasicDataDto);
if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) {
return CommonResult.failed("有正在同步的任务!");
}
SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0);
try {
return syncBasicDataService.syncBasicData(syncBasicDataDto);
} catch (Exception ex) {
return CommonResult.failed("同步失败!");
} finally {
SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey);
}
}
@ApiOperation("省厅-同步单个患者基础数据")
@GetMapping("/syncSingleBasicData")
public CommonResult<?> syncSingleBasicData(@RequestParam(name = "disDate") String disDate, @RequestParam(name = "inpatientNo") String inpatientNo) {
log.info("省厅-同步单个患者基础数据disDate={},inpatientNo={}", disDate, inpatientNo);
String blockKey = "syncSingleBasicData:" + inpatientNo + ":" + disDate;
if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) {
return CommonResult.failed("有正在同步的任务!");
}
SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0);
try {
LocalDate localDate = LocalDate.parse(disDate);
SyncBasicDataDto dto = new SyncBasicDataDto();
dto.setStartDate(localDate.toString());
dto.setEndDate(localDate.toString());
dto.setInpatientNoList(Collections.singletonList(inpatientNo));
dto.setLimit(100);
return syncBasicDataService.syncBasicData(dto);
} catch (Exception ex) {
return CommonResult.failed("同步失败!");
} finally {
SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey);
}
}
@ApiOperation("省厅-同步上个月基础数据")
@GetMapping("/syncLastMonthBasicData")
public CommonResult<?> syncLastMonthBasicData() {
String blockKey = "syncLastMonthBasicData";
if (SYNC_BASIC_DATA_BLOCK_MAP.containsKey(blockKey)) {
return CommonResult.failed("有正在同步的任务!");
}
SYNC_BASIC_DATA_BLOCK_MAP.put(blockKey, 0);
try {
LocalDate today = LocalDate.now();
LocalDate firstDayOfLastMonth = today.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDayOfLastMonth = today.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
SyncBasicDataDto dto = new SyncBasicDataDto();
dto.setStartDate(firstDayOfLastMonth.toString());
dto.setEndDate(lastDayOfLastMonth.toString());
dto.setLimit(1000);
return syncBasicDataService.syncBasicData(dto);
} catch (Exception ex) {
return CommonResult.failed("同步失败!");
} finally {
SYNC_BASIC_DATA_BLOCK_MAP.remove(blockKey);
}
}
@ApiOperation("同步检验图片数据")
@PostMapping("/syncInspection")
public CommonResult<?> syncInspection(@RequestBody SyncBasicDataDto syncBasicDataDto) {
return webService.syncInspection(syncBasicDataDto);
}
@ApiOperation("同步检验图片数据V2")
@PostMapping("/syncLabReport")
public CommonResult<?> syncLabReport(@RequestBody SyncLabReportDto syncLabReportDto) {
try {
validateAndSet(syncLabReportDto);
webService.syncLabReport(syncLabReportDto);
return CommonResult.success("同步检验数据成功");
} catch (Exception ex) {
log.error("同步检验图片数据,出错了," + ex.getMessage(), ex);
return CommonResult.failed("同步检验数据出错," + ex.getMessage());
}
}
private void validateAndSet(SyncLabReportDto syncLabReportDto) {
List<SyncLabReportDto.SyncLabReportBasicDto> basicDtoList = syncLabReportDto.getBasicDtoList();
if (CollUtil.isEmpty(basicDtoList)) {
throw new RuntimeException("患者基础数据为空!");
}
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (SyncLabReportDto.SyncLabReportBasicDto basicDto : basicDtoList) {
if (StrUtil.isBlank(basicDto.getInpatientNo()) || StrUtil.isBlank(basicDto.getDisDate())) {
throw new RuntimeException("患者基础数据病案号或出院日期为空!");
}
LocalDate.parse(basicDto.getDisDate(), dateTimeFormatter);
}
final String startDefault = "2018-01-01";
final String endDefault = LocalDate.now().toString() ;
String startDate = syncLabReportDto.getStartDate();
String endDate = syncLabReportDto.getEndDate();
if (StrUtil.isBlank(startDate)) {
startDate = startDefault;
}
if (StrUtil.isBlank(endDate)) {
endDate = endDefault;
}
LocalDate startLocalDate = LocalDate.parse(startDate, dateTimeFormatter);
LocalDate endLocalDate = LocalDate.parse(endDate, dateTimeFormatter);
if (startLocalDate.isAfter(endLocalDate)) {
throw new RuntimeException("三方查询接口开始时间不合法!");
}
syncLabReportDto.setStartDate(startLocalDate + " 00:00:00");
syncLabReportDto.setEndDate(endLocalDate + " 23:59:59");
}
@ApiOperation("联众-同步基础数据")
@PostMapping("/syncLzBasicData")
public CommonResult<?> syncLzBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto){
public CommonResult<?> syncLzBasicData(@RequestBody SyncBasicDataDto syncBasicDataDto) {
return syncBasicDataService.syncLzBasicData(syncBasicDataDto);
}
@ApiOperation("同步文件数据")
@PostMapping("/syncBasicFile")
public CommonResult<?> syncBasicFile(@RequestBody SyncFileDto syncFileDto){
public CommonResult<?> syncBasicFile(@RequestBody SyncFileDto syncFileDto) {
return syncBasicFileService.syncBasicFile(syncFileDto);
}
/**
* @description:
* @params: files
* @params: uploadBatchFileParam
* @author linjj
* @date: 2024/6/28 10:38
*/
@ApiOperation("联众同步文件上传,删除旧的所有联众,新的增加")
@PostMapping(value = "fileUploadJpg")
@ResponseBody
public CommonResult<?> fileUploadJpg(@RequestPart("files") MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
try {
return syncBasicFileService.fileUploadJpg(files, uploadJpgFileParam);
} catch (Exception e) {
log.error("保存失败!异常处理" + e.getMessage(), e);
return CommonResult.failed("保存失败!异常处理" + e.getMessage());
}
}
/**
* @description:
* @params: files
* @params: uploadBatchFileParam
* @author linjj
* @date: 2024/6/28 10:38
*/
@ApiOperation("联众同步文件上传,相同名字的删除,不同的添加,用于个别单次无法上传完毕的")
@PostMapping(value = "batchFileUploadJpg")
@ResponseBody
public CommonResult<?> batchFileUploadJpg(@RequestPart("files") MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
try {
return syncBasicFileService.batchFileUploadJpg(files, uploadJpgFileParam);
} catch (Exception e) {
log.error("保存失败!异常处理" + e.getMessage(), e);
return CommonResult.failed("保存失败!异常处理" + e.getMessage());
}
}
/**
* @description:
* @params: files
* @params: uploadBatchFileParam
* @author linjj
* @date: 2024/6/28 10:38
*/
@ApiOperation("标准版联众同步文件上传,相同名字的删除,不同的添加,用于个别单次无法上传完毕的")
@PostMapping(value = "/lianzhong/batchFileUploadJpg")
@ResponseBody
public CommonResult<?> lianZhongBatchFileUploadJpg(@RequestPart("files") MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
try {
LianZhongUploadInfo lianZhongUploadInfo = JSON.parseObject(uploadJpgFileParam.getUploadFileParams(), LianZhongUploadInfo.class);
syncBasicFileService.lianZhongBatchFileUploadJpg(files, lianZhongUploadInfo);
return CommonResult.success("成功!");
} catch (Exception e) {
log.error("联众同步文件上传,保存失败!异常处理" + e.getMessage(), e);
return CommonResult.failed("保存失败!异常处理" + e.getMessage());
}
}
@ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条")
@GetMapping("/choose")
public CommonResult<?> choose() {
log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条");
try {
syncBasicDataService.choose();
log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,已完成!");
return CommonResult.success("筛选完成!");
} catch (Exception ex) {
log.error("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,出现异常!" + ex.getMessage(), ex);
return CommonResult.failed("筛选异常!");
}
}
@ApiOperation("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条")
@PostMapping("/chooseByInpatientNo")
public CommonResult<?> chooseByInpatientNo(@RequestBody List<String> inpatientNos) {
log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条");
try {
syncBasicDataService.choose(inpatientNos);
log.info("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,已完成!");
return CommonResult.success("筛选完成!");
} catch (Exception ex) {
log.error("根据 病案号、姓名、出院日期、住院次数 进行筛选数据保留一条,出现异常!" + ex.getMessage(), ex);
return CommonResult.failed("筛选异常!");
}
}
@ApiOperation("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充,被选择的改为未归档状态")
@GetMapping("/xmzyyYidi/choose")
public CommonResult<?> xmzyyYidiChoose() {
log.info("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充");
try {
syncBasicDataService.xmzyyYidiChoose();
log.info("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充,已完成!");
return CommonResult.success("筛选完成!");
} catch (Exception ex) {
log.error("厦门中医院异地扫描导入数据,根据 病案号、姓名、出院日期 进行 入院日期,性别,科室补充,出现异常!" + ex.getMessage(), ex);
return CommonResult.failed("筛选异常!");
}
}
}

@ -0,0 +1,58 @@
package com.docus.demo.controller;
import cn.hutool.core.util.StrUtil;
import com.docus.demo.dto.BasicCorrectDto;
import com.docus.demo.entity.CommonResult;
import com.docus.demo.facade.ISyncBasicDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
@Api(value = "临时方法接口", tags = "临时方法接口")
@RestController("/tempfunc")
@Slf4j
public class TemporaryFunctionController {
@Autowired
private ISyncBasicDataService syncBasicDataService;
@ApiOperation("扫描软件修正基础数据临时方案")
@PostMapping("/scan/basicCorrect")
public CommonResult<?> scanBasicCorrect(@RequestBody List<BasicCorrectDto> basicCorrectDtos){
SimpleDateFormat inFormat = new SimpleDateFormat("yyyyMMdd");
for (BasicCorrectDto basicCorrectDto : basicCorrectDtos) {
if (StrUtil.isBlank(basicCorrectDto.getPatientId())) {
return CommonResult.failed("患者病案主键不能为空!");
}
if (StrUtil.isBlank(basicCorrectDto.getInpatientNo())) {
return CommonResult.failed("患者病案号不能为空!");
}
if (StrUtil.isBlank(basicCorrectDto.getDisDate())) {
return CommonResult.failed("患者出院日期不能为空!");
}
if (StrUtil.isBlank(basicCorrectDto.getPh())) {
return CommonResult.failed("患者箱号不能为空!");
}
try {
inFormat.parse(basicCorrectDto.getDisDate());
} catch (ParseException e) {
return CommonResult.failed("患者出院日期格式错误!");
}
}
syncBasicDataService.scanBasicCorrect(basicCorrectDtos);
return CommonResult.success("成功!");
}
}

@ -0,0 +1,32 @@
package com.docus.demo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author YongBin Wen
* @date 2024/9/6 16:05
*/
@Data
@ApiModel("基础数据选择处理对象")
public class BasicChooseDto {
@ApiModelProperty("病案主键")
private String patientId;
@ApiModelProperty("病案号")
private String inpatientNo;
@ApiModelProperty("患者出院日期 yyyy-MM-dd")
private String disDate;
@ApiModelProperty("患者姓名")
private String name;
@ApiModelProperty("患者姓名")
private Integer admissTimes;
@ApiModelProperty("优先级")
private int priority;
}

@ -0,0 +1,25 @@
package com.docus.demo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author YongBin Wen
* @date 2024/9/6 16:05
*/
@Data
@ApiModel("扫描软件修正基础表数据")
public class BasicCorrectDto {
@ApiModelProperty("病案主键")
private String patientId;
@ApiModelProperty("病案号")
private String inpatientNo;
@ApiModelProperty("患者出院日期 yyyyMMdd")
private String disDate;
@ApiModelProperty("患者姓名")
private String name;
@ApiModelProperty("箱号")
private String ph;
}

@ -0,0 +1,65 @@
package com.docus.demo.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class FileUploadJpgDto {
@ApiModelProperty(value = "住院号")
private String inpatientNo;
@ApiModelProperty(value = "出院时间")
private Date disDate;
@ApiModelProperty("文件展示标题")
private String fileTitle;
@ApiModelProperty("上传的文件文件名用于multipartFile")
private String uploadFileName;
@ApiModelProperty("分段id")
private String assortId;
@ApiModelProperty("patientId")
private String patientId;
@ApiModelProperty("住院时间")
private Date admissDate;
@ApiModelProperty("性别")
private String sex;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("住院次数")
private Integer admissTimes;
@ApiModelProperty("诊断编码")
private String mainDiagCode;
@ApiModelProperty("诊断名")
private String mainDiagName;
@ApiModelProperty(value = "住院科室")
private String admissDept;
@ApiModelProperty(value = "住院科室名称")
private String admissDeptName;
@ApiModelProperty(value = "出院科室")
private String disDept;
@ApiModelProperty(value = "出院科室名称")
private String disDeptName;
@ApiModelProperty(value = "住院ID号")
private String admissId;
@ApiModelProperty(value = "年龄")
private Integer age;
@ApiModelProperty(value = "身份证")
private String idCard;
@ApiModelProperty(value = "主要手术编码")
private String mainOperateCode;
@ApiModelProperty(value = "主要手术名称")
private String mainOperateName;
@ApiModelProperty(value = "院区")
private String wardPalce;
@ApiModelProperty(value = "出生年月")
private Date birthday;
}

@ -0,0 +1,110 @@
package com.docus.demo.dto;
import lombok.Data;
import java.util.List;
/**
*
*/
@Data
public class LianZhongUploadInfo {
/**
*
*
*/
@Data
public static class PatientInfo {
/**
*
*/
private String inpatientNo;
/**
*
*/
private Integer admissTimes;
/**
*
*/
private String name;
/**
* 12
*/
private String sex;
/**
*
*/
private String sexName;
/**
* -
*/
private Integer age;
/**
* yyyy-MM-dd HH:mm:ss
*/
private String admissDate;
/**
* yyyy-MM-dd HH:mm:ss
*/
private String disDate;
/**
*
*/
private String admissDeptName;
/**
*
*/
private String disDeptName;
/**
*
*/
private String idCard;
/**
*
*/
private String mainDiagCode;
/**
*
*/
private String mainDiagName;
/**
*
*/
private String mainOperateCode;
/**
*
*/
private String mainOperateName;
}
/**
*
*
*/
@Data
public static class FileInfo {
/**
* id
*/
private String assortId;
/**
*
*/
private String fileTitle;
/**
*
*/
private String uploadFileName;
/**
*
*/
private int sort;
}
private PatientInfo patientInfo;
private List<FileInfo> fileInfos;
private int delAllFile;
}

@ -0,0 +1,32 @@
package com.docus.demo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author YongBin Wen
* @date 2025/4/16 0016 17:05
*/
@ApiModel("检验报告同步参数")
@Data
public class SyncLabReportDto {
@ApiModelProperty("三方查询接口开始时间,接口格式为 yyyy-MM-dd后端转带时分秒格式为空默认为 2018-01-01 00:00:00")
private String startDate;
@ApiModelProperty("三方查询接口开始时间,接口格式为 yyyy-MM-dd后端转带时分秒格式为空默认为 接口调用时间")
private String endDate;
@ApiModelProperty("患者基础数据")
private List<SyncLabReportBasicDto> basicDtoList;
@Data
@ApiModel("检验报告同步患者基础数据参数")
public static class SyncLabReportBasicDto {
@ApiModelProperty("病案号")
private String inpatientNo;
@ApiModelProperty("出院日期,格式为 yyyy-MM-dd")
private String disDate;
}
}

@ -0,0 +1,11 @@
package com.docus.demo.dto;
import lombok.Data;
@Data
public class UploadJpgFileParam {
private String uploadFileParams;
}

@ -0,0 +1,56 @@
package com.docus.demo.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author jiashi
* @since 2021-04-15
*/
@Data
@ApiModel(value = "PowerDept对象", description = "科室")
public class PowerDept {
@ApiModelProperty(value = "科室id")
private Long deptId;
@ApiModelProperty(value = "科室代码")
private String deptCode;
@ApiModelProperty(value = "科室名称")
private String deptName;
@ApiModelProperty(value = "字典id")
private Integer dictId;
@ApiModelProperty(value = "是否有效")
private Integer effective;
@ApiModelProperty(value = "创建时间")
private Date createDate;
@ApiModelProperty(value = "创建人")
private String creater;
@ApiModelProperty(value = "更新时间")
private Date updateDate;
@ApiModelProperty(value = "更新人")
private String updater;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "临床科室排序")
private Integer sort;
@ApiModelProperty(value = "0:非临床科室,1:临床科室")
private Integer type;
}

@ -49,6 +49,9 @@ public class ScanAssort {
@ApiModelProperty(value = "页数")
private Integer filePages;
@ApiModelProperty(value = "是否作废0未作废")
private Integer isDel;
private String creater;
private String createrName;

@ -44,6 +44,9 @@ public class Tbasic {
@ApiModelProperty(value = "身份证")
private String idCard;
@ApiModelProperty(value = "是否扫描")
private String scanSource;
@ApiModelProperty(value = "手机号码")
private String telphone;
@ -104,7 +107,7 @@ public class Tbasic {
@ApiModelProperty(value = "归档时间")
private Date archiveTime;
@ApiModelProperty(value = "文件来源 1:af_archive_detail,2:t_scan_assort")
@ApiModelProperty(value = "文件来源 1:归档质控 2:异地扫描 3:现场扫描")
private Integer fileSource;
@ApiModelProperty(value = "完整性描述")
@ -144,6 +147,7 @@ public class Tbasic {
@ApiModelProperty(value = "扫描上传状态,0:未扫描、1:待质检、2:已退回、3:系统通过、4:人工通过5:已返工")
private Integer scanUploadState;
@ApiModelProperty(value = "院区")
private String wardPalce;
private Date birthday;
}

@ -0,0 +1,18 @@
package com.docus.demo.facade;
import com.docus.demo.entity.Tbasic;
import java.util.List;
/**
* @author YongBin Wen
* @date 2024/10/25 14:40
*/
public interface BasicDeptService {
/**
*
* @param tbasicList
*/
void handleDept(List<Tbasic> tbasicList);
}

@ -1,13 +1,24 @@
package com.docus.demo.facade;
import com.docus.demo.dto.BasicCorrectDto;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.entity.CommonResult;
import java.util.List;
public interface ISyncBasicDataService {
CommonResult<?> syncBasicData(SyncBasicDataDto syncBasicDataDto);
CommonResult<?> syncLzBasicData(SyncBasicDataDto syncBasicDataDto);
void scanBasicCorrect(List<BasicCorrectDto> basicCorrectDtos);
void choose();
void choose(List<String> inpatientNos);
void xmzyyYidiChoose();
}

@ -1,8 +1,11 @@
package com.docus.demo.facade;
import com.docus.demo.dto.LianZhongUploadInfo;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncFileDto;
import com.docus.demo.dto.UploadJpgFileParam;
import com.docus.demo.entity.CommonResult;
import org.springframework.web.multipart.MultipartFile;
public interface ISyncBasicFileService {
@ -15,4 +18,11 @@ public interface ISyncBasicFileService {
CommonResult<?> syncBasicFile(SyncFileDto syncFileDto);
CommonResult<?> deleteSync(SyncBasicDataDto syncBasicDataDto);
CommonResult<?>fileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam);
CommonResult<String> batchFileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam);
void lianZhongBatchFileUploadJpg(MultipartFile[] files, LianZhongUploadInfo lianZhongUploadInfo);
}

@ -1,12 +1,23 @@
package com.docus.demo.facade;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncLabReportDto;
import com.docus.demo.entity.CommonResult;
import java.io.IOException;
import com.docus.demo.entity.Tbasic;
public interface IWebService {
CommonResult<?> syncInspection(SyncBasicDataDto syncBasicDataDto);
void syncLabReport(SyncLabReportDto syncLabReportDto);
/**
*
*
* @param tbasic
* @param startDate yyyy-MM-dd HH:mm:ss
* @param endDate yyyy-MM-dd HH:mm:ss
*/
void syncInspection(Tbasic tbasic, String startDate, String endDate);
}

@ -0,0 +1,50 @@
package com.docus.demo.job;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.facade.ISyncBasicDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author YongBin Wen
* @date 2025/4/23 0023 17:13
*/
@Component
@Slf4j
public class GzFirstHospBasicSyncJob {
@Autowired
private ISyncBasicDataService syncBasicDataService;
private AtomicBoolean isRunning = new AtomicBoolean(false);
@Scheduled(cron = "0 0 0/12 * * ?")
public void syncOneMonthData() {
if (isRunning.compareAndSet(false, true)) {
LocalDate today = LocalDate.now();
LocalDate firstDayOfLastMonth = today.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
SyncBasicDataDto dto = new SyncBasicDataDto();
dto.setStartDate(firstDayOfLastMonth.toString());
dto.setEndDate(today.toString());
dto.setLimit(1000);
log.info("广州市第一人民医院,同步省厅基础数据,日期:{} —— {}", firstDayOfLastMonth, today);
try {
syncBasicDataService.syncBasicData(dto);
log.info("广州市第一人民医院,同步省厅基础数据,日期:" + firstDayOfLastMonth + "—— " + today + ",同步完成!");
} catch (Exception ex) {
log.info("广州市第一人民医院,同步省厅基础数据,日期:" + firstDayOfLastMonth + "—— " + today + ",出现异常:" + ex.getMessage(), ex);
} finally {
isRunning.set(false);
}
} else {
log.warn("广州市第一人民医院,同步省厅基础数据正在调度!");
}
}
}

@ -0,0 +1,103 @@
package com.docus.demo.job;
import cn.hutool.core.collection.CollUtil;
import com.docus.demo.entity.Tbasic;
import com.docus.demo.facade.IWebService;
import com.docus.demo.mapper.mysql.BasicMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author YongBin Wen
* @date 2025/4/23 0023 17:13
*/
@Component
@Slf4j
public class GzFirstLabReportSyncJob {
@Autowired
private IWebService iWebService;
@Resource
private BasicMapper basicMapper;
private AtomicBoolean isAllRunning = new AtomicBoolean(false);
private AtomicBoolean isThreeRunning = new AtomicBoolean(false);
@Scheduled(cron = "0 0 3 1 * ?")
public void syncAllLabReport() {
LocalDate today = LocalDate.now();
LocalDate syncDisDate = LocalDate.parse("2018-01-01");
String startDateTime = "2018-01-01 00:00:00";
String endDateTime = today + " 23:59:59";
if (isAllRunning.compareAndSet(false, true)) {
try {
while (!syncDisDate.isAfter(today)) {
String syncDisDateStr = syncDisDate.toString();
log.info("广州市第一人民医院,同步全部已扫描患者检验报告,同步出院日期:{}", syncDisDateStr);
List<Tbasic> tbasicList = basicMapper.getLabSyncBasicListByDate(syncDisDateStr + " 00:00:00", syncDisDateStr + " 23:59:59");
if (CollUtil.isNotEmpty(tbasicList)) {
for (Tbasic tbasic : tbasicList) {
iWebService.syncInspection(tbasic, startDateTime, endDateTime);
}
}
syncDisDate = syncDisDate.plusDays(1);
}
log.info("广州市第一人民医院,同步全部已扫描患者检验报告,同步完成!");
} catch (Exception ex) {
log.info("广州市第一人民医院,同步全部已扫描患者检验报告,出现异常:" + ex.getMessage(), ex);
} finally {
isAllRunning.set(false);
}
} else {
log.warn("广州市第一人民医院,同步全部已扫描患者检验报告正在调度!");
}
}
@Scheduled(cron = "0 0,30 * * * ?")
public void syncThreeMonthLabReport() {
LocalDate today = LocalDate.now();
String startDisDateTime = today.minusMonths(3) + " 00:00:00";
String startDateTime = "2018-01-01 00:00:00";
String endDateTime = today + " 23:59:59";
if (isThreeRunning.compareAndSet(false, true)) {
try {
int offset = 0;
int limit = 1000;
while (true) {
log.info("广州市第一人民医院同步部分已扫描患者检验报告患者参数查询startDisDateTime={}offset={}limit={}", startDisDateTime, offset, limit);
List<Tbasic> tbasicList = basicMapper.getLabSyncBasicList(startDisDateTime, offset, limit);
if (CollUtil.isEmpty(tbasicList)) {
break;
}
for (Tbasic tbasic : tbasicList) {
iWebService.syncInspection(tbasic, startDateTime, endDateTime);
}
offset = offset + limit;
}
log.info("广州市第一人民医院,同步部分已扫描患者检验报告,同步完成!");
} catch (Exception ex) {
log.info("广州市第一人民医院,同步部分已扫描患者检验报告,出现异常:" + ex.getMessage(), ex);
} finally {
isThreeRunning.set(false);
}
} else {
log.warn("广州市第一人民医院,同步部分已扫描患者检验报告正在调度!");
}
}
}

@ -22,14 +22,45 @@ public interface BasicMapper {
void insertOrUpdateByid(List<Tbasic> tbasicList);
Boolean addBasic(@Param("list")List<Tbasic> tbasicList);
List<Tbasic> getOldBasicList(@Param("list") List<String> fprnList, @Param("dto") SyncBasicDataDto syncBasicDataDto);
List<Tbasic> getOldBasicListLimit(@Param("pageStart") int pageStart,
@Param("pageEnd") int pageEnd,@Param("list") List<String> fprnList, @Param("dto") SyncBasicDataDto syncBasicDataDto);
List<Tbasic> getLabSyncBasicList(@Param("startDisDateTime") String startDisDateTime, @Param("offset") int offset, @Param("limit") int limit);
List<Tbasic> getLabSyncBasicListByDate(@Param("startDisDateTime") String startDisDateTime,@Param("endDisDateTime") String endDisDateTime);
void updateScanStatus(@Param("pid")String pid);
void insertOrUpdateTbasicSub(@Param("list") List<TbasicSub> tbasicSubList);
void delTbasicSub(@Param("patientId")String patientId);
Tbasic getTbasicByAdmissId(@Param("admissId")String admissId);
Tbasic getTbasicByPatientId(@Param("patientId")String patientId);
Boolean delTbasicByAdmissId(@Param("admissId")String admissId);
int updateScanBasicCorrect(@Param("oldPatId") String oldBasicPatientId, @Param("newPatId") String newPatientId,@Param("ph") String ph);
int delTbasic(@Param("pidList") List<String> patientIds);
List<Tbasic> getTbasicByInpatientNo(@Param("inpatientNo") String inpatientNo);
List<String> getInpatientNos();
List<String> getInpatientNosBySource(@Param("fileSource") int source);
int fillMissingFields(@Param("basic") Tbasic yidiBasic);
int updateNotArchive(@Param("patientId")String patientId);
}

@ -0,0 +1,15 @@
package com.docus.demo.mapper.mysql;
import com.docus.demo.entity.PowerDept;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface PowerDeptMapper {
List<PowerDept> list();
int insert(@Param("list") List<PowerDept> addPowerDeptList);
}

@ -1,10 +1,7 @@
package com.docus.demo.mapper.mysql;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.docus.demo.entity.ScanAssort;
import com.docus.demo.entity.ZdAssort;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -25,5 +22,20 @@ public interface ScanAssortMapper {
void insertOrUpdateBatch(List<ScanAssort> scanAssortList);
boolean addScanAssort(@Param("list")List<ScanAssort> scanAssortList);
int deleteByPid(@Param("pidList") List<String> pidList);
int delScanAssort(@Param("patientId")String patientId,@Param("source")String source);
List<ScanAssort>getScanAssort(@Param("patientId")String patientId,@Param("source")String source);
int updatePatientId(@Param("oldPatId") String oldBasicPatientId, @Param("newPatId") String newPatientId);
int updatePatientIdById(@Param("ids") List<Long> ids, @Param("newPatId") String newPatientId);
int delScanAssortById(@Param("id") Long id);
List<ScanAssort> getListByPids(@Param("pidList") List<String> patientIds);
}

@ -0,0 +1,88 @@
package com.docus.demo.service;
import com.docus.demo.entity.PowerDept;
import com.docus.demo.entity.Tbasic;
import com.docus.demo.facade.BasicDeptService;
import com.docus.demo.mapper.mysql.PowerDeptMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author YongBin Wen
* @date 2024/10/25 14:40
*/
@Slf4j
@Service
public class BasicDeptServiceImpl implements BasicDeptService {
@Resource
private PowerDeptMapper powerDeptMapper;
private final ReentrantLock HANDLE_DEPT_LOCK=new ReentrantLock();
@Override
public void handleDept(List<Tbasic> tbasicList) {
HANDLE_DEPT_LOCK.lock();
try {
List<PowerDept> powerDeptList= powerDeptMapper.list();
Map<String, PowerDept> powerDeptMap = powerDeptList.stream().collect(Collectors.toMap(PowerDept::getDeptName, Function.identity()));
long maxDeptId=0L;
Optional<Long> maxDeptIdOp = powerDeptList.stream().map(PowerDept::getDeptId).max(Comparator.naturalOrder());
if (maxDeptIdOp.isPresent()) {
maxDeptId=maxDeptIdOp.get();
}
List< PowerDept> addPowerDeptList = new ArrayList<>();
for (Tbasic tbasic : tbasicList) {
if(tbasic.getAdmissDeptName() == null){
tbasic.setAdmissDeptName("");
}
if(tbasic.getDisDeptName() == null){
tbasic.setDisDeptName("");
}
if (!powerDeptMap.containsKey(tbasic.getAdmissDeptName())) {
PowerDept powerDept = new PowerDept();
maxDeptId=maxDeptId+1;
powerDept.setDeptId(maxDeptId);
powerDept.setDeptCode(String.valueOf(maxDeptId));
powerDept.setDeptName(tbasic.getAdmissDeptName());
powerDeptMap.put(powerDept.getDeptName(),powerDept);
addPowerDeptList.add(powerDept);
}
if (!powerDeptMap.containsKey(tbasic.getDisDeptName())) {
PowerDept powerDept = new PowerDept();
maxDeptId=maxDeptId+1;
powerDept.setDeptId(maxDeptId);
powerDept.setDeptCode(String.valueOf(maxDeptId));
powerDept.setDeptName(tbasic.getDisDeptName());
powerDeptMap.put(powerDept.getDeptName(),powerDept);
addPowerDeptList.add(powerDept);
}
PowerDept powerDept1 = powerDeptMap.get(tbasic.getAdmissDeptName());
tbasic.setAdmissDept(powerDept1.getDeptCode());
PowerDept powerDept2 = powerDeptMap.get(tbasic.getDisDeptName());
tbasic.setDisDept(powerDept2.getDeptCode());
}
if(!addPowerDeptList.isEmpty()){
powerDeptMapper.insert(addPowerDeptList);
}
}catch (Exception ex){
log.error("处理基础数据科室信息异常,"+ex.getMessage(),ex);
} finally {
HANDLE_DEPT_LOCK.unlock();
}
}
}

@ -1,18 +1,25 @@
package com.docus.demo.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.docus.demo.dto.BasicChooseDto;
import com.docus.demo.dto.BasicCorrectDto;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.entity.CommonResult;
import com.docus.demo.entity.ScanAssort;
import com.docus.demo.entity.Tbasic;
import com.docus.demo.entity.TbasicSub;
import com.docus.demo.entity.sqlserver.CardInfo;
import com.docus.demo.entity.sqlserver1.Tdiagnose;
import com.docus.demo.entity.sqlserver1.Toperation;
import com.docus.demo.entity.sqlserver1.Tpatientvisit;
import com.docus.demo.facade.BasicDeptService;
import com.docus.demo.facade.ISyncBasicDataService;
import com.docus.demo.mapper.mysql.BasicMapper;
import com.docus.demo.mapper.mysql.ScanAssortMapper;
import com.docus.demo.mapper.sqlserver.TcardMapper;
import com.docus.demo.mapper.sqlserver1.PaintVisitMapper;
import com.docus.demo.utils.SnowflakeIdWorker;
@ -22,11 +29,7 @@ import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -39,6 +42,10 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
private PaintVisitMapper paintVisitMapper;
@Autowired
private TcardMapper tcardMapper;
@Autowired
private ScanAssortMapper scanAssortMapper;
@Autowired
private BasicDeptService basicDeptService;
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
// private final ExecutorService executor = Executors.newFixedThreadPool(7);
@ -53,44 +60,45 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
//每页1000条数据
List<Tpatientvisit> tpatientvisitList;
for (int current = 1; ; current++) {
syncBasicDataDto.setStartDate(startDate +" 00:00:00");
syncBasicDataDto.setEndDate(startDate +" 23:59:59");
syncBasicDataDto.setStartDate(startDate + " 00:00:00");
syncBasicDataDto.setEndDate(startDate + " 23:59:59");
log.info(syncBasicDataDto.getStartDate()+" --- " +syncBasicDataDto.getEndDate());
log.info(syncBasicDataDto.getStartDate() + " --- " + syncBasicDataDto.getEndDate());
//根据出院时间查询省厅数据
tpatientvisitList = paintVisitMapper.getTpatientVisitList(0, 0, syncBasicDataDto);
if (tpatientvisitList.size() == 0){
if (tpatientvisitList.size() == 0) {
break;
}
log.info("开始同步"+tpatientvisitList.size());
log.info("开始同步" + tpatientvisitList.size());
// tpatientvisitList = paintVisitMapper.getTpatientVisitList((current - 1) * limit, current*limit, syncBasicDataDto);
for (Tpatientvisit e : tpatientvisitList) {
if(StrUtil.isNotBlank(e.getFprn())){
if (StrUtil.isNotBlank(e.getFprn())) {
e.setFprn(e.getFprn().toLowerCase(Locale.ROOT));
}
}
List<String> fprnList = tpatientvisitList.stream().map(Tpatientvisit::getFprn).collect(Collectors.toList());
List<Integer> ftimesList = tpatientvisitList.stream().map(Tpatientvisit::getFtimes).distinct().collect(Collectors.toList());
log.info("fprnList"+fprnList.size()+ " ftimesList" +ftimesList.size());
log.info("fprnList" + fprnList.size() + " ftimesList" + ftimesList.size());
//诊断数据
List<Tdiagnose> tdiagnoses = paintVisitMapper.getTdiagnose(fprnList,ftimesList);
log.info("tdiagnoses"+tdiagnoses.size());
List<Tdiagnose> tdiagnoses = paintVisitMapper.getTdiagnose(fprnList, ftimesList);
log.info("tdiagnoses" + tdiagnoses.size());
List<Toperation> toperations = paintVisitMapper.getToperation(fprnList);
log.info("toperations"+toperations.size());
log.info("toperations" + toperations.size());
//数据map转换
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(fprnList, syncBasicDataDto);
log.info("oldBasicList"+oldBasicList.size());
log.info("oldBasicList" + oldBasicList.size());
List<Tbasic> tbasicList = this.getTbasicList(oldBasicList, tpatientvisitList, tdiagnoses, toperations);
log.info("tbasicList"+tbasicList.size());
log.info("tbasicList" + tbasicList.size());
List<TbasicSub> tbasicSubList = this.getTbasicSubList(tbasicList);
log.info("tbasicSubList"+tbasicSubList.size());
log.info("tbasicSubList" + tbasicSubList.size());
//数据入库
basicDeptService.handleDept(tbasicList);
basicMapper.insertOrUpdateByid(tbasicList);
basicMapper.insertOrUpdateTbasicSub(tbasicSubList);
log.info("数据库入库"+tbasicList.size() +"子表"+tbasicSubList.size());
log.info("数据库入库" + tbasicList.size() + "子表" + tbasicSubList.size());
if (startDate.compareTo(endDate)>0) {
if (startDate.compareTo(endDate) > 0) {
break;
}
startDate = startDate.plusDays(1);
@ -98,97 +106,486 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
return CommonResult.success("同步成功");
}
@Override
public void scanBasicCorrect(List<BasicCorrectDto> basicCorrectDtos) {
SimpleDateFormat inFormat = new SimpleDateFormat("yyyyMMdd");
List<BasicCorrectDto> afterSyncHandle = new ArrayList<>();
for (BasicCorrectDto correctDto : basicCorrectDtos) {
try {
String newPatientId = correctDto.getPatientId();
String ph = correctDto.getPh();
String inpatientNo = correctDto.getInpatientNo();
String inDisDateStr = correctDto.getDisDate();
Date disDate = inFormat.parse(inDisDateStr);
String disDateStr = simpleDateFormat.format(disDate);
List<String> inpatientNoList = Collections.singletonList(inpatientNo);
SyncBasicDataDto syncBasicDataDto = new SyncBasicDataDto();
syncBasicDataDto.setStartDate(disDateStr + " 00:00:00");
syncBasicDataDto.setEndDate(disDateStr + " 23:59:59");
syncBasicDataDto.setInpatientNoList(inpatientNoList);
Tbasic oldBasic = basicMapper.getTbasicByPatientId(newPatientId);
// 二次确认
if (oldBasic == null) {
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(inpatientNoList, syncBasicDataDto);
// 没数据,加到同步
if (CollUtil.isEmpty(oldBasicList)) {
SyncBasicDataDto syncDto = new SyncBasicDataDto();
syncDto.setInpatientNoList(inpatientNoList);
syncDto.setStartDate(disDateStr);
syncDto.setEndDate(disDateStr);
syncDto.setLimit(1);
syncBasicData(syncDto);
// 同步之后在处理
afterSyncHandle.add(correctDto);
continue;
}
oldBasic = oldBasicList.get(0);
}
String oldBasicPatientId = oldBasic.getPatientId();
// 更新箱号和patientId,如果更换了patientId,文件表也更换patientId
basicMapper.updateScanBasicCorrect(oldBasicPatientId, newPatientId, ph);
if (!newPatientId.equals(oldBasicPatientId)) {
scanAssortMapper.updatePatientId(oldBasicPatientId, newPatientId);
}
} catch (Exception ex) {
log.error("扫描修正基础数据出错了!" + ex.getMessage(), ex);
}
}
if (CollUtil.isNotEmpty(afterSyncHandle)) {
scanBasicCorrect(afterSyncHandle);
}
}
@Override
public void choose() {
int count = 0;
List<String> inpatientNos = basicMapper.getInpatientNos();
log.info("本次筛选病案号数量为:{}", inpatientNos.size());
for (String inpatientNo : inpatientNos) {
choose(inpatientNo);
count++;
log.info("已经筛选病案号:{} 个", count);
}
log.info("本次筛选完成!");
}
@Override
public void choose(List<String> inpatientNos) {
for (String inpatientNo : inpatientNos) {
choose(inpatientNo);
log.info("已经筛选病案号:{} ", inpatientNo);
}
}
@Override
public void xmzyyYidiChoose() {
final int yidiSource=4;
List<String> yidiInpatientNos = basicMapper.getInpatientNosBySource(yidiSource);
for (String inpatientNo : yidiInpatientNos) {
xmzyyYidiChoose(inpatientNo);
}
}
/**
*
*/
public void xmzyyYidiChoose(String yidiInpatientNo) {
List<Tbasic> basicList = basicMapper.getTbasicByInpatientNo(yidiInpatientNo);
if (basicList.size() <= 1) {
return;
}
final Integer yidiSource = 4;
List<Tbasic> yidiBasics = basicList.stream().filter(p -> yidiSource.equals(p.getFileSource())).collect(Collectors.toList());
if(CollUtil.isEmpty(yidiBasics)){
return;
}
for (Tbasic yidiBasic : yidiBasics) {
List<Tbasic> collect = basicList.stream().filter(p -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return !yidiSource.equals(p.getFileSource())
&& sdf.format(yidiBasic.getDisDate()).equals(sdf.format(p.getDisDate()))
&& yidiBasic.getName().equals(p.getName())
&& StrUtil.isNotBlank(p.getDisDept())
&& StrUtil.isNotBlank(p.getSex());
}).collect(Collectors.toList());
if(CollUtil.isNotEmpty(collect)){
Tbasic chooseBasic = collect.get(0);
yidiBasic.setSex(chooseBasic.getSex());
yidiBasic.setSexName(chooseBasic.getSexName());
yidiBasic.setAdmissDate(chooseBasic.getAdmissDate());
yidiBasic.setAdmissDept(chooseBasic.getAdmissDept());
yidiBasic.setAdmissDeptName(chooseBasic.getAdmissDeptName());
yidiBasic.setDisDept(chooseBasic.getDisDept());
yidiBasic.setDisDeptName(chooseBasic.getDisDeptName());
basicMapper.fillMissingFields(yidiBasic);
basicMapper.updateNotArchive(chooseBasic.getPatientId());
}
}
}
/**
*
* / +10
* +4
* +3
* , +2 +1
*
*
*
*/
private void choose(String inpatientNo) {
List<Tbasic> basicList = basicMapper.getTbasicByInpatientNo(inpatientNo);
if (basicList.size() == 1) {
return;
}
Map<String, List<Tbasic>> group = new HashMap<>();
for (Tbasic tbasic : basicList) {
String groupKey = tbasic.getInpatientNo() + "_" + tbasic.getName() + "_" + DateUtil.formatDate(tbasic.getDisDate()) + "_" + tbasic.getAdmissTimes();
List<Tbasic> groupOrDefault = group.getOrDefault(groupKey, new ArrayList<>());
groupOrDefault.add(tbasic);
group.put(groupKey, groupOrDefault);
}
Set<Map.Entry<String, List<Tbasic>>> entries = group.entrySet();
for (Map.Entry<String, List<Tbasic>> entry : entries) {
List<Tbasic> value = entry.getValue();
if (value.size() <= 1) {
continue;
}
groupChoose(value);
}
}
/**
*
*/
private void groupChoose(List<Tbasic> basicList) {
if (basicList.size() <= 1) {
return;
}
List<BasicChooseDto> chooseDtoList = new ArrayList<>();
for (Tbasic basic : basicList) {
BasicChooseDto chooseDto = new BasicChooseDto();
chooseDto.setPatientId(basic.getPatientId());
chooseDto.setName(basic.getName());
chooseDto.setInpatientNo(basic.getInpatientNo());
chooseDto.setAdmissTimes(basic.getAdmissTimes());
chooseDto.setDisDate(DateUtil.formatDate(basic.getDisDate()));
if (StrUtil.isBlank(basic.getPh())) {
chooseDto.setPriority(0);
} else {
chooseDto.setPriority(10);
}
chooseDtoList.add(chooseDto);
}
if (judgeAndProcess(chooseDtoList)) {
return;
}
Map<String, Map<String, List<ScanAssort>>> groupByPatientGroupBySource = new HashMap<>(10);
for (BasicChooseDto basicChooseDto : chooseDtoList) {
List<ScanAssort> assorts = scanAssortMapper.getListByPid(basicChooseDto.getPatientId());
assorts = assorts.stream().filter(f -> {
if (f.getSource() == null) {
f.setSource("unknow");
}
Integer del = 1;
return ObjectUtil.notEqual(del, f.getIsDel());
}).collect(Collectors.toList());
if (CollUtil.isEmpty(assorts)) {
continue;
}
Map<String, List<ScanAssort>> groupBySource = assorts.stream().collect(Collectors.groupingBy(ScanAssort::getSource));
if (groupBySource.containsKey("-1")) {
basicChooseDto.setPriority(basicChooseDto.getPriority() + 4);
}
if (groupBySource.containsKey("lianzhong")) {
basicChooseDto.setPriority(basicChooseDto.getPriority() + 3);
}
groupByPatientGroupBySource.put(basicChooseDto.getPatientId(), groupBySource);
}
if (judgeAndProcess(chooseDtoList)) {
return;
}
int siteMaxSize = 0;
int lianzhongMaxSize = 0;
HashMap<Integer, List<BasicChooseDto>> siteFileCountMap = new HashMap<>();
HashMap<Integer, List<BasicChooseDto>> lianzhongFileCountMap = new HashMap<>();
for (BasicChooseDto chooseDto : chooseDtoList) {
Map<String, List<ScanAssort>> groupBySource = groupByPatientGroupBySource.getOrDefault(chooseDto.getPatientId(), new HashMap<>());
List<ScanAssort> siteScan = groupBySource.getOrDefault("-1", new ArrayList<>());
int siteSize = siteScan.size();
List<ScanAssort> lianzhong = groupBySource.getOrDefault("lianzhong", new ArrayList<>());
int lianzhongSize = lianzhong.size();
List<BasicChooseDto> siteGroup = siteFileCountMap.getOrDefault(siteSize, new ArrayList<>());
siteGroup.add(chooseDto);
List<BasicChooseDto> lianzhongGroup = lianzhongFileCountMap.getOrDefault(lianzhongSize, new ArrayList<>());
lianzhongGroup.add(chooseDto);
siteFileCountMap.put(siteSize, siteGroup);
lianzhongFileCountMap.put(lianzhongSize, lianzhongGroup);
siteMaxSize = Math.max(siteMaxSize, siteSize);
lianzhongMaxSize = Math.max(lianzhongMaxSize, lianzhongSize);
}
List<BasicChooseDto> siteCountChoose = siteFileCountMap.get(siteMaxSize);
List<BasicChooseDto> lianzhongCountChoose = lianzhongFileCountMap.get(lianzhongMaxSize);
for (BasicChooseDto dto : siteCountChoose) {
dto.setPriority(dto.getPriority() + 2);
}
for (BasicChooseDto dto : lianzhongCountChoose) {
dto.setPriority(dto.getPriority() + 1);
}
// 最后无需再判定,直接取最大优先权中的一条
processSelection(chooseDtoList, electedOneData(chooseDtoList));
}
/**
*
*
* @return true
*/
private boolean judgeAndProcess(List<BasicChooseDto> chooseDtoList) {
if (elected(chooseDtoList) && electedOne(chooseDtoList)) {
processSelection(chooseDtoList, electedOneData(chooseDtoList));
return true;
}
return false;
}
/**
*
*
*
*
* @param chooseDtoList
* @param finalElected
*/
private void processSelection(List<BasicChooseDto> chooseDtoList, BasicChooseDto finalElected) {
String selectPatientId = finalElected.getPatientId();
List<String> allPatientIds = chooseDtoList.stream().map(BasicChooseDto::getPatientId).collect(Collectors.toList());
List<ScanAssort> allScanAssorts = scanAssortMapper.getListByPids(allPatientIds);
allScanAssorts = allScanAssorts.stream().filter(f -> {
if (f.getSource() == null) {
f.setSource("unknow");
}
Integer del = 1;
return ObjectUtil.notEqual(del, f.getIsDel());
}).collect(Collectors.toList());
if (CollUtil.isEmpty(allScanAssorts)) {
List<String> notSelectedPids = allPatientIds.stream().filter(e -> !e.equals(selectPatientId)).collect(Collectors.toList());
basicMapper.delTbasic(notSelectedPids);
for (String notSelectedPid : notSelectedPids) {
basicMapper.delTbasicSub(notSelectedPid);
}
return;
}
Set<String> allSources = allScanAssorts.stream().map(ScanAssort::getSource).collect(Collectors.toSet());
Set<String> selectPatientSources = allScanAssorts.stream()
.filter(e -> ObjectUtil.equals(selectPatientId, e.getPatientId()))
.map(ScanAssort::getSource)
.collect(Collectors.toSet());
for (String source : allSources) {
if (selectPatientSources.contains(source)) {
continue;
}
transferScanAssortBySource(allScanAssorts, selectPatientId, source);
selectPatientSources.add(source);
}
List<String> notSelectedPids = allPatientIds.stream().filter(e -> !e.equals(selectPatientId)).collect(Collectors.toList());
basicMapper.delTbasic(notSelectedPids);
for (String notSelectedPid : notSelectedPids) {
basicMapper.delTbasicSub(notSelectedPid);
}
}
/**
*
*
* @param allScanAssorts
* @param selectPatientId
* @param source
*/
private void transferScanAssortBySource(List<ScanAssort> allScanAssorts, String selectPatientId, String source) {
// 选择该来源的其他患者中这个来源数量最多的
Map<String, List<ScanAssort>> groupByPatient = allScanAssorts.stream()
.filter(e -> !ObjectUtil.equals(selectPatientId, e.getPatientId()) && ObjectUtil.equals(source, e.getSource()))
.collect(Collectors.groupingBy(ScanAssort::getPatientId));
int maxSize = 0;
String maxSizePatient = null;
Set<Map.Entry<String, List<ScanAssort>>> entries = groupByPatient.entrySet();
for (Map.Entry<String, List<ScanAssort>> entry : entries) {
List<ScanAssort> assorts = entry.getValue();
int size = assorts.size();
if (size > maxSize) {
maxSize = size;
maxSizePatient = assorts.get(0).getPatientId();
}
}
List<ScanAssort> updateScanAssort = groupByPatient.get(maxSizePatient);
List<Long> updateScanAssortIds = updateScanAssort.stream()
.map(ScanAssort::getId)
.collect(Collectors.toList());
scanAssortMapper.updatePatientIdById(updateScanAssortIds, selectPatientId);
}
/**
* ,0
*/
private boolean elected(List<BasicChooseDto> chooseDtoList) {
for (BasicChooseDto dto : chooseDtoList) {
if (dto.getPriority() > 0) {
return true;
}
}
return false;
}
/**
*
*/
private boolean electedOne(List<BasicChooseDto> chooseDtoList) {
List<BasicChooseDto> list = electedMaxPriorityData(chooseDtoList);
return list.size() == 1;
}
/**
*
*/
private BasicChooseDto electedOneData(List<BasicChooseDto> chooseDtoList) {
List<BasicChooseDto> list = electedMaxPriorityData(chooseDtoList);
return list.get(0);
}
/**
*
*/
private List<BasicChooseDto> electedMaxPriorityData(List<BasicChooseDto> chooseDtoList) {
Map<Integer, List<BasicChooseDto>> groupByPriority = chooseDtoList.stream()
.collect(Collectors.groupingBy(BasicChooseDto::getPriority));
int maxPriority = 0;
for (BasicChooseDto chooseDto : chooseDtoList) {
int priority = chooseDto.getPriority();
maxPriority = Math.max(priority, maxPriority);
}
return groupByPriority.get(maxPriority);
}
public static void main(String[] args) {
LocalDate startDate = LocalDate.parse("2024-05-06");
System.out.println(startDate);
}
private List<TbasicSub> getTbasicSubList(List<Tbasic> tbasicList) {
return tbasicList.stream().map(m->{
return tbasicList.stream().map(m -> {
TbasicSub tbasicSub = new TbasicSub();
tbasicSub.setBirthday(m.getBirthday());
tbasicSub.setPatientId(m.getPatientId());
return tbasicSub;
return tbasicSub;
}).collect(Collectors.toList());
}
private List<Tbasic> getTbasicList(List<Tbasic> oldBasicList, List<Tpatientvisit> tpatientvisitList, List<Tdiagnose> tdiagnoses, List<Toperation> toperations) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 根据病案号 住院次数 名称 做去重判断
return tpatientvisitList.stream().map(m -> {
Tbasic oldBasic = oldBasicList.stream()
.filter(old -> ObjectUtil.equal(m.getFprn(), old.getInpatientNo().toLowerCase(Locale.ROOT))
&& ObjectUtil.equal(m.getFtimes(), old.getAdmissTimes())
&& ObjectUtil.equal(m.getFname(), old.getName())
)
.findFirst()
.orElse(null);
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);
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.getFsexbh());
tbasic.setSexName(m.getFsex());
if (m.getFage().contains("Y")){
tbasic.setAge(Integer.valueOf(m.getFage().split("Y")[1]));
}else if (m.getFage().contains("M")){
tbasic.setAgeMonth(Integer.valueOf(m.getFage().split("M")[1]));
}else if (m.getFage().contains("D")){
tbasic.setAgeDay(Integer.valueOf(m.getFage().split("D")[1]));
}
Tbasic oldBasic = oldBasicList.stream()
.filter(old -> ObjectUtil.equal(m.getFprn(), old.getInpatientNo().toLowerCase(Locale.ROOT))
&& ObjectUtil.equal(m.getFtimes(), old.getAdmissTimes())
&& ObjectUtil.equal(m.getFname(), old.getName())
&& sdf.format(m.getFcydate()).equals(sdf.format(old.getDisDate()))
)
.findFirst()
.orElse(null);
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());
tbasic.setBirthday(m.getFbirthday());
if (tdiagnose != null) {
tbasic.setMainDiagCode(tdiagnose.getFicdm());
tbasic.setMainDiagName(tdiagnose.getFjbname());
}
if (toperation != null) {
tbasic.setMainOperateCode(toperation.getFopcode());
tbasic.setMainOperateName(toperation.getFop());
}
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);
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.getFsexbh());
tbasic.setSexName(m.getFsex());
if (m.getFage().contains("Y")) {
tbasic.setAge(Integer.valueOf(m.getFage().split("Y")[1]));
} else if (m.getFage().contains("M")) {
tbasic.setAgeMonth(Integer.valueOf(m.getFage().split("M")[1]));
} else if (m.getFage().contains("D")) {
tbasic.setAgeDay(Integer.valueOf(m.getFage().split("D")[1]));
}
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());
tbasic.setBirthday(m.getFbirthday());
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);
tbasic.setScanUploadState(0);
tbasic.setIsArchive(1);
return tbasic;
}).collect(Collectors.toList());
tbasic.setCreateTime(new Date());
tbasic.setSexName(m.getFsex());
tbasic.setArchiveFileStorageType(2);
tbasic.setScanUploadState(0);
tbasic.setIsArchive(1);
tbasic.setFileSource(3);
return tbasic;
}).collect(Collectors.toList());
}
@ -196,60 +593,67 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
public CommonResult<?> syncLzBasicData(SyncBasicDataDto syncBasicDataDto) {
// 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;
//页码
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());
for (CardInfo e : cardInfoList) {
if (StrUtil.isNotBlank(e.getPatNo())) {
e.setPatNo(e.getPatNo().toLowerCase(Locale.ROOT));
}
log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "开始同步" + cardInfoList.size());
for (CardInfo e : cardInfoList) {
if(StrUtil.isNotBlank(e.getPatNo())){
e.setPatNo(e.getPatNo().toLowerCase(Locale.ROOT));
}
if (e.getPatNum() == null) {
e.setPatNum(0);
}
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());
}
}
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);
basicDeptService.handleDept(tbasicList);
//数据入库
basicMapper.insertOrUpdateByid(sublist);
log.info("数据入库" + sublist.size());
}
}
log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "结束同步" );
}
log.info(syncBasicDataDto.getStartDate() + " " + syncBasicDataDto.getEndDate() + "结束同步");
// });
return CommonResult.success("同步成功");
}
private List<Tbasic> getInsertTbasic(List<Tbasic> oldBasicList, List<CardInfo> cardInfoList) {
private List<Tbasic> getInsertTbasic(List<Tbasic> oldBasicList, List<CardInfo> cardInfoList) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CardInfo> cardInfos = cardInfoList.stream().filter(f -> {
//根据病案号 名称 住院次数 出院时间 去重
String pno = f.getPatNo();
String name = f.getPatName();
Integer pNum = f.getPatNum();
Date outDate = f.getOutDate();
Tbasic tbasic = oldBasicList.stream().filter(o ->
ObjectUtil.equal(pno, o.getInpatientNo().toLowerCase(Locale.ROOT))
&& ObjectUtil.equal(name, o.getName())
&& ObjectUtil.equal(pNum, o.getAdmissTimes())
)
&& ObjectUtil.equal(pNum, o.getAdmissTimes())
&& sdf.format(outDate).equals(sdf.format(o.getDisDate())))
.findAny()
.orElse(null);
@ -282,7 +686,7 @@ public class SyncBasicDataImpl implements ISyncBasicDataService {
tbasic.setIsArchive(1);
tbasic.setArchiveFileStorageType(2);
tbasic.setCreateTime(new Date());
tbasic.setFileSource(2);
tbasic.setFileSource(3);
return tbasic;
}).collect(Collectors.toList());

@ -1,27 +1,48 @@
package com.docus.demo.service;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.docus.demo.dto.BasicSelectDto;
import com.docus.demo.dto.FileUploadJpgDto;
import com.docus.demo.dto.LianZhongUploadInfo;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.dto.SyncFileDto;
import com.docus.demo.entity.*;
import com.docus.demo.dto.UploadJpgFileParam;
import com.docus.demo.entity.CommonResult;
import com.docus.demo.entity.ScanAssort;
import com.docus.demo.entity.TCardInfo;
import com.docus.demo.entity.TPicture;
import com.docus.demo.entity.Tbasic;
import com.docus.demo.entity.TbasicSub;
import com.docus.demo.facade.BasicDeptService;
import com.docus.demo.facade.ISyncBasicFileService;
import com.docus.demo.mapper.mysql.BasicMapper;
import com.docus.demo.mapper.mysql.ScanAssortMapper;
import com.docus.demo.mapper.sqlserver.PictureMapper;
import com.docus.demo.utils.SnowflakeIdWorker;
import com.docus.demo.vo.BasicVo;
import com.github.xiaoymin.knife4j.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@ -34,8 +55,12 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
private PictureMapper pictureMapper;
@Resource
private ScanAssortMapper scanAssortMapper;
@Resource
private BasicDeptService basicDeptService;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Value("${savePath}")
private String savePath;
private final ExecutorService executor = new ThreadPoolExecutor(5, 10,
30L, TimeUnit.DAYS,
@ -119,7 +144,7 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
futures.add(future);
log.info("本次同步基础数据大小" + basicVoList.size());
}
for(CompletableFuture<Void> future:futures){
for (CompletableFuture<Void> future : futures) {
future.join();
}
}
@ -179,6 +204,568 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
return CommonResult.success("清理成功");
}
@Override
public CommonResult<?> fileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
// 校验上传的数据
if (Objects.isNull(uploadJpgFileParam) || Objects.isNull(uploadJpgFileParam.getUploadFileParams())) {
log.info("文件上传参数为空!");
return CommonResult.failed("文件上传参数为空!");
}
//解析文件上传参数
List<FileUploadJpgDto> fileUploadJpg = JSONArray.parseArray(uploadJpgFileParam.getUploadFileParams(), FileUploadJpgDto.class);
String patientId = fileUploadJpg.get(0).getPatientId();
Integer admissTimes = null;
if (fileUploadJpg.get(0).getAdmissTimes() == null) {
admissTimes = 0;
fileUploadJpg.get(0).setAdmissTimes(0);
} else {
admissTimes = fileUploadJpg.get(0).getAdmissTimes();
}
String admissId = fileUploadJpg.get(0).getAdmissId();
Date disDate = fileUploadJpg.get(0).getDisDate();
for (FileUploadJpgDto dto : fileUploadJpg) {
if (StrUtil.isBlank(dto.getPatientId())) {
log.info("PatientId为空");
return CommonResult.failed("PatientId不能为空");
}
}
if (fileUploadJpg.size() != files.length) {
log.info(patientId + "文件上传数量与参数不一致!");
return CommonResult.failed("文件上传数量与参数不一致");
}
// 参数不含上传的,不匹配
List<String> originalFileNames = fileUploadJpg.stream().map(item -> String.valueOf(item.getUploadFileName())).collect(Collectors.toList());
for (MultipartFile file : files) {
if (!originalFileNames.contains(file.getOriginalFilename())) {
log.info("文件名:" + file.getOriginalFilename() + "与病案号:" + patientId + "集合中文件名不匹配");
return CommonResult.failed("文件名:" + file.getOriginalFilename() + "与病案号:" + patientId + "集合中中文名不匹配");
}
}
final String source = "lianzhong";
List<TbasicSub> tbasicSubList = this.getTbasicSubList(fileUploadJpg);
//查询是否存在更新,不存在新增
Tbasic oldBasic = getOldTbasic(fileUploadJpg.get(0));
Tbasic tbasic = oldBasic;
if (oldBasic == null) {
ArrayList<Tbasic> tbasics = new ArrayList<>();
//组织基础数据
Tbasic addTbasic = this.getTbasic(fileUploadJpg);
tbasics.add(addTbasic);
basicDeptService.handleDept(tbasics);
tbasic = addTbasic;
basicMapper.addBasic(tbasics);
log.info("新增PatientId为:" + patientId + "的基础数据成功");
} else {
//删除tbasic拓展表
basicMapper.delTbasicSub(oldBasic.getPatientId());
}
for (TbasicSub sub : tbasicSubList) {
sub.setPatientId(tbasic.getPatientId());
}
basicMapper.insertOrUpdateTbasicSub(tbasicSubList);
// 删除旧联众文件数据、图像
if (oldBasic != null) {
List<ScanAssort> scanAssort = scanAssortMapper.getScanAssort(oldBasic.getPatientId(), source);
if (!CollectionUtils.isEmpty(scanAssort)) {
for (ScanAssort list : scanAssort) {
File file = new File(list.getImagePath() + File.separatorChar + list.getScanPage());
try {
file.delete(); // 删除照片
} catch (Exception e) {
e.printStackTrace();
}
}
}
scanAssortMapper.delScanAssort(oldBasic.getPatientId(), source);
}
// 保存文件和文件数据
String filePathdir = createDirectory(patientId, admissTimes, admissId, disDate);
//保存文件
ArrayList<ScanAssort> scanAssorts = new ArrayList<>();
for (MultipartFile file : files) {
for (FileUploadJpgDto dto : fileUploadJpg) {
//上传原文件名与实际文件名一致
if (dto.getUploadFileName().equals(file.getOriginalFilename())) {
//记录排序
final int[] sort = {0};
ScanAssort tScanAssortDto = addScanAssort(tbasic.getPatientId(), filePathdir, file, dto, sort);
if (Objects.isNull(tScanAssortDto)) {
log.info("病案主键:" + tbasic.getPatientId() + "中" + dto.getFileTitle() + "中保存失败");
} else {
tScanAssortDto.setSource(source);
scanAssorts.add(tScanAssortDto);
}
}
}
}
if (!scanAssortMapper.addScanAssort(scanAssorts)) {
log.info(patientId + "保存数据库失败");
return CommonResult.failed(patientId + "保存数据库失败");
}
log.info("本次传输成功病案主键为:" + patientId);
return CommonResult.success("上传完成");
}
@Override
public CommonResult<String> batchFileUploadJpg(MultipartFile[] files, UploadJpgFileParam uploadJpgFileParam) {
// 校验上传的数据
if (Objects.isNull(uploadJpgFileParam) || Objects.isNull(uploadJpgFileParam.getUploadFileParams())) {
log.info("文件上传参数为空!");
return CommonResult.failed("文件上传参数为空!");
}
//解析文件上传参数
List<FileUploadJpgDto> fileUploadJpg = JSONArray.parseArray(uploadJpgFileParam.getUploadFileParams(), FileUploadJpgDto.class);
String patientId = fileUploadJpg.get(0).getPatientId();
Integer admissTimes = null;
if (fileUploadJpg.get(0).getAdmissTimes() == null) {
admissTimes = 0;
fileUploadJpg.get(0).setAdmissTimes(0);
} else {
admissTimes = fileUploadJpg.get(0).getAdmissTimes();
}
String admissId = fileUploadJpg.get(0).getAdmissId();
Date disDate = fileUploadJpg.get(0).getDisDate();
for (FileUploadJpgDto dto : fileUploadJpg) {
if (StrUtil.isBlank(dto.getPatientId())) {
log.info("PatientId为空");
return CommonResult.failed("PatientId不能为空");
}
}
if (fileUploadJpg.size() != files.length) {
log.info(patientId + "文件上传数量与参数不一致!");
return CommonResult.failed("文件上传数量与参数不一致");
}
// 参数不含上传的,不匹配
List<String> originalFileNames = fileUploadJpg.stream().map(item -> String.valueOf(item.getUploadFileName())).collect(Collectors.toList());
for (MultipartFile file : files) {
if (!originalFileNames.contains(file.getOriginalFilename())) {
log.info("文件名:" + file.getOriginalFilename() + "与病案号:" + patientId + "集合中文件名不匹配");
return CommonResult.failed("文件名:" + file.getOriginalFilename() + "与病案号:" + patientId + "集合中中文名不匹配");
}
}
final String source = "lianzhong";
List<TbasicSub> tbasicSubList = this.getTbasicSubList(fileUploadJpg);
//查询是否存在更新,不存在新增
Tbasic oldBasic = getOldTbasic(fileUploadJpg.get(0));
Tbasic tbasic = oldBasic;
if (oldBasic == null) {
ArrayList<Tbasic> tbasics = new ArrayList<>();
//组织基础数据
Tbasic addTbasic = this.getTbasic(fileUploadJpg);
tbasics.add(addTbasic);
basicDeptService.handleDept(tbasics);
tbasic = addTbasic;
basicMapper.addBasic(tbasics);
log.info("批次新增PatientId为:" + patientId + "的基础数据成功");
} else {
//删除tbasic拓展表
basicMapper.delTbasicSub(oldBasic.getPatientId());
}
for (TbasicSub sub : tbasicSubList) {
sub.setPatientId(tbasic.getPatientId());
}
basicMapper.insertOrUpdateTbasicSub(tbasicSubList);
// 删除旧的存在的同名的联众文件数据、图像
if (oldBasic != null) {
List<ScanAssort> scanAssort = scanAssortMapper.getScanAssort(oldBasic.getPatientId(), source);
if (!CollectionUtils.isEmpty(scanAssort)) {
for (MultipartFile file : files) {
String originalFilename = file.getOriginalFilename();
for (ScanAssort assort : scanAssort) {
if (originalFilename.equals(assort.getScanPage())) {
File oldFile = new File(assort.getImagePath() + File.separatorChar + assort.getScanPage());
try {
oldFile.delete(); // 删除照片
int i = scanAssortMapper.delScanAssortById(assort.getId());
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
// 保存文件和文件数据
String filePathdir = createDirectory(patientId, admissTimes, admissId, disDate);
//保存文件
ArrayList<ScanAssort> scanAssorts = new ArrayList<>();
for (MultipartFile file : files) {
for (FileUploadJpgDto dto : fileUploadJpg) {
//上传原文件名与实际文件名一致
if (dto.getUploadFileName().equals(file.getOriginalFilename())) {
//记录排序
final int[] sort = {0};
ScanAssort tScanAssortDto = addScanAssort(tbasic.getPatientId(), filePathdir, file, dto, sort);
if (Objects.isNull(tScanAssortDto)) {
log.info("批次病案主键:" + tbasic.getPatientId() + "中" + dto.getFileTitle() + "中保存失败");
} else {
tScanAssortDto.setSource(source);
scanAssorts.add(tScanAssortDto);
}
}
}
}
if (!scanAssortMapper.addScanAssort(scanAssorts)) {
log.info(patientId + "保存数据库失败");
return CommonResult.failed(patientId + "保存数据库失败");
}
log.info("本次批次传输成功病案主键为:" + patientId);
return CommonResult.success("上传完成");
}
@Override
public void lianZhongBatchFileUploadJpg(MultipartFile[] files, LianZhongUploadInfo lianZhongUploadInfo) {
final String source = "lianzhong";
LianZhongUploadInfo.PatientInfo patientInfo = lianZhongUploadInfo.getPatientInfo();
List<LianZhongUploadInfo.FileInfo> fileInfos = lianZhongUploadInfo.getFileInfos();
boolean isDelAll = 1 == lianZhongUploadInfo.getDelAllFile();
//解析文件上传参数
if (fileInfos.size() != files.length) {
throw new RuntimeException("文件上传数量与参数不一致!");
}
// 参数不含上传的,不匹配
List<String> originalFileNames = fileInfos.stream().map(item -> String.valueOf(item.getUploadFileName())).collect(Collectors.toList());
for (MultipartFile file : files) {
if (!originalFileNames.contains(file.getOriginalFilename())) {
throw new RuntimeException("文件名:" + file.getOriginalFilename() + "与病案号:" + patientInfo.getInpatientNo() + "集合中中文名不匹配");
}
}
Tbasic oldBasic = getOldTbasic(patientInfo);
Tbasic tbasic = oldBasic;
if (oldBasic == null) {
ArrayList<Tbasic> tbasics = new ArrayList<>();
//组织基础数据
Tbasic addTbasic = getTbasic(patientInfo);
tbasics.add(addTbasic);
basicDeptService.handleDept(tbasics);
basicMapper.addBasic(tbasics);
tbasic = addTbasic;
}
// 如判断参数如果不是删除全部,删除旧的存在的同名的联众文件数据、图像
if (oldBasic != null) {
List<ScanAssort> scanAssort = scanAssortMapper.getScanAssort(oldBasic.getPatientId(), source);
if (!CollectionUtils.isEmpty(scanAssort)) {
if (isDelAll) {
for (ScanAssort assort : scanAssort) {
File oldFile = new File(assort.getImagePath() + File.separatorChar + assort.getScanPage());
oldFile.delete(); // 删除照片
}
scanAssortMapper.delScanAssort(oldBasic.getPatientId(), source);
} else {
for (MultipartFile file : files) {
String originalFilename = file.getOriginalFilename();
for (ScanAssort assort : scanAssort) {
if (originalFilename.equals(assort.getScanPage())) {
File oldFile = new File(assort.getImagePath() + File.separatorChar + assort.getScanPage());
try {
oldFile.delete(); // 删除照片
scanAssortMapper.delScanAssortById(assort.getId());
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
// 保存文件和文件数据
String filePathdir = createDirectory(tbasic);
//保存文件
ArrayList<ScanAssort> scanAssorts = new ArrayList<>();
for (MultipartFile file : files) {
for (LianZhongUploadInfo.FileInfo fileInfo : fileInfos) {
//上传原文件名与实际文件名一致
if (fileInfo.getUploadFileName().equals(file.getOriginalFilename())) {
//记录排序
final int[] sort = {0};
ScanAssort tScanAssortDto = addScanAssort(tbasic.getPatientId(), filePathdir, file, fileInfo);
if (Objects.isNull(tScanAssortDto)) {
log.info("批次病案主键:" + tbasic.getPatientId() + "中" + fileInfo.getFileTitle() + "中保存失败");
} else {
tScanAssortDto.setSource(source);
scanAssorts.add(tScanAssortDto);
}
}
}
}
if (!scanAssortMapper.addScanAssort(scanAssorts)) {
throw new RuntimeException(tbasic.getPatientId() + "保存文件数据库失败");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
log.info("联众同步文件上传,本次批次传输成功病案号码为:{}({})", tbasic.getInpatientNo(), sdf.format(tbasic.getDisDate()));
}
public static void main(String[] args) {
System.out.println("660000000000202160505".substring(2));
System.out.println("660000000000202160505".substring(12));
}
private ScanAssort addScanAssort(String patientId, String filePathdir, MultipartFile file, LianZhongUploadInfo.FileInfo fileInfo) {
//文件保存地址
String toJpgFilePath = filePathdir + File.separatorChar + fileInfo.getUploadFileName();
try {
file.transferTo(new File(toJpgFilePath));
} catch (IOException e) {
log.error("将jpg文件保存本地失败" + fileInfo.getUploadFileName() + "," + e.getMessage(), e);
return null;
}
//组织新数据
ScanAssort scanAssort = new ScanAssort();
scanAssort.setId(SnowflakeIdWorker.idWorker.nextId());
scanAssort.setPatientId(patientId);
scanAssort.setAssortId(fileInfo.getAssortId());
scanAssort.setFileTitle(fileInfo.getFileTitle());
scanAssort.setImagePath(filePathdir);
scanAssort.setCreateTime(new Date());
scanAssort.setScanPage(fileInfo.getUploadFileName());
scanAssort.setSort(fileInfo.getSort());
scanAssort.setFileSource(2);
scanAssort.setFileStorageType(1);
scanAssort.setFilePages(1);
scanAssort.setCreater("lianzhong-sync");
return scanAssort;
}
private String createDirectory(Tbasic tbasic) {
//根据年/月/日/住院号/patientId生成目录
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date disDate = tbasic.getDisDate();
String inpatientNo = tbasic.getInpatientNo();
String patientId = tbasic.getPatientId();
String disDateTime = sdf.format(disDate);
String[] parts = disDateTime.split("-");
String year = parts[0];
String month = parts[1];
String day = parts[2];
//文件保存目录
String filePathdir = savePath
+ File.separatorChar + year
+ File.separatorChar + month
+ File.separatorChar + day
+ File.separatorChar + inpatientNo
+ patientId;
File filePath = new File(filePathdir);
//判断文件夹是否存在不存在创建文件夹
if (!filePath.exists()) {
filePath.mkdirs();
}
return filePathdir;
}
private Tbasic getOldTbasic(LianZhongUploadInfo.PatientInfo patientInfo) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String inpatientNo = patientInfo.getInpatientNo();
Date disDate = sdf2.parse(patientInfo.getDisDate());
String name = patientInfo.getName();
List<String> inpatientNos = Collections.singletonList(inpatientNo);
SyncBasicDataDto dto = new SyncBasicDataDto();
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(inpatientNos, dto);
for (Tbasic tbasic : oldBasicList) {
// 名字,病案号,出院日期 相同 ,认为是一个数据
if (ObjectUtil.equals(tbasic.getName(), name)
&& tbasic.getInpatientNo().equalsIgnoreCase(inpatientNo)
&& sdf.format(disDate).equals(sdf.format(tbasic.getDisDate()))) {
return tbasic;
}
}
return null;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private Tbasic getOldTbasic(FileUploadJpgDto fileUploadJpgDto) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// String admissId = fileUploadJpgDto.getAdmissId();
// Tbasic getByAdmissId = basicMapper.getTbasicByAdmissId(admissId);
// if (getByAdmissId != null) {
// return getByAdmissId;
// }
String jpgDtoInpatientNo = fileUploadJpgDto.getInpatientNo();
Integer jpgDtoAdmissTimes = fileUploadJpgDto.getAdmissTimes();
Date jpgDtoDisDate = fileUploadJpgDto.getDisDate();
List<String> inpatientNos = Collections.singletonList(jpgDtoInpatientNo);
SyncBasicDataDto dto = new SyncBasicDataDto();
List<Tbasic> oldBasicList = basicMapper.getOldBasicList(inpatientNos, dto);
for (Tbasic tbasic : oldBasicList) {
// 名字,病案号,住院次数,出院时间 相同 ,人为是一个数据
if (ObjectUtil.equals(tbasic.getName(), fileUploadJpgDto.getName())
&& tbasic.getInpatientNo().equalsIgnoreCase(jpgDtoInpatientNo)
&& ObjectUtil.equals(jpgDtoAdmissTimes, tbasic.getAdmissTimes())
&& sdf.format(jpgDtoDisDate).equals(sdf.format(tbasic.getDisDate()))) {
return tbasic;
}
}
return null;
}
private String createDirectory(String patientId, Integer admissTimes, String admissId, Date disDate) {
//根据年/月/日/住院号_住院次数/patientId生成目录
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String disDateTime = sdf.format(disDate);
String[] parts = disDateTime.split("-");
String year = parts[0];
String month = parts[1];
String day = parts[2];
//文件保存目录
String filePathdir = savePath + File.separatorChar + year + File.separatorChar + month + File.separatorChar + day + File.separatorChar + admissId + "_" + admissTimes + File.separatorChar + patientId;
File filePath = new File(filePathdir);
//判断文件夹是否存在不存在创建文件夹
if (!filePath.exists()) {
filePath.mkdirs();
}
return filePathdir;
}
private List<TbasicSub> getTbasicSubList(List<FileUploadJpgDto> tbasicList) {
return tbasicList.stream().map(m -> {
TbasicSub tbasicSub = new TbasicSub();
tbasicSub.setBirthday(m.getBirthday());
tbasicSub.setPatientId(m.getPatientId());
return tbasicSub;
}).collect(Collectors.toList());
}
private ScanAssort addScanAssort(String patientId, String filePathdir, MultipartFile file, FileUploadJpgDto dto, int[] sort) {
//文件保存地址
String toJpgFilePath = filePathdir + File.separatorChar + dto.getUploadFileName();
try {
file.transferTo(new File(toJpgFilePath));
} catch (IOException e) {
log.info("将jpg文件保存本地失败" + dto.getUploadFileName() + "," + e.getMessage());
return null;
}
//组织新数据
ScanAssort scanAssort = new ScanAssort();
scanAssort.setId(SnowflakeIdWorker.idWorker.nextId());
scanAssort.setPatientId(patientId);
scanAssort.setAssortId(dto.getAssortId());
scanAssort.setFileTitle(dto.getFileTitle());
scanAssort.setImagePath(filePathdir);
scanAssort.setCreateTime(new Date());
scanAssort.setScanPage(dto.getUploadFileName());
scanAssort.setSort(sort[0]);
scanAssort.setFileSource(2);
scanAssort.setFileStorageType(1);
scanAssort.setFilePages(1);
scanAssort.setCreater("admin");
sort[0] += 1;
return scanAssort;
}
private Tbasic getTbasic(LianZhongUploadInfo.PatientInfo patientInfo) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Tbasic addTbasic = new Tbasic();
addTbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId()));
addTbasic.setAdmissTimes(patientInfo.getAdmissTimes());
addTbasic.setInpatientNo(patientInfo.getInpatientNo());
addTbasic.setName(patientInfo.getName());
addTbasic.setSex(patientInfo.getSex());
addTbasic.setSexName(patientInfo.getSexName());
addTbasic.setAge(patientInfo.getAge());
addTbasic.setIdCard(patientInfo.getIdCard());
try {
addTbasic.setAdmissDate(cn.hutool.core.util.StrUtil.isBlank(patientInfo.getAdmissDate()) ? null : sdf.parse(patientInfo.getAdmissDate()));
addTbasic.setDisDate(sdf.parse(patientInfo.getDisDate()));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
addTbasic.setAdmissDeptName(patientInfo.getAdmissDeptName());
addTbasic.setDisDeptName(patientInfo.getDisDeptName());
addTbasic.setMainDiagName(patientInfo.getMainDiagName());
addTbasic.setMainDiagCode(patientInfo.getMainDiagCode());
addTbasic.setMainOperateName(patientInfo.getMainOperateName());
addTbasic.setMainOperateCode(patientInfo.getMainOperateCode());
addTbasic.setBColumn8(1);
addTbasic.setIsArchive(1);
addTbasic.setArchiveFileStorageType(2);
addTbasic.setCreateTime(new Date());
addTbasic.setFileSource(3);
addTbasic.setScanSource("1");
addTbasic.setScanUploadState(1);
return addTbasic;
}
private Tbasic getTbasic(List<FileUploadJpgDto> fileUploadJpg) {
FileUploadJpgDto fileUploadJpgDto = fileUploadJpg.get(0);
Tbasic addTbasic = new Tbasic();
addTbasic.setPatientId(String.valueOf(SnowflakeIdWorker.idWorker.nextId()));
addTbasic.setAdmissTimes(fileUploadJpgDto.getAdmissTimes());
if (addTbasic.getAdmissTimes() == null) {
addTbasic.setAdmissTimes(0);
}
addTbasic.setInpatientNo(fileUploadJpgDto.getInpatientNo());
addTbasic.setAdmissId(fileUploadJpgDto.getAdmissId());
addTbasic.setName(fileUploadJpgDto.getName());
addTbasic.setSex(fileUploadJpgDto.getSex());
addTbasic.setAge(fileUploadJpgDto.getAge());
if (StringUtils.isNotBlank(fileUploadJpgDto.getIdCard())) {
addTbasic.setIdCard(fileUploadJpgDto.getIdCard());
}
addTbasic.setAdmissDate(fileUploadJpgDto.getAdmissDate());
if (StringUtils.isNotBlank(fileUploadJpgDto.getAdmissDept())) {
addTbasic.setAdmissDept(fileUploadJpgDto.getAdmissDept());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getAdmissDeptName())) {
addTbasic.setAdmissDeptName(fileUploadJpgDto.getAdmissDeptName());
}
addTbasic.setDisDate(fileUploadJpgDto.getDisDate());
if (StringUtils.isNotBlank(fileUploadJpgDto.getDisDept())) {
addTbasic.setDisDept(fileUploadJpgDto.getDisDept());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getDisDeptName())) {
addTbasic.setDisDeptName(fileUploadJpgDto.getDisDeptName());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getMainDiagName())) {
addTbasic.setMainDiagName(fileUploadJpgDto.getMainDiagName());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getMainDiagCode())) {
addTbasic.setMainDiagCode(fileUploadJpgDto.getMainDiagCode());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getMainOperateName())) {
addTbasic.setMainOperateName(fileUploadJpgDto.getMainOperateName());
}
if (StringUtils.isNotBlank(fileUploadJpgDto.getMainOperateCode())) {
addTbasic.setMainOperateCode(fileUploadJpgDto.getMainOperateCode());
}
addTbasic.setBColumn8(1);
addTbasic.setIsArchive(1);
addTbasic.setArchiveFileStorageType(2);
addTbasic.setCreateTime(new Date());
addTbasic.setFileSource(3);
addTbasic.setWardPalce(fileUploadJpgDto.getWardPalce());
addTbasic.setScanSource("1");
addTbasic.setScanUploadState(1);
return addTbasic;
}
private List<ScanAssort> handleUpdateOrInsert(List<ScanAssort> oldScanAssort, List<ScanAssort> scanAssortList) {
//如果没有旧数据 做全量插入
@ -262,9 +849,6 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
boolean savePicFlag = false;
// 2.2jp2转化jpg 图片通过文件流写到挂在的盘符
// savePicFlag = ImageUtils.getInstance().savePic(inPutFile, outFile, tpicture.getRotateDegree());
// log.info("是否转换成功"+savePicFlag);
@ -277,7 +861,7 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
// 2.4组合文件信息
ScanAssort scanAssort = new ScanAssort();
synchronized (this){
synchronized (this) {
scanAssort.setId(SnowflakeIdWorker.idWorker.nextId());
scanAssort.setPatientId(basicVo.getPatientId());
scanAssort.setAssortId(tpicture.getPicKind());
@ -292,7 +876,7 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
sort[0] += 1;
}
String cmd = "C:\\Debug\\lianzhong.exe 003 192.168.8.74 " + tCardInfo.getId() + " " + tpicture.getPicId() + " " + tCardInfo.getPatno() + " " + format + " " + picName + ".jpg " + outFile + " http://192.168.8.74"+tpicture.getRotateDegree();
String cmd = "C:\\Debug\\lianzhong.exe 003 192.168.8.74 " + tCardInfo.getId() + " " + tpicture.getPicId() + " " + tCardInfo.getPatno() + " " + format + " " + picName + ".jpg " + outFile + " http://192.168.8.74" + tpicture.getRotateDegree();
try {
Process exec = Runtime.getRuntime().exec(cmd);
int i = exec.waitFor();
@ -312,13 +896,13 @@ public class SyncBasicFileImpl implements ISyncBasicFileService {
scanAssortList.add(scanAssort);
},executor);
}, executor);
// 获取异步任务的结果
futures.add(future);
}
for(CompletableFuture<Void> future:futures){
for (CompletableFuture<Void> future : futures) {
future.join();
}

@ -5,7 +5,12 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.webservice.SoapClient;
import com.docus.demo.dto.SyncBasicDataDto;
import com.docus.demo.entity.*;
import com.docus.demo.dto.SyncLabReportDto;
import com.docus.demo.entity.CommonResult;
import com.docus.demo.entity.PatientListResult;
import com.docus.demo.entity.PatientReportResult;
import com.docus.demo.entity.ScanAssort;
import com.docus.demo.entity.Tbasic;
import com.docus.demo.facade.IWebService;
import com.docus.demo.mapper.mysql.BasicMapper;
import com.docus.demo.mapper.mysql.ScanAssortMapper;
@ -18,8 +23,11 @@ import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -40,118 +48,141 @@ public class WebServiceImpl implements IWebService {
@Override
public CommonResult<?> syncInspection(SyncBasicDataDto syncBasicDataDto) {
CompletableFuture.runAsync(() -> {
try {
//页码
int current;
//每页1000条数据
int limit = syncBasicDataDto.getLimit();
for (current = 1; ; current++) {
//查询基础数据
List<Tbasic> tbasicList = basicMapper.getOldBasicListLimit((current - 1) * limit, limit, syncBasicDataDto.getInpatientNoList(), syncBasicDataDto);
log.info("病案大小" + tbasicList.size());
if (tbasicList.size() == 0) {
break;
}
for (int j = 0; j < tbasicList.size(); j++) {
try {
//页码
int current;
//每页1000条数据
int limit = syncBasicDataDto.getLimit();
String StartDate = "2018-01-01 00:00:00";
String EndDate = "2025-01-01 00:00:00";
for (current = 1; ; current++) {
//查询基础数据
List<Tbasic> tbasicList = basicMapper.getOldBasicListLimit((current - 1) * limit, limit, syncBasicDataDto.getInpatientNoList(), syncBasicDataDto);
log.info("病案大小" + tbasicList.size());
if (tbasicList.size() == 0) {
break;
}
for (int j = 0; j < tbasicList.size(); j++) {
Tbasic tbasic = tbasicList.get(j);
syncInspection(tbasic, StartDate, EndDate);
}
log.info("业务结束");
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
Tbasic tbasic = tbasicList.get(j);
log.info("正在同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
return CommonResult.success("同步检验数据成功");
}
@Override
public void syncLabReport(SyncLabReportDto syncLabReportDto) {
//页码
int offset = 0;
//每页1000条数据
int limit = 1000;
String startDate = syncLabReportDto.getStartDate();
String endDate = syncLabReportDto.getEndDate();
List<SyncLabReportDto.SyncLabReportBasicDto> basicDtoList = syncLabReportDto.getBasicDtoList();
for (SyncLabReportDto.SyncLabReportBasicDto syncLabReportBasicDto : basicDtoList) {
String disDate = syncLabReportBasicDto.getDisDate();
String inpatientNo = syncLabReportBasicDto.getInpatientNo();
SyncBasicDataDto syncBasicDataDto = new SyncBasicDataDto();
syncBasicDataDto.setStartDate(disDate + " 00:00:00");
syncBasicDataDto.setEndDate(disDate + " 23:59:59");
List<Tbasic> tbasicList = basicMapper.getOldBasicListLimit(offset, limit, Collections.singletonList(inpatientNo), syncBasicDataDto);
for (Tbasic tbasic : tbasicList) {
syncInspection(tbasic, startDate, endDate);
}
}
}
List<ScanAssort> oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", tbasic.getPatientId());
log.info("旧数据" + oldScanAssortList.size());
if (oldScanAssortList.size()>0){
log.info("跳过同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
continue;
}
@Override
public void syncInspection(Tbasic tbasic, String startDate, String endDate) {
log.info("正在同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
List<ScanAssort> oldScanAssortList = scanAssortMapper.getListByAssortId("A5A7AA6796D1715A2F1E35699C706C84", tbasic.getPatientId());
log.info("旧数据" + oldScanAssortList.size());
if (oldScanAssortList.size() > 0) {
log.info("跳过同步" + tbasic.getInpatientNo() + " " + tbasic.getAdmissTimes());
return;
}
String pNo = tbasic.getInpatientNo();
String times = tbasic.getAdmissTimes().toString();
String pNo = tbasic.getInpatientNo();
String times = tbasic.getAdmissTimes().toString();
// String StartDate = sdf.format(tbasic.getAdmissDate());
// String EndDate = sdf.format(tbasic.getDisDate());
String StartDate = "2018-01-01 00:00:00";
String EndDate = "2025-01-01 00:00:00";
String patientId = tbasic.getPatientId();
//获取所有的报告列表
PatientListResult patientListResult = getCommonResult(pNo, times, StartDate, EndDate);
String patientId = tbasic.getPatientId();
//获取所有的报告列表
PatientListResult patientListResult = getCommonResult(pNo, times, startDate, endDate);
// log.info("返回结果"+patientListResult);
if (patientListResult == null) {
log.error(pNo + " " + times + "调用失败");
continue;
}
if (patientListResult == null) {
log.error(pNo + " " + times + "调用失败");
return;
}
List<ScanAssort> scanAssortList = new ArrayList<>();
List<ScanAssort> scanAssortList = new ArrayList<>();
for (int i = 0; i < patientListResult.getResult().getPidReportMain().size(); i++) {
//根据旧数据判断是否需要做同步
PatientListResult.Result.ReportInfo item = patientListResult.getResult().getPidReportMain().get(i);
for (int i = 0; i < patientListResult.getResult().getPidReportMain().size(); i++) {
//根据旧数据判断是否需要做同步
PatientListResult.Result.ReportInfo item = patientListResult.getResult().getPidReportMain().get(i);
// ScanAssort oldAssort = oldScanAssortList.stream()
// .filter(f -> f.getFileTitle().equals(item.getPidComName())).findAny().orElse(null);
String root = "F:\\jianyan" + File.separator
+ tbasic.getInpatientNo() + File.separator
+ tbasic.getAdmissTimes();
String root = "F:\\jianyan" + File.separator
+ tbasic.getInpatientNo() + File.separator
+ tbasic.getAdmissTimes();
// log.info("开始转换"+root);
//时间段内如果查询到住院次数相同的数据 则数据入库
if (item.getPidAddmissTimes().equals(times) && item.getPidInNo().equals(pNo)) {
log.info("正在同步" + item.getPidComName() + i);
//时间段内如果查询到住院次数相同的数据 则数据入库
if (item.getPidAddmissTimes().equals(times) && item.getPidInNo().equalsIgnoreCase(pNo)) {
log.info("正在同步" + item.getPidComName() + i);
// log.info("进入条件");
PatientReportResult patientReportResult = this.getReportResult(item.getRepId());
String base64Result = patientReportResult.getResult().getPatient().getPatientReport();
List<ScanAssort> addScanList = new ArrayList<>();
try {
log.info("开始转换");
addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), i);
log.info("转换结束");
} catch (IOException e) {
log.error("检验pdf转化出错" + e.getMessage(),e);
}
addScanList.forEach(scanAssort -> {
ScanAssort oldAssort = oldScanAssortList.stream()
.filter(f -> f.getScanPage().equals(scanAssort.getScanPage())).findAny().orElse(null);
if (oldAssort != null) {
scanAssort.setId(oldAssort.getId());
} else {
scanAssort.setId(snowflakeIdWorker.nextId());
}
scanAssort.setPatientId(patientId);
scanAssortList.add(scanAssort);
log.info("结果" + scanAssort);
});
}
}
//数据写入到3.0
if (ObjectUtil.isNotEmpty(scanAssortList)) {
log.info("开始写入" + scanAssortList.size());
scanAssortMapper.insertOrUpdateBatch(scanAssortList);
log.info("写入结束" + scanAssortList.size());
}
}
log.info("业务结束");
}
} catch (Exception e) {
log.error(e.getMessage(), e);
List<ScanAssort> addScanList = new ArrayList<>();
String base64Result;
try {
PatientReportResult patientReportResult = this.getReportResult(item.getRepId());
base64Result = patientReportResult.getResult().getPatient().getPatientReport();
} catch (Exception ex) {
log.error("检验报告id{} 获取报告出错了!", item.getRepId());
continue;
}
try {
log.info("开始转换");
addScanList = PDFFileUtils.base64StringToPDF(base64Result, root, item.getRepId(), item.getPidComName(), i);
log.info("转换结束");
} catch (IOException e) {
log.error("检验pdf转化出错" + e.getMessage(), e);
}
addScanList.forEach(scanAssort -> {
ScanAssort oldAssort = oldScanAssortList.stream()
.filter(f -> f.getScanPage().equals(scanAssort.getScanPage())).findAny().orElse(null);
if (oldAssort != null) {
scanAssort.setId(oldAssort.getId());
} else {
scanAssort.setId(snowflakeIdWorker.nextId());
}
scanAssort.setPatientId(patientId);
scanAssortList.add(scanAssort);
log.info("结果" + scanAssort);
});
}
}
}, executor);
return CommonResult.success("同步检验数据成功");
//数据写入到3.0
if (ObjectUtil.isNotEmpty(scanAssortList)) {
log.info("开始写入" + scanAssortList.size());
scanAssortMapper.insertOrUpdateBatch(scanAssortList);
log.info("写入结束" + scanAssortList.size());
}
}
private PatientReportResult getReportResult(String repID) {

@ -1,855 +1,8 @@
package com.docus.demo.test;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.XmlUtil;
import com.docus.demo.entity.PatientReportResult;
import java.util.Map;
public class test {
public static void main(String[] args) {
String result = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
" <soap:Body>\n" +
" <DCLInterfaceResponse xmlns=\"http://dcl.org/\">\n" +
" <DCLInterfaceResult><![CDATA[<?xml version=\"1.0\"?>\n" +
"<Response>\n" +
" <ResultCode>0</ResultCode>\n" +
" <ResultContent>成功</ResultContent>\n" +
" <Result>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>1015120230221969</RepId>\n" +
" <RepSid>969</RepSid>\n" +
" <ComId>10533</ComId>\n" +
" <PidComName>血气分析</PidComName>\n" +
" <RepInDate>2023-02-21 11:42:56</RepInDate>\n" +
" <LrName>钟阳</LrName>\n" +
" <RepCheckUserName>钟阳</RepCheckUserName>\n" +
" <RepReportUserName>罗丽香</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 11:43:30</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10151</RepItrId>\n" +
" <RepItrName>ABL90</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 09:47:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>4839378675</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10039</PidSamId>\n" +
" <SamName>动脉血</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>2013n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>4</RepReportUserId>\n" +
" <PidDiag>2型糖尿病伴有并发症</PidDiag>\n" +
" <RepCheckUserId>58</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10100202302226</RepId>\n" +
" <RepSid>6</RepSid>\n" +
" <ComId>12010</ComId>\n" +
" <PidComName>血常规+Ret</PidComName>\n" +
" <RepInDate>2023-02-22 08:11:56</RepInDate>\n" +
" <LrName>骆炽斌</LrName>\n" +
" <RepCheckUserName>骆炽斌</RepCheckUserName>\n" +
" <RepReportUserName>骆炽斌</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-22 08:49:59</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10100</RepItrId>\n" +
" <RepItrName>XN550</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-22 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>4639384289</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10051</PidSamId>\n" +
" <SamName>全血</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>1001bn</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>67</RepReportUserId>\n" +
" <PidDiag>2型糖尿病伴有并发症</PidDiag>\n" +
" <RepCheckUserId>67</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/22 6:42:00</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>1005220230228139</RepId>\n" +
" <RepSid>139</RepSid>\n" +
" <ComId>11283</ComId>\n" +
" <PidComName>14C-尿素呼气试验</PidComName>\n" +
" <RepInDate>2023-02-28 00:00:00</RepInDate>\n" +
" <LrName>戴寿军*</LrName>\n" +
" <RepCheckUserName>戴寿军*</RepCheckUserName>\n" +
" <RepReportUserName>戴寿军*</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-28 16:04:40</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10052</RepItrId>\n" +
" <RepItrName>消化录</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-24 08:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2939424061</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10123</PidSamId>\n" +
" <SamName>呼出气</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>\n" +
" </OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>201</RepReportUserId>\n" +
" <PidDiag>2型糖尿病伴有并发症</PidDiag>\n" +
" <RepCheckUserId>201</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10376202302243039408060</RepId>\n" +
" <RepSid>3039408060</RepSid>\n" +
" <ComId>10450</ComId>\n" +
" <PidComName>尿液分析+尿沉渣定量</PidComName>\n" +
" <RepInDate>2023-02-24 07:29:13</RepInDate>\n" +
" <LrName>梁广铁</LrName>\n" +
" <RepCheckUserName>梁广铁</RepCheckUserName>\n" +
" <RepReportUserName>骆炽斌</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-24 07:38:11</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10376</RepItrId>\n" +
" <RepItrName>罗氏cobas6500A</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-24 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3039408060</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10037</PidSamId>\n" +
" <SamName>尿液</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>1004n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>67</RepReportUserId>\n" +
" <PidDiag>2型糖尿病伴有并发症</PidDiag>\n" +
" <RepCheckUserId>54</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10245202302214139363098</RepId>\n" +
" <RepSid>4139363098</RepSid>\n" +
" <ComId>11310</ComId>\n" +
" <PidComName>糖化血红蛋白</PidComName>\n" +
" <RepInDate>2023-02-21 08:13:37</RepInDate>\n" +
" <LrName>庄秋容</LrName>\n" +
" <RepCheckUserName>庄秋容</RepCheckUserName>\n" +
" <RepReportUserName>叶俊辉</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 10:46:59</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10245</RepItrId>\n" +
" <RepItrName>HA8180</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>4139363098</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10051</PidSamId>\n" +
" <SamName>全血</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>7016n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>50</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>7</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/21 6:45:39</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10104202302213239363107</RepId>\n" +
" <RepSid>3239363107</RepSid>\n" +
" <ComId>10666</ComId>\n" +
" <PidComName>尿微量白蛋白</PidComName>\n" +
" <RepInDate>2023-02-21 09:43:00</RepInDate>\n" +
" <LrName>钟志敏</LrName>\n" +
" <RepCheckUserName>钟志敏</RepCheckUserName>\n" +
" <RepReportUserName>李焕庭</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 14:20:10</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10104</RepItrId>\n" +
" <RepItrName>特种蛋白分析仪</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3239363107</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10037</PidSamId>\n" +
" <SamName>尿液</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>4077n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>46</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>14</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10316202302212539363100</RepId>\n" +
" <RepSid>2539363100</RepSid>\n" +
" <ComId>10552,10557</ComId>\n" +
" <PidComName>C-P空腹+FT3FT4TSH</PidComName>\n" +
" <RepInDate>2023-02-21 08:28:40</RepInDate>\n" +
" <LrName>李焕庭</LrName>\n" +
" <RepCheckUserName>李焕庭</RepCheckUserName>\n" +
" <RepReportUserName>唐彦如</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 09:50:09</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10316</RepItrId>\n" +
" <RepItrName>罗氏Infinity流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2539363100</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>\n" +
" </PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>4132n,4103n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>72</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>46</RepCheckUserId>\n" +
" <PidTel>\n" +
" </PidTel>\n" +
" <SampCollectionDate>2023/2/21 6:45:38</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10376202302212939363104</RepId>\n" +
" <RepSid>2939363104</RepSid>\n" +
" <ComId>10450</ComId>\n" +
" <PidComName>尿液分析+尿沉渣定量</PidComName>\n" +
" <RepInDate>2023-02-21 00:48:44</RepInDate>\n" +
" <LrName>熊海娜</LrName>\n" +
" <RepCheckUserName>熊海娜</RepCheckUserName>\n" +
" <RepReportUserName>汤勇才</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 09:42:57</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10376</RepItrId>\n" +
" <RepItrName>罗氏cobas6500A</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2939363104</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10037</PidSamId>\n" +
" <SamName>尿液</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>1004n</OrderCode>\n" +
" <RepRemark>标本已复查</RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>24</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>3</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10328202302222739363102</RepId>\n" +
" <RepSid>2739363102</RepSid>\n" +
" <ComId>11087</ComId>\n" +
" <PidComName>24小时尿蛋白定量</PidComName>\n" +
" <RepInDate>2023-02-22 09:57:34</RepInDate>\n" +
" <LrName>李结秋</LrName>\n" +
" <RepCheckUserName>李结秋</RepCheckUserName>\n" +
" <RepReportUserName>戴卉</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-22 11:16:31</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10328</RepItrId>\n" +
" <RepItrName>贝克曼流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2739363102</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10037</PidSamId>\n" +
" <SamName>尿液</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>3042n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>36</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>26</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>\n" +
" </SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10141202302204239363099</RepId>\n" +
" <RepSid>4239363099</RepSid>\n" +
" <ComId>12227</ComId>\n" +
" <PidComName>生化八项(急查)</PidComName>\n" +
" <RepInDate>2023-02-20 12:21:08</RepInDate>\n" +
" <LrName>李结秋</LrName>\n" +
" <RepCheckUserName>李结秋</RepCheckUserName>\n" +
" <RepReportUserName>戴卉</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-20 13:00:19</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10141</RepItrId>\n" +
" <RepItrName>VI5600</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-20 10:48:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>4239363099</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>3078n</OrderCode>\n" +
" <RepRemark>标本已复查</RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>36</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>26</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/20 11:12:53</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10263202302203039363105</RepId>\n" +
" <RepSid>3039363105</RepSid>\n" +
" <ComId>10427</ComId>\n" +
" <PidComName>D-二聚体(D-DI)</PidComName>\n" +
" <RepInDate>2023-02-20 12:18:05</RepInDate>\n" +
" <LrName>杨英为</LrName>\n" +
" <RepCheckUserName>杨英为</RepCheckUserName>\n" +
" <RepReportUserName>孙娟</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-20 12:36:12</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10263</RepItrId>\n" +
" <RepItrName>STAGO血凝仪-1</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-20 10:48:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3039363105</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10029</PidSamId>\n" +
" <SamName>血浆</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>7028n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>602</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>17</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/20 11:12:52</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10316202302212839363103</RepId>\n" +
" <RepSid>2839363103</RepSid>\n" +
" <ComId>10549</ComId>\n" +
" <PidComName>C-P餐后2小时</PidComName>\n" +
" <RepInDate>2023-02-21 11:52:00</RepInDate>\n" +
" <LrName>李焕庭</LrName>\n" +
" <RepCheckUserName>李焕庭</RepCheckUserName>\n" +
" <RepReportUserName>唐彦如</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 12:19:42</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10316</RepItrId>\n" +
" <RepItrName>罗氏Infinity流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2839363103</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>\n" +
" </PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>4135n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>72</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>46</RepCheckUserId>\n" +
" <PidTel>\n" +
" </PidTel>\n" +
" <SampCollectionDate>2023/2/21 10:27:15</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10370202302203139363106</RepId>\n" +
" <RepSid>3139363106</RepSid>\n" +
" <ComId>12010</ComId>\n" +
" <PidComName>血常规+Ret</PidComName>\n" +
" <RepInDate>2023-02-20 11:52:04</RepInDate>\n" +
" <LrName>杨爽</LrName>\n" +
" <RepCheckUserName>杨爽</RepCheckUserName>\n" +
" <RepReportUserName>孙娟</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-20 11:59:10</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10370</RepItrId>\n" +
" <RepItrName>XN9100</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-20 10:48:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3139363106</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10051</PidSamId>\n" +
" <SamName>全血</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>1001bn</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>602</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>603</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/20 11:12:50</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10328202302224539384288</RepId>\n" +
" <RepSid>4539384288</RepSid>\n" +
" <ComId>12226,12228</ComId>\n" +
" <PidComName>生化八项(普通)+血淀粉酶(普通)</PidComName>\n" +
" <RepInDate>2023-02-22 08:07:29</RepInDate>\n" +
" <LrName>李结秋</LrName>\n" +
" <RepCheckUserName>李结秋</RepCheckUserName>\n" +
" <RepReportUserName>胡洁洁</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-22 10:30:12</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10328</RepItrId>\n" +
" <RepItrName>贝克曼流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-22 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>4539384288</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>3077n,3079n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>55</RepReportUserId>\n" +
" <PidDiag>2型糖尿病伴有并发症</PidDiag>\n" +
" <RepCheckUserId>26</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/22 6:42:07</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10328202302213339363108</RepId>\n" +
" <RepSid>3339363108</RepSid>\n" +
" <ComId>11152,11111,11185</ComId>\n" +
" <PidComName>肾功3项+肝功7项+血脂四项</PidComName>\n" +
" <RepInDate>2023-02-21 08:12:37</RepInDate>\n" +
" <LrName>李结秋</LrName>\n" +
" <RepCheckUserName>李结秋</RepCheckUserName>\n" +
" <RepReportUserName>顾晓凡</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 09:48:06</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10328</RepItrId>\n" +
" <RepItrName>贝克曼流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3339363108</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>3002bn,3009n,3035n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>601</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>26</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/21 6:45:35</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10316202302213439363109</RepId>\n" +
" <RepSid>3439363109</RepSid>\n" +
" <ComId>10539,10543,10556</ComId>\n" +
" <PidComName>AFPCEA+CA19-9+F-PSA/T-PSA</PidComName>\n" +
" <RepInDate>2023-02-21 08:29:00</RepInDate>\n" +
" <LrName>李焕庭</LrName>\n" +
" <RepCheckUserName>李焕庭</RepCheckUserName>\n" +
" <RepReportUserName>阙志权</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 09:31:26</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10316</RepItrId>\n" +
" <RepItrName>罗氏Infinity流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>3439363109</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>\n" +
" </PidRemark>\n" +
" <PidSamId>10028</PidSamId>\n" +
" <SamName>血清</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>4043n,4044n,4049n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>44</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>46</RepCheckUserId>\n" +
" <PidTel>\n" +
" </PidTel>\n" +
" <SampCollectionDate>2023/2/21 6:45:40</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" <PidReportMain>\n" +
" <PidInNo>D1094174</PidInNo>\n" +
" <PidSocialNo>10748387</PidSocialNo>\n" +
" <PidAddmissTimes>1</PidAddmissTimes>\n" +
" <RepId>10328202302212639363101</RepId>\n" +
" <RepSid>2639363101</RepSid>\n" +
" <ComId>11147</ComId>\n" +
" <PidComName>葡萄糖(餐后2H)</PidComName>\n" +
" <RepInDate>2023-02-21 11:29:17</RepInDate>\n" +
" <LrName>李结秋</LrName>\n" +
" <RepCheckUserName>李结秋</RepCheckUserName>\n" +
" <RepReportUserName>顾晓凡</RepReportUserName>\n" +
" <RepStatus>4</RepStatus>\n" +
" <RepReportDate>2023-02-21 12:18:32</RepReportDate>\n" +
" <PidDocName>李惠平</PidDocName>\n" +
" <SignContent>\n" +
" </SignContent>\n" +
" <RepItrId>10328</RepItrId>\n" +
" <RepItrName>贝克曼流水线</RepItrName>\n" +
" <RepReportType>gen</RepReportType>\n" +
" <PidSrcId>108</PidSrcId>\n" +
" <SampApplyDate>2023-02-21 06:00:00</SampApplyDate>\n" +
" <PidDeptName>综合病科五病区</PidDeptName>\n" +
" <RepInputId>9340722</RepInputId>\n" +
" <PidIdentityCard>440122195404141212</PidIdentityCard>\n" +
" <PidExamNo>\n" +
" </PidExamNo>\n" +
" <PidName>邝伟如</PidName>\n" +
" <PidSex>1</PidSex>\n" +
" <Age>68岁</Age>\n" +
" <RepBarCode>2639363101</RepBarCode>\n" +
" <PidDeptId>1540500</PidDeptId>\n" +
" <PidRemark>合格</PidRemark>\n" +
" <PidSamId>10029</PidSamId>\n" +
" <SamName>血浆</SamName>\n" +
" <PidDoctorCode>3615</PidDoctorCode>\n" +
" <OrderCode>3013n</OrderCode>\n" +
" <RepRemark>\n" +
" </RepRemark>\n" +
" <PidOrgId>\n" +
" </PidOrgId>\n" +
" <RepReportUserId>601</RepReportUserId>\n" +
" <PidDiag>2型糖尿病</PidDiag>\n" +
" <RepCheckUserId>26</RepCheckUserId>\n" +
" <PidTel>13719244555</PidTel>\n" +
" <SampCollectionDate>2023/2/21 10:27:16</SampCollectionDate>\n" +
" </PidReportMain>\n" +
" </Result>\n" +
"</Response>]]></DCLInterfaceResult>\n" +
" </DCLInterfaceResponse>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
if(result.contains("<![CDATA[")){
result = result.substring(result.indexOf("<![CDATA[")+9,result.indexOf("]]>"));
}else{
result = result.substring(result.indexOf("Result>")+7,result.indexOf("}</")+1);
}
Map<String, Object> stringObjectMap = XmlUtil.xmlToMap(result);
System.out.println(stringObjectMap);
PatientReportResult patientReportResult = BeanUtil.fillBeanWithMap(stringObjectMap, new PatientReportResult(), false);
System.out.println(patientReportResult);
}
}

@ -14,6 +14,10 @@ mybatis-plus:
db-type: MYSQL
spring:
servlet:
multipart:
max-file-size: 4096MB
max-request-size: 4096MB
resources:
static-locations: classpath:/,file:./lib/
profiles:
@ -92,3 +96,7 @@ spring:
test-on-borrow: false
test-on-return: false
validation-query: select 1
#文件保存路径
savePath: F:\jiashi\lianzhong

@ -21,31 +21,11 @@
<fileNamePattern>${log.path}%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<appender name="external-interface" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 指定日志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${log.path}external%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<logger name="com.docus.services.system.service.ClientGetBasicServiceImpl" level="DEBUG" additivity="false">
<appender-ref ref="external-interface" />
</logger>
<root level="INFO">

@ -6,30 +6,30 @@
<insert id="insertOrUpdateByid">
insert into docus_medicalrecord.t_basic
(patient_id,admiss_times,inpatient_no,admiss_id,
name,sex,age,id_card,
name,sex,age,id_card,
admiss_date,admiss_dept,admiss_dept_name,dis_date,
dis_dept,dis_dept_name,main_diag_code,main_diag_name,
main_operate_code,main_operate_name,create_time,is_archive,
file_source,b_column5,b_column8,archive_file_storage_type,
scan_upload_state
)
)
values
<foreach collection="list" item="item" separator=",">
(#{item.patientId},#{item.admissTimes},#{item.inpatientNo},#{item.admissId},
#{item.name},#{item.sex},#{item.age},#{item.idCard},
#{item.admissDate},#{item.admissDept},#{item.admissDeptName},#{item.disDate},
#{item.disDept},#{item.disDeptName},#{item.mainDiagCode},#{item.mainDiagName},
#{item.mainOperateCode},#{item.mainOperateName},#{item.createTime},#{item.isArchive},
#{item.fileSource},#{item.bColumn5},#{item.bColumn8},#{item.archiveFileStorageType},
#{item.scanUploadState}
)
(#{item.patientId},#{item.admissTimes},#{item.inpatientNo},#{item.admissId},
#{item.name},#{item.sex},#{item.age},#{item.idCard},
#{item.admissDate},#{item.admissDept},#{item.admissDeptName},#{item.disDate},
#{item.disDept},#{item.disDeptName},#{item.mainDiagCode},#{item.mainDiagName},
#{item.mainOperateCode},#{item.mainOperateName},#{item.createTime},#{item.isArchive},
#{item.fileSource},#{item.bColumn5},#{item.bColumn8},#{item.archiveFileStorageType},
#{item.scanUploadState}
)
</foreach>
ON DUPLICATE KEY UPDATE id_card = VALUES(id_card)
,admiss_dept = VALUES(admiss_dept)
,admiss_dept_name = VALUES(admiss_dept_name)
,dis_dept = VALUES(dis_dept)
,dis_dept_name = VALUES(dis_dept_name)
,is_archive = VALUES(is_archive);
,admiss_dept = VALUES(admiss_dept)
,admiss_dept_name = VALUES(admiss_dept_name)
,dis_dept = VALUES(dis_dept)
,dis_dept_name = VALUES(dis_dept_name)
,is_archive = VALUES(is_archive);
</insert>
<insert id="insertOrUpdateTbasicSub">
@ -42,13 +42,74 @@
ON DUPLICATE KEY UPDATE birthday = VALUES(birthday);
</insert>
<insert id="addBasic">
insert into docus_medicalrecord.t_basic
(patient_id,admiss_times,inpatient_no,admiss_id,
name,sex,sex_name,age,id_card,
admiss_date,admiss_dept,admiss_dept_name,dis_date,
dis_dept,dis_dept_name,main_diag_code,main_diag_name,
main_operate_code,main_operate_name,create_time,is_archive,
file_source,b_column5,b_column8,archive_file_storage_type,
scan_upload_state,ward_palce,scan_source
)
values
<foreach collection="list" item="item" separator=",">
(#{item.patientId},#{item.admissTimes},#{item.inpatientNo},#{item.admissId},
#{item.name},#{item.sex},#{item.sexName},#{item.age},#{item.idCard},
#{item.admissDate},#{item.admissDept},#{item.admissDeptName},#{item.disDate},
#{item.disDept},#{item.disDeptName},#{item.mainDiagCode},#{item.mainDiagName},
#{item.mainOperateCode},#{item.mainOperateName},#{item.createTime},#{item.isArchive},
#{item.fileSource},#{item.bColumn5},#{item.bColumn8},#{item.archiveFileStorageType},
#{item.scanUploadState}, #{item.wardPalce},#{item.scanSource}
)
</foreach>
</insert>
<update id="updateScanStatus">
update docus_medicalrecord.t_basic
set scan_source = 1 ,
set scan_source = 1,
scan_upload_state = 3
WHERE patient_id = #{pid}
</update>
<update id="updateScanBasicCorrect">
update docus_medicalrecord.t_basic
set patient_id=#{newPatId},
ph=#{ph}
where patient_id = #{oldPatId}
</update>
<update id="fillMissingFields">
update docus_medicalrecord.t_basic
set sex=#{basic.sex},
sex_name=#{basic.sexName},
admiss_date=#{basic.admissDate},
admiss_dept=#{basic.admissDept},
admiss_dept_name=#{basic.admissDeptName},
dis_dept=#{basic.disDept},
dis_dept_name=#{basic.disDeptName}
where patient_id = #{basic.patientId}
</update>
<update id="updateNotArchive">
update docus_medicalrecord.t_basic
set is_archive = 0
where patient_id = #{patientId}
</update>
<delete id="delTbasicByAdmissId">
delete
from docus_medicalrecord.t_basic
where admiss_id = #{admissId}
</delete>
<delete id="delTbasicSub">
delete
from docus_medicalrecord.t_basic_sub
where patient_id = #{patientId}
</delete>
<delete id="delTbasic">
delete from docus_medicalrecord.t_basic
where patient_id in
<foreach collection="pidList" item="pid" separator="," open="(" close=")">
#{pid}
</foreach>
</delete>
<select id="getBasicVoList" resultType="com.docus.demo.vo.BasicVo">
@ -134,10 +195,98 @@
<if test="dto.startDate !=null and dto.startDate != ''">
AND dis_date &lt;= #{dto.endDate}
</if>
limit #{pageStart} ,#{pageEnd}
</select>
<select id="getLabSyncBasicList" resultType="com.docus.demo.entity.Tbasic">
SELECT patient_id,
admiss_times,
inpatient_no,
admiss_date,
`name`,
dis_date
FROM docus_medicalrecord.t_basic
WHERE patient_id in (
SELECT *
FROM (
SELECT patient_id
FROM docus_medicalrecord.t_basic
WHERE dis_date >= #{startDisDateTime}
AND is_cancel = 0
AND scan_source = '1'
ORDER BY dis_date ASC
LIMIT ${offset}, ${limit}
) t
)
</select>
limit #{pageStart} ,#{pageEnd}
<select id="getLabSyncBasicListByDate" resultType="com.docus.demo.entity.Tbasic">
SELECT patient_id,
admiss_times,
inpatient_no,
admiss_date,
`name`,
dis_date
FROM docus_medicalrecord.t_basic
WHERE dis_date between #{startDisDateTime} and #{endDisDateTime}
AND is_cancel = 0
AND scan_source = '1'
ORDER BY dis_date ASC
</select>
<select id="getTbasicByAdmissId" resultType="com.docus.demo.entity.Tbasic">
select patient_id,
ph,
admiss_times,
inpatient_no,
admiss_date,
`name`,
dis_date
from docus_medicalrecord.t_basic
where admiss_id = #{admissId}
</select>
<select id="getTbasicByPatientId" resultType="com.docus.demo.entity.Tbasic">
select patient_id,
ph,
admiss_times,
inpatient_no,
admiss_date,
`name`,
dis_date
from docus_medicalrecord.t_basic
where patient_id = #{patientId}
</select>
<select id="getTbasicByInpatientNo" resultType="com.docus.demo.entity.Tbasic">
SELECT patient_id,
admiss_times,
inpatient_no,
admiss_date,
`name`,
dis_date,
admiss_dept,
admiss_dept_name,
dis_dept,
dis_dept_name,
sex,
sex_name,
file_source,
ph
FROM docus_medicalrecord.t_basic
where inpatient_no = #{inpatientNo}
</select>
<select id="getInpatientNos" resultType="java.lang.String">
SELECT inpatient_no
FROM docus_medicalrecord.t_basic
group by inpatient_no
</select>
<select id="getInpatientNosBySource" resultType="java.lang.String">
SELECT inpatient_no
FROM docus_medicalrecord.t_basic
where file_source = #{fileSource}
group by inpatient_no
</select>
</mapper>

@ -0,0 +1,18 @@
<?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.demo.mapper.mysql.PowerDeptMapper">
<insert id="insert">
INSERT INTO docus_system.power_dept
(dept_id, dept_code, dept_name,effective)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.deptId},#{item.deptCode},#{item.deptName},1)
</foreach>
</insert>
<select id="list" resultType="com.docus.demo.entity.PowerDept">
select * from docus_system.power_dept
</select>
</mapper>

@ -31,6 +31,29 @@
,sort = VALUES(sort) ,creater = VALUES(creater),taskId = VALUES(taskId),`source` = VALUES(`source`)
</insert>
<insert id="addScanAssort">
insert into docus_archivefile.t_scan_assort
(id,patient_id,assort_id,file_title,image_path
,scan_page,file_source,file_storage_type,file_pages
,creater,creater_name,create_time,sort,taskid,`source`)
values
<foreach collection="list" item="item" index="index"
separator=",">
(#{item.id},#{item.patientId},#{item.assortId},#{item.fileTitle},#{item.imagePath}
,#{item.scanPage},#{item.fileSource},#{item.fileStorageType},#{item.filePages}
,#{item.creater},#{item.createrName},#{item.createTime},#{item.sort},#{item.taskId},#{item.source})
</foreach>
</insert>
<update id="updatePatientId">
update docus_archivefile.t_scan_assort set patient_id=#{newPatId} where patient_id=#{oldPatId}
</update>
<update id="updatePatientIdById">
update docus_archivefile.t_scan_assort set patient_id=#{newPatId}
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</update>
<delete id="deleteByPid">
delete FROM docus_archivefile.t_scan_assort
where patient_id in
@ -40,6 +63,12 @@
</foreach>
)
</delete>
<delete id="delScanAssort">
delete from docus_archivefile.t_scan_assort where patient_id=#{patientId} and source=#{source}
</delete>
<delete id="delScanAssortById">
delete from docus_archivefile.t_scan_assort where id=#{id};
</delete>
<select id="getListByPid" resultType="com.docus.demo.entity.ScanAssort">
SELECT id,
patient_id,
@ -52,7 +81,9 @@
file_pages,
creater,
create_time,
sort
sort,
is_del,
source
FROM docus_archivefile.t_scan_assort
WHERE patient_id = #{pid}
</select>
@ -68,10 +99,36 @@
file_pages,
creater,
create_time,
sort
sort,
is_del,
source
FROM docus_archivefile.t_scan_assort
WHERE assort_id = #{assortId} and patient_id = #{pid}
WHERE assort_id = #{assortId} and patient_id = #{pid} and source='jy'
</select>
<select id="getScanAssort" resultType="com.docus.demo.entity.ScanAssort">
SELECT * FROM docus_archivefile.t_scan_assort WHERE patient_id=#{patientId} and source=#{source}
</select>
<select id="getListByPids" resultType="com.docus.demo.entity.ScanAssort">
SELECT id,
patient_id,
assort_id,
file_title,
image_path,
scan_page,
file_source,
file_storage_type,
file_pages,
creater,
create_time,
sort,
is_del,
source
FROM docus_archivefile.t_scan_assort
where patient_id in
<foreach collection="pidList" item="pid" separator="," open="(" close=")">
#{pid}
</foreach>
</select>
</mapper>
Loading…
Cancel
Save