【流程自动化】

1.新增下载模板接口
2.新增导入模板接口
3.修改全面检查为预期诊断结果并显示
jinan_dev_by_release_3.0.0
longbao 6 months ago
parent ba22e3c6b8
commit 07485873a0

@ -48,6 +48,8 @@ public class WebConfig implements WebMvcConfigurer {
paths.add("/fileManage/downloadFile");
paths.add("/aqLibrary/downloadQuestionLibraryTemplate");
paths.add("/medicalRecManage/downloadMedicalAnswerTemplate");
//下载病例知识库接口
paths.add("/medicalRecManage/downloadMedicalTemplate");
paths.add("/qaKnowledge/**");
// 开发环境,放开不校验token.每次修改这里需要重启(热部署不行)
// paths.add("/**");

@ -85,11 +85,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.supervision</groupId>
<artifactId>virtual-patient-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.supervision</groupId>-->
<!-- <artifactId>virtual-patient-common</artifactId>-->
<!-- <version>${project.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

@ -21,7 +21,7 @@ import java.util.List;
@RequiredArgsConstructor
public class DiseaseAncillaryManageController {
private final DiseaseAncillaryManageService diseaseAncillaryManageService;
private final DiseaseAncillaryManageService diseaseAncillaryManageService;
@Operation(summary = "新增辅助检查信息")
@PostMapping("/save")

@ -1,15 +1,19 @@
package com.supervision.manage.controller.diseasemanage;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.manage.pojo.vo.UploadDiseaseResVo;
import com.supervision.manage.service.DiseaseManageService;
import com.supervision.manage.service.MedicalRecManageService;
import com.supervision.model.Disease;
import com.supervision.vo.manage.DiseaseReqVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.SchemaProperty;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Tag(name = "疾病管理")
@RestController
@ -19,6 +23,7 @@ public class DiseaseManageController {
private final DiseaseManageService diseaseManageService;
private final MedicalRecManageService medicalRecManageService;
@PostMapping("/save")
@ -56,11 +61,4 @@ public class DiseaseManageController {
}
}

@ -1,10 +1,7 @@
package com.supervision.manage.controller.medicalrec;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
import com.supervision.manage.pojo.vo.MedicalRecManageVO;
import com.supervision.manage.pojo.vo.MedicalRecQaVO;
import com.supervision.manage.pojo.vo.*;
import com.supervision.manage.service.MedicalRecManageService;
import com.supervision.model.Disease;
import com.supervision.vo.manage.DiseaseAncillaryResVo;
@ -141,4 +138,30 @@ public class MedicalRecManageController {
}
@Operation(summary = "下载病例导入模板")
@GetMapping("/downloadMedicalTemplate")
public void downloadDiseaseTemplate(HttpServletResponse response) throws Exception {
medicalRecManageService.downloadMedicalTemplate(response);
}
@Operation(summary = "导入病例信息")
@PostMapping("/uploadMedical")
public UploadDiseaseResVo uploadDisease(@Parameter(name = "file", description = "文件") MultipartFile multipartFile) throws Exception {
return medicalRecManageService.uploadMedical(multipartFile);
}
@Operation(summary = "生成数字人")
@PostMapping("/generateDigitalHuman")
public UploadDiseaseResVo uploadDisease() throws Exception {
// 数字人状态才可以生成数字人
// 1.判断病例是否存在
// 2.判断是否已经创建数字人
// 3.创建数字人 :数字人创建返回 sid 绑定sid和病例id
// 4.查询数字人生成状态
return null;
}
}

@ -0,0 +1,41 @@
package com.supervision.manage.enums;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/10/30 10:02
* @Description:
*/
@Getter
public enum DiseasePhysicalEnum {
PRELIMINARY_DIAGNOSTIC_BASIS("初步诊断依据", 1, 0),
DIAGNOSTIC_CONFIRMATION_BASIS("证实诊断依据", 1, 0),
COMPREHENSIVE_BASIS_FOR_DIAGNOSIS("全面依据", 1, 0),
DIFFERENTIAL_DIAGNOSTIC_BASIS("鉴别依据", 1, 0),
;
private String description;
private int yes;
private int no;
DiseasePhysicalEnum(String description, int yes, int no) {
this.description = description;
this.yes = yes;
this.no = no;
}
public static int fromCode(String description) {
for (DiseasePhysicalEnum status : DiseasePhysicalEnum.values()) {
if (status.getDescription().equals(description)) {
return status.getYes();
} else {
return status.getNo();
}
}
throw new IllegalArgumentException("Invalid status code: " + description);
}
}

@ -0,0 +1,37 @@
package com.supervision.manage.enums;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/10/30 10:02
* @Description:
*/
@Getter
public enum DiseaseTypeEnum {
SINGLE_DISEASE("单一疾病", 0),
CONFORMING_DISEASE("复合疾病", 1),
;
private String description;
private int code;
DiseaseTypeEnum(String description, int code) {
this.description = description;
this.code = code;
}
public static DiseaseTypeEnum fromCode(String description) {
for (DiseaseTypeEnum status : DiseaseTypeEnum.values()) {
if (status.getDescription().equals(description)) {
return status;
} else {
return null;
}
}
throw new IllegalArgumentException("Invalid status code: " + description);
}
}

@ -0,0 +1,27 @@
package com.supervision.manage.enums;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/11/1 17:44
* @Description:
*/
@Getter
public enum MedicalStatusEnum {
CREATE("病例生成状态","00"),
CREATE_MEDICAL("病例生成状态","01"),
CREATE_DATA_HUMAN("病例生成状态","02"),
CREATE_DATA_HUMAN_OVER("病例生成状态","03"),
OVER("病例生成状态","00"),
;
private String description;
private String code;
MedicalStatusEnum(String description, String code) {
this.description = description;
this.code = code;
}
}

@ -0,0 +1,24 @@
package com.supervision.manage.enums;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/11/1 17:44
* @Description:
*/
@Getter
public enum MedicalTypeEnum {
SYSTEM_CREATE("系统创建","00"),
TEMPLATE_IMPORT("v3.0病例模板导入","01"),
;
private String description;
private String code;
MedicalTypeEnum(String description, String code) {
this.description = description;
this.code = code;
}
}

@ -0,0 +1,37 @@
package com.supervision.manage.enums;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/11/1 11:36
* @Description: sheet
*/
@Getter
public enum VirtualSheetNameEnum {
BASIC_INFO("基本信息"),
CLINICAL_INTERVIEW("临床问诊"),
PHYSICAL_EXAMINATION("体格检查"),
AUXILIARY_EXAMINATION("辅助检查"),
TREATMENT_PLAN("处置计划"),
SUMMARY_OF_EVALUATION_RESULTS("评估结果概述"),
;
private String description;
VirtualSheetNameEnum(String description) {
this.description = description;
}
public static String fromCode(String description) {
for (VirtualSheetNameEnum status : VirtualSheetNameEnum.values()) {
if (status.getDescription().equals(description)) {
return status.description;
} else {
continue;
}
}
throw new IllegalArgumentException("Invalid status code: " + description);
}
}

@ -0,0 +1,19 @@
package com.supervision.manage.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class UploadDiseaseResVo {
@Schema(description = "总数据条数")
private int totalCount;
@Schema(description = "失败数据条数")
private int failCount;
@Schema(description = "文件id")
private String fileId;
}

@ -0,0 +1,24 @@
package com.supervision.manage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.dto.ClinicalInterviewDTO;
import com.supervision.model.AskTemplateQuestionLibrary;
import java.util.List;
/**
* @author flevance
* @description vp_ask_template_question_library()Service
* @createDate 2023-11-03 11:13:26
*/
public interface AskTemplateQuestionLibraryManageService extends IService<AskTemplateQuestionLibrary> {
public String queryByName(String nameZh);
/**
*
* @param code
*/
void saveSimilarityQuestion(List<ClinicalInterviewDTO> code);
}

@ -1,5 +1,7 @@
package com.supervision.manage.service;
import com.supervision.dto.SupplementaryTestDto;
import com.supervision.model.Disease;
import com.supervision.model.DiseaseAncillary;
import com.supervision.vo.ask.AncillaryItemReqVo;
import com.supervision.vo.ask.ConfigAncillaryItemResVO;
@ -27,4 +29,10 @@ public interface DiseaseAncillaryManageService {
List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo);
/**
*
* @param disease
* @param supplementaryTestDtos
*/
void batchSaveAncillaryExaminationList(Disease disease, List<SupplementaryTestDto> supplementaryTestDtos);
}

@ -1,10 +1,11 @@
package com.supervision.manage.service;
import com.supervision.dto.UploadPhysicalExaminationDTO;
import com.supervision.model.Disease;
import com.supervision.model.DiseasePhysical;
import com.supervision.vo.manage.DiseasePhysicalLocationNodeVo;
import com.supervision.vo.manage.DiseasePhysicalResVo;
import com.supervision.vo.manage.DiseasePhysicalStrResVo;
import com.supervision.vo.manage.PhysicalLocationNode;
import java.util.List;
@ -28,4 +29,11 @@ public interface DiseasePhysicalManageService {
boolean deleteByDiseaseId(String diseaseId);
List<DiseasePhysicalLocationNodeVo> queryTree(String diseaseId, String toolId);
/**
*
* @param diseaseList
* @param uploadPhysicalExaminationDTOS
*/
void batchSavePhysicalExaminationList(Disease diseaseList, List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS);
}

@ -1,10 +1,7 @@
package com.supervision.manage.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
import com.supervision.manage.pojo.vo.MedicalRecManageVO;
import com.supervision.manage.pojo.vo.MedicalRecQaVO;
import com.supervision.manage.pojo.vo.*;
import com.supervision.model.Disease;
import com.supervision.vo.manage.DiseaseAncillaryResVo;
import com.supervision.vo.manage.DiseasePhysicalResVo;
@ -50,4 +47,10 @@ public interface MedicalRecManageService {
void downloadMedicalAnswerTemplate(HttpServletResponse response) throws Exception;
Boolean updateMedicalStatus(String medicalRecId, Integer status);
void downloadMedicalTemplate(HttpServletResponse response) throws Exception;
UploadDiseaseResVo uploadMedical(MultipartFile multipartFile) throws Exception;
}

@ -30,7 +30,6 @@ import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
@ -197,7 +196,7 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa
log.info("uploadQuestionLibrary : 读取文件耗时:{} s" , timer.intervalSecond());
// 校验模板是否正确
assertTitle(reader);
assertTitle(reader);
List<UploadQuestionLibraryDTO> uploadQuestionLibraryDTOS = reader.readAll(UploadQuestionLibraryDTO.class);

@ -0,0 +1,128 @@
package com.supervision.manage.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.dto.ClinicalInterviewDTO;
import com.supervision.dto.QaKnowledgeDTO;
import com.supervision.manage.service.AskTemplateQuestionLibraryManageService;
import com.supervision.manage.service.QaKnowledgeManageService;
import com.supervision.mapper.AskTemplateQuestionLibraryMapper;
import com.supervision.model.AskTemplateQuestionLibrary;
import com.supervision.model.AskTemplateQuestionSimilarity;
import com.supervision.model.ConfigAncillaryItem;
import com.supervision.model.ConfigPhysicalTool;
import com.supervision.service.*;
import com.supervision.util.RedisSequenceUtil;
import com.supervision.vo.manage.AskQuestionLibraryReqVo;
import com.supervision.vo.manage.AskQuestionLibraryResVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author flevance
* @description vp_ask_template_question_library()Service
* @createDate 2023-11-03 11:13:26
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AskTemplateQuestionLibraryManageServiceImpl extends ServiceImpl<AskTemplateQuestionLibraryMapper, AskTemplateQuestionLibrary>
implements AskTemplateQuestionLibraryManageService {
private final ConfigPhysicalToolService configPhysicalToolService;
private final ConfigAncillaryItemService configAncillaryItemService;
private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService;
@Autowired
private CommonDicService commonDicService;
private QaKnowledgeManageService qaKnowledgeService;
@Override
public String queryByName(String nameZh) {
return this.baseMapper.queryByName(nameZh);
}
public String getMaxCode() {
AskTemplateQuestionLibrary askTemplateQuestionLibrary = super.getBaseMapper()
.selectOne(new QueryWrapper<AskTemplateQuestionLibrary>().select("max(code) as code"));
if (Objects.isNull(askTemplateQuestionLibrary)) {
return null;
}
return askTemplateQuestionLibrary.getCode();
}
/**
* -
*
* @param clinicalInterviewDTOS
*/
@Override
public void saveSimilarityQuestion(List<ClinicalInterviewDTO> clinicalInterviewDTOS) {
// 1.判定条件集合是否存在
ArrayList<String> consultationList = new ArrayList();
for (ClinicalInterviewDTO clinicalInterviewDTO : clinicalInterviewDTOS) {
String consultationI = clinicalInterviewDTO.getConsultationI().trim();
String consultationII = clinicalInterviewDTO.getConsultationII().trim();
String consultation = "'" + consultationI + "/" + consultationII + "'";
consultationList.add(consultation);
}
Long queryCommonDictTreeByCode = commonDicService.queryCommonDictTreeByCode(consultationList);
Assert.isTrue(queryCommonDictTreeByCode != clinicalInterviewDTOS.size(), "请检查临床问诊中的问诊1和2是否存在");
// 2.插入问题
// 标准问题存在:增加问题为相似问题
// 标准问题不存在:增加问题为标准问题并更新问题库
for (ClinicalInterviewDTO clinicalInterviewDTO : clinicalInterviewDTOS) {
String consultationII = clinicalInterviewDTO.getConsultationII().trim();
String questionIntentRecognition = clinicalInterviewDTO.getQuestionIntentRecognition();
if (StringUtils.isNotEmpty(questionIntentRecognition)) {
String libraryId = queryByName(questionIntentRecognition);
if (StringUtils.isNotEmpty(libraryId)) {
AskTemplateQuestionSimilarity askTemplateQuestionSimilarity = askTemplateQuestionSimilarityService.querySimilarityQuestionByNameZhAndSimilarityQuestion(consultationII, questionIntentRecognition);
if (null == askTemplateQuestionSimilarity) {
AskTemplateQuestionSimilarity similarity = new AskTemplateQuestionSimilarity();
similarity.setSimilarityQuestion(questionIntentRecognition);
similarity.setLibraryId(libraryId);
askTemplateQuestionSimilarityService.save(similarity);
}
} else {
// 获取nexCode 获取的是redis中的问题库
String nextCode = RedisSequenceUtil.getQuestionLibraryCode(() -> {
String maxCode = getMaxCode();
if (StrUtil.isNotEmpty(maxCode)) {
return Long.parseLong(StrUtil.removePrefix(maxCode, "Q"));
}
return null;
});
AskTemplateQuestionLibrary askTemplateQuestionLibrary = new AskTemplateQuestionLibrary();
askTemplateQuestionLibrary.setCode(nextCode);
askTemplateQuestionLibrary.setStandardQuestion(questionIntentRecognition);
save(askTemplateQuestionLibrary);
qaKnowledgeService.saveOrUpdateQuestionLibrary(CollUtil.newArrayList(askTemplateQuestionLibrary.getId()));
}
}
}
}
}

@ -5,10 +5,14 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.supervision.dto.SupplementaryTestDto;
import com.supervision.manage.service.DiseaseAncillaryManageService;
import com.supervision.model.ConfigAncillaryItem;
import com.supervision.model.Disease;
import com.supervision.model.DiseaseAncillary;
import com.supervision.service.ConfigAncillaryItemService;
import com.supervision.service.DiseaseAncillaryService;
import com.supervision.util.UserUtil;
import com.supervision.vo.ask.AncillaryItemReqVo;
import com.supervision.vo.ask.ConfigAncillaryItemResVO;
import com.supervision.vo.manage.DiseaseAncillaryResVo;
@ -17,10 +21,13 @@ import com.supervision.vo.result.ConfigAncillaryItemVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.hutool.core.lang.Assert.isTrue;
@Service
@RequiredArgsConstructor
public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManageService {
@ -32,7 +39,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
@Override
public List<DiseaseAncillaryResVo> queryListByDiseaseId(String diseaseId) {
Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"diseaseId不能为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseId), "diseaseId不能为空");
List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(diseaseId);
diseaseAncillaryResVos.forEach(DiseaseAncillaryResVo::populateOther);
return diseaseAncillaryResVos;
@ -40,7 +47,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
@Override
public List<DiseaseAncillaryStrResVo> queryListStrByDiseaseId(String diseaseId) {
Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"diseaseId不能为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseId), "diseaseId不能为空");
List<DiseaseAncillaryStrResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListStrByDiseaseId(diseaseId);
diseaseAncillaryResVos.forEach(DiseaseAncillaryStrResVo::populateOther);
return diseaseAncillaryResVos;
@ -51,7 +58,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
assertDiseaseAncillary(diseaseAncillary);
Assert.isFalse(checkIfPresent(diseaseAncillary),"数据已存在!");
Assert.isFalse(checkIfPresent(diseaseAncillary), "数据已存在!");
diseaseAncillaryService.save(diseaseAncillary);
@ -61,7 +68,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
@Override
public boolean deleteDiseaseAncillary(String id) {
Assert.isTrue(StrUtil.isNotEmpty(id),"id 不允许为空");
Assert.isTrue(StrUtil.isNotEmpty(id), "id 不允许为空");
return diseaseAncillaryService.removeById(id);
}
@ -69,14 +76,14 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
@Override
public boolean updateAncillary(DiseaseAncillary diseaseAncillary) {
Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getId()),"id 不允许为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getId()), "id 不允许为空");
return diseaseAncillaryService.updateById(diseaseAncillary);
}
@Override
public boolean deleteByDiseaseId(String diseaseId) {
Assert.notEmpty(diseaseId,"疾病id不能为空");
Assert.notEmpty(diseaseId, "疾病id不能为空");
return diseaseAncillaryService.lambdaUpdate().eq(DiseaseAncillary::getDiseaseId, diseaseId).remove();
}
@ -84,17 +91,17 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
@Override
public List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo) {
List<ConfigAncillaryItemResVO> configAncillaryItemResVOS = configAncillaryItemService.queryAncillaryItemList(ancillaryItemReqVo);
if (CollUtil.isEmpty(configAncillaryItemResVOS) || StrUtil.isEmpty(ancillaryItemReqVo.getDiseaseId())){
if (CollUtil.isEmpty(configAncillaryItemResVOS) || StrUtil.isEmpty(ancillaryItemReqVo.getDiseaseId())) {
return configAncillaryItemResVOS;
}
List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(ancillaryItemReqVo.getDiseaseId());
if (CollUtil.isEmpty(diseaseAncillaryResVos)){
if (CollUtil.isEmpty(diseaseAncillaryResVos)) {
return configAncillaryItemResVOS;
}
List<String> itemIds = diseaseAncillaryResVos.stream().map(DiseaseAncillary::getItemId).distinct().collect(Collectors.toList());
for (ConfigAncillaryItemResVO configAncillaryItemResVO : configAncillaryItemResVOS) {
if (CollUtil.isEmpty(configAncillaryItemResVO.getItemList())){
if (CollUtil.isEmpty(configAncillaryItemResVO.getItemList())) {
continue;
}
for (ConfigAncillaryItemVo itemVo : configAncillaryItemResVO.getItemList()) {
@ -106,42 +113,96 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
}
private void assertDiseaseAncillary(DiseaseAncillary diseaseAncillary){
private void assertDiseaseAncillary(DiseaseAncillary diseaseAncillary) {
Assert.isNull(diseaseAncillary.getId(),"id不为空");
Assert.isNull(diseaseAncillary.getId(), "id不为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getDiseaseId()),"疾病id不能为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getDiseaseId()), "疾病id不能为空");
Assert.notNull(diseaseAncillary.getPrimarilyDiagnosisCriteriaFlag(),"初步诊断依据不能为空");
Assert.notNull(diseaseAncillary.getPrimarilyDiagnosisCriteriaFlag(), "初步诊断依据不能为空");
Assert.notNull(diseaseAncillary.getBasisConfirmFlag(),"证实诊断依据不能为空");
Assert.notNull(diseaseAncillary.getBasisConfirmFlag(), "证实诊断依据不能为空");
Assert.notNull(diseaseAncillary.getBasisIdentificationFlag(),"鉴别诊断依据不能为空");
Assert.notNull(diseaseAncillary.getBasisIdentificationFlag(), "鉴别诊断依据不能为空");
Assert.notNull(diseaseAncillary.getFullCheckFlag(),"全面诊断不能为空");
Assert.notNull(diseaseAncillary.getFullCheckFlag(), "全面诊断不能为空");
Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(),"判断不能为空");
Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(), "判断不能为空");
Assert.notNull(diseaseAncillary.getRequireCheckFlag(),"是否必查不能为空");
Assert.notNull(diseaseAncillary.getRequireCheckFlag(), "是否必查不能为空");
Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(),"判断不能为空");
Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(), "判断不能为空");
Assert.notNull(diseaseAncillary.getExpectedDiagnosisResult(),"预期诊断结果不能为空");
Assert.notNull(diseaseAncillary.getExpectedDiagnosisResult(), "预期诊断结果不能为空");
}
private boolean checkIfPresent(DiseaseAncillary diseaseAncillary){
private boolean checkIfPresent(DiseaseAncillary diseaseAncillary) {
return !Objects.isNull(findByDiseaseIdAndItemId(diseaseAncillary.getDiseaseId(), diseaseAncillary.getItemId()));
}
private DiseaseAncillary findByDiseaseIdAndItemId(String diseaseId,String itemId){
private DiseaseAncillary findByDiseaseIdAndItemId(String diseaseId, String itemId) {
List<DiseaseAncillary> list = diseaseAncillaryService.lambdaQuery().eq(DiseaseAncillary::getDiseaseId, diseaseId).eq(DiseaseAncillary::getItemId, itemId).list();
if (CollUtil.isEmpty(list)){
if (CollUtil.isEmpty(list)) {
return null;
}
return list.get(0);
}
/**
*
*
* @param disease
* @param supplementaryTestDtos
*/
@Override
public void batchSaveAncillaryExaminationList(Disease disease, List<SupplementaryTestDto> supplementaryTestDtos) {
List<DiseaseAncillary> diseaseAncillaries = new ArrayList<>();
for (SupplementaryTestDto supplementaryTestDto : supplementaryTestDtos) {
String firstLevelCategory = supplementaryTestDto.getFirstLevelCategory();
String secondLevelCategory = supplementaryTestDto.getSecondLevelCategory();
int preliminaryDiagnosisBasis = supplementaryTestDto.getPreliminaryDiagnosisBasis().equals("否") ? 0 : 1;
int confirmedDiagnosisBasis = supplementaryTestDto.getConfirmedDiagnosisBasis().equals("否") ? 0 : 1;
int differentialDiagnosisBasis = supplementaryTestDto.getDifferentialDiagnosisBasis().equals("否") ? 0 : 1;
int status = supplementaryTestDto.getStatus().equals("正常") ? 0 : 1;
int isRequiredCheck = supplementaryTestDto.getIsRequiredCheck().equals("否") ? 0 : 1;
String normalTestResult = supplementaryTestDto.getNormalTestResult();
String patientTestResult = supplementaryTestDto.getPatientTestResult();
ConfigAncillaryItem configAncillaryItem = configAncillaryItemService.queryAncillaryItem(firstLevelCategory, secondLevelCategory);
Assert.isTrue((null != configAncillaryItem), "辅助检查工具未找到:{}", secondLevelCategory);
DiseaseAncillary diseaseAncillary = new DiseaseAncillary();
diseaseAncillary.setDiseaseId(disease.getId());
// 工具id
diseaseAncillary.setItemId(configAncillaryItem.getId());
// 初步诊断依据
diseaseAncillary.setPrimarilyDiagnosisCriteriaFlag(preliminaryDiagnosisBasis);
// 证实诊断依据
diseaseAncillary.setBasisConfirmFlag(confirmedDiagnosisBasis);
//鉴别依据
diseaseAncillary.setBasisIdentificationFlag(differentialDiagnosisBasis);
diseaseAncillary.setExpectedDiagnosisResult(status);
diseaseAncillary.setRequireCheckFlag(isRequiredCheck);
diseaseAncillary.setNormalResult(normalTestResult);
diseaseAncillary.setResult(patientTestResult);
diseaseAncillary.setCreateUserId(UserUtil.getUser().getCreateUserId());
diseaseAncillary.setUpdateUserId(UserUtil.getUser().getCreateUserId());
diseaseAncillaries.add(diseaseAncillary);
}
diseaseAncillaryService.saveBatch(diseaseAncillaries);
}
}

@ -16,15 +16,14 @@ import com.supervision.util.RedisSequenceUtil;
import com.supervision.vo.manage.DiseaseReqVo;
import com.supervision.vo.manage.DiseaseResVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class DiseaseManageServiceImpl implements DiseaseManageService {
@ -46,10 +45,10 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
assertDisease(disease);
// 如果包含疾病id不为空则为复合疾病
if (CollUtil.isNotEmpty(disease.getContainDiseaseIds())){
if (CollUtil.isNotEmpty(disease.getContainDiseaseIds())) {
disease.setDiseaseType(1);
}
if (StrUtil.isEmpty(disease.getCode())){
if (StrUtil.isEmpty(disease.getCode())) {
disease.setCode(RedisSequenceUtil.getComplexDiseaseNo());
}
disease.setStatus(0);
@ -62,7 +61,7 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
@Override
public boolean updateDisease(Disease disease) {
Assert.isTrue(StrUtil.isNotEmpty(disease.getId()),"id is not allow empty");
Assert.isTrue(StrUtil.isNotEmpty(disease.getId()), "id is not allow empty");
return diseaseService.updateById(disease);
@ -73,10 +72,10 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
public boolean deleteDisease(String id) {
Disease disease = diseaseService.getById(id);
if (Objects.isNull(disease)){
if (Objects.isNull(disease)) {
return true;
}
Assert.isFalse(disease.getDiseaseType()==0,"单一疾病不允许被删除");
Assert.isFalse(disease.getDiseaseType() == 0, "单一疾病不允许被删除");
assertDiseaseIsUsed(id);
// 1. 删除疾病信息
diseaseService.removeById(id);
@ -117,15 +116,15 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
.filter(disease -> CollUtil.isNotEmpty(disease.getContainDiseaseIds()))
.flatMap(disease -> disease.getContainDiseaseIds().stream()).distinct().collect(Collectors.toList());
Map<String, Disease> diseaseMap = new HashMap<>();
if (CollUtil.isNotEmpty(containDiseaseIds)){
if (CollUtil.isNotEmpty(containDiseaseIds)) {
diseaseMap = diseaseService.listByIds(containDiseaseIds)
.stream().collect(Collectors.toMap(Disease::getId, disease -> disease, (v1, v2) -> v1));
}
final Map<String, Disease> diseaseMapCopy = new HashMap<>(diseaseMap);
final Map<String, Disease> diseaseMapCopy = new HashMap<>(diseaseMap);
// 把疾病名映射到DiseaseResVo中
return page.convert(record -> {
DiseaseResVo bean = BeanUtil.toBean(record, DiseaseResVo.class);
if (CollUtil.isNotEmpty(bean.getContainDiseaseIds())){
if (CollUtil.isNotEmpty(bean.getContainDiseaseIds())) {
bean.setContainDiseaseNames(bean.getContainDiseaseIds().stream()
.map(diseaseMapCopy::get).filter(Objects::nonNull).map(Disease::getDiseaseName).collect(Collectors.toList()));
}
@ -135,33 +134,33 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
}
private List<Disease> queryByAnyCondition(String code, String diseaseName, String diseaseNameAlias) {
private List<Disease> queryByAnyCondition(String code, String diseaseName, String diseaseNameAlias){
return diseaseService.lambdaQuery().eq(StrUtil.isNotEmpty(code),Disease::getCode,code).or()
.eq(StrUtil.isNotEmpty(diseaseName), Disease::getDiseaseName,diseaseName).or()
.eq(StrUtil.isNotEmpty(diseaseNameAlias),Disease::getDiseaseNameAlias,diseaseNameAlias)
return diseaseService.lambdaQuery().eq(StrUtil.isNotEmpty(code), Disease::getCode, code).or()
.eq(StrUtil.isNotEmpty(diseaseName), Disease::getDiseaseName, diseaseName).or()
.eq(StrUtil.isNotEmpty(diseaseNameAlias), Disease::getDiseaseNameAlias, diseaseNameAlias)
.list();
}
private List<Disease> queryByCode(String code){
if (Objects.isNull(code)){
private List<Disease> queryByCode(String code) {
if (Objects.isNull(code)) {
throw new BusinessException("code is not allow empty");
}
return diseaseService.lambdaQuery().eq(Disease::getCode,code).list();
return diseaseService.lambdaQuery().eq(Disease::getCode, code).list();
}
private void assertDisease(Disease disease){
private void assertDisease(Disease disease) {
Assert.isNull(disease.getId(),"id 不为空");
Assert.isNull(disease.getId(), "id 不为空");
Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseName()),"疾病名称不能为空");
Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseName()), "疾病名称不能为空");
Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseNameAlias()),"疾病别名不能为空");
Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseNameAlias()), "疾病别名不能为空");
if (CollUtil.isEmpty(disease.getContainDiseaseIds())){
if (CollUtil.isEmpty(disease.getContainDiseaseIds())) {
// 如果包含疾病为空则疾病code不能为空
Assert.isTrue(StrUtil.isNotEmpty(disease.getCode()),"疾病编码不能为空");
Assert.isTrue(StrUtil.isNotEmpty(disease.getCode()), "疾病编码不能为空");
}
@ -169,11 +168,12 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
/**
* 使
*
* @param diseaseId id
*/
private void assertDiseaseIsUsed(String diseaseId){
private void assertDiseaseIsUsed(String diseaseId) {
boolean isUsedMedicalRec = medicalRecService.lambdaQuery().eq(MedicalRec::getDiseaseId, diseaseId).count() > 0;
Assert.isFalse(isUsedMedicalRec,"疾病已经关联病例,不允许删除");
Assert.isFalse(isUsedMedicalRec, "疾病已经关联病例,不允许删除");
}
}

@ -4,26 +4,29 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.supervision.dto.UploadPhysicalExaminationDTO;
import com.supervision.manage.enums.DiseasePhysicalEnum;
import com.supervision.manage.service.DiseasePhysicalManageService;
import com.supervision.manage.service.PhysicalLocationManageService;
import com.supervision.model.ConfigPhysicalLocation;
import com.supervision.model.DefaultPhysicalIndicator;
import com.supervision.model.DiseasePhysical;
import com.supervision.model.*;
import com.supervision.service.ConfigPhysicalLocationService;
import com.supervision.service.ConfigPhysicalToolService;
import com.supervision.service.DefaultPhysicalIndicatorService;
import com.supervision.service.DiseasePhysicalService;
import com.supervision.util.UserUtil;
import com.supervision.vo.manage.DiseasePhysicalLocationNodeVo;
import com.supervision.vo.manage.DiseasePhysicalResVo;
import com.supervision.vo.manage.DiseasePhysicalStrResVo;
import com.supervision.vo.manage.PhysicalLocationNode;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
import static cn.hutool.core.lang.Assert.*;
@Service
@RequiredArgsConstructor
public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageService {
@ -34,13 +37,15 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
private final ConfigPhysicalLocationService configPhysicalLocationService;
private final ConfigPhysicalToolService configPhysicalToolService;
private final DefaultPhysicalIndicatorService defaultPhysicalIndicatorService;
@Override
public List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId) {
Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"id不能为空");
isTrue(StrUtil.isNotEmpty(diseaseId), "id不能为空");
List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(diseaseId);
diseasePhysicalResVos.forEach(DiseasePhysicalResVo::populateOther);
@ -50,7 +55,7 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
@Override
public List<DiseasePhysicalStrResVo> queryListToStringByDiseaseId(String diseaseId) {
Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"id不能为空");
isTrue(StrUtil.isNotEmpty(diseaseId), "id不能为空");
List<DiseasePhysicalStrResVo> diseasePhysicalResVos = diseasePhysicalService.queryListStrByDiseaseId(diseaseId);
diseasePhysicalResVos.forEach(DiseasePhysicalStrResVo::populateOther);
@ -69,14 +74,14 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
@Override
public boolean deletePhysical(String id) {
Assert.isTrue(StrUtil.isNotEmpty(id),"id不能为空");
isTrue(StrUtil.isNotEmpty(id), "id不能为空");
return diseasePhysicalService.removeById(id);
}
@Override
public boolean updatePhysical(DiseasePhysical diseasePhysical) {
Assert.isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()),"疾病id不能为空");
isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()), "疾病id不能为空");
return diseasePhysicalService.updateById(diseasePhysical);
}
@ -84,8 +89,8 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
@Override
public boolean deleteByDiseaseId(String diseaseId) {
Assert.notEmpty(diseaseId,"疾病id不能为空");
return diseasePhysicalService.lambdaUpdate().eq(DiseasePhysical::getDiseaseId,diseaseId).remove();
notEmpty(diseaseId, "疾病id不能为空");
return diseasePhysicalService.lambdaUpdate().eq(DiseasePhysical::getDiseaseId, diseaseId).remove();
}
@Override
@ -93,7 +98,7 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
// 1. 查询体格检查位置树
List<PhysicalLocationNode> physicalLocationNodes = physicalToolManageService.queryTree();
if (CollectionUtil.isEmpty(physicalLocationNodes)){
if (CollectionUtil.isEmpty(physicalLocationNodes)) {
return CollectionUtil.newArrayList();
}
@ -101,23 +106,23 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
physicalLocationNode.setChild(physicalLocationNodes);
DiseasePhysicalLocationNodeVo bean = BeanUtil.toBean(physicalLocationNode, DiseasePhysicalLocationNodeVo.class);
if (StrUtil.isEmpty(toolId)){
if (StrUtil.isEmpty(toolId)) {
// 工具id为空全部设置为禁用标识
bean.getChild().forEach(vo->vo.setFlag(true));
bean.getChild().forEach(vo -> vo.setFlag(true));
return bean.getChild();
}
// 在体格检查配置身体位置时,只能配置一级部位,此时默认下级的部位也已经被配置。如果工具没有设置,应该子节点设置为禁用
List<DefaultPhysicalIndicator> defaultPhysicalIndicatorList = defaultPhysicalIndicatorService.lambdaQuery().eq(DefaultPhysicalIndicator::getItemId, toolId).list();
if (CollectionUtil.isEmpty(defaultPhysicalIndicatorList)){
if (CollectionUtil.isEmpty(defaultPhysicalIndicatorList)) {
// 如果未配置,所有子节点设置为禁用
bean.getChild().forEach(vo->vo.setFlag(true));
bean.getChild().forEach(vo -> vo.setFlag(true));
return bean.getChild();
}
// 2. 根据疾病id查询疾病体格检查项
List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(diseaseId);
List<String> locationIds = diseasePhysicalResVos.stream().filter(vo->toolId.equals(vo.getToolId()))
List<String> locationIds = diseasePhysicalResVos.stream().filter(vo -> toolId.equals(vo.getToolId()))
.map(DiseasePhysical::getLocationId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
// 3. 填充疾病体格检查树中的flag属性
@ -151,22 +156,71 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
return bean.getChild();
}
private void assertDiseasePhysical(DiseasePhysical diseasePhysical){
private void assertDiseasePhysical(DiseasePhysical diseasePhysical) {
Assert.isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()),"疾病id不能为空");
isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()), "疾病id不能为空");
Assert.notNull(diseasePhysical.getPrimarilyDiagnosisCriteriaFlag(),"初步诊断依据不能为空");
notNull(diseasePhysical.getPrimarilyDiagnosisCriteriaFlag(), "初步诊断依据不能为空");
Assert.notNull(diseasePhysical.getBasisConfirmFlag(),"证实诊断依据不能为空");
notNull(diseasePhysical.getBasisConfirmFlag(), "证实诊断依据不能为空");
Assert.notNull(diseasePhysical.getBasisIdentificationFlag(),"鉴别诊断依据不能为空");
notNull(diseasePhysical.getBasisIdentificationFlag(), "鉴别诊断依据不能为空");
Assert.notNull(diseasePhysical.getFullCheckFlag(),"全面诊断不能为空");
notNull(diseasePhysical.getFullCheckFlag(), "全面诊断不能为空");
Assert.notNull(diseasePhysical.getRequireCheckFlag(),"是否必查不能为空");
notNull(diseasePhysical.getRequireCheckFlag(), "是否必查不能为空");
Assert.notNull(diseasePhysical.getExpectedDiagnosisResult(),"预期诊断结果不能为空");
notNull(diseasePhysical.getExpectedDiagnosisResult(), "预期诊断结果不能为空");
}
@Override
public void batchSavePhysicalExaminationList(Disease diseaseId, List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS) {
List<DiseasePhysical> diseasePhysicals = new ArrayList<>();
for (UploadPhysicalExaminationDTO uploadDiseaseDTO : uploadPhysicalExaminationDTOS) {
String iLevelClassification = uploadDiseaseDTO.getILevelClassification();
String iiLevelClassification = uploadDiseaseDTO.getIiLevelClassification();
String humanBodyPartIi = uploadDiseaseDTO.getHumanBodyPartIi();
String normalExamResult = uploadDiseaseDTO.getNormalExamResult();
String patientExamResult = uploadDiseaseDTO.getPatientExamResult();
Integer status = uploadDiseaseDTO.getStatus().equals("正常") ? 0 : 1;
Integer preliminaryDiagnosisBasis = uploadDiseaseDTO.getPreliminaryDiagnosisBasis().equals("否") ? 0 : 1;
Integer confirmedDiagnosisBasis = uploadDiseaseDTO.getConfirmedDiagnosisBasis().equals("否") ? 0 : 1;
Integer differentialDiagnosisBasis = uploadDiseaseDTO.getDifferentialDiagnosisBasis().equals("否") ? 0 : 1;
Integer isNecessaryExamDefaultYes = uploadDiseaseDTO.getIsNecessaryExamDefaultYes().equals("否") ? 0 : 1;
// 查询工具和位置
ConfigPhysicalTool configPhysicalTool = configPhysicalToolService.queryPhysicalToolByTypeAndToolName(iLevelClassification, iiLevelClassification);
ConfigPhysicalLocation configPhysicalLocation = configPhysicalLocationService.queryLocationTreeForLocationName(humanBodyPartIi, "1");
Assert.isTrue((null != configPhysicalTool), "体格检查工具未找到:{}", iiLevelClassification);
Assert.isTrue((null != configPhysicalLocation), "体格检查位置未找到:{}", humanBodyPartIi);
DiseasePhysical diseasePhysical = new DiseasePhysicalResVo();
diseasePhysical.setDiseaseId(diseaseId.getId());
// 工具id
diseasePhysical.setToolId(configPhysicalTool.getId());
// 检查部位ID
diseasePhysical.setLocationId(configPhysicalLocation.getId());
// 正常結果
diseasePhysical.setNormalResult(normalExamResult);
// 一場結果
diseasePhysical.setResult(patientExamResult);
// 预期结果
diseasePhysical.setExpectedDiagnosisResult(status);
// 初步
diseasePhysical.setPrimarilyDiagnosisCriteriaFlag(preliminaryDiagnosisBasis);
// 证实
diseasePhysical.setBasisConfirmFlag(confirmedDiagnosisBasis);
// 鉴别
diseasePhysical.setBasisIdentificationFlag(differentialDiagnosisBasis);
// 是否必查
diseasePhysical.setRequireCheckFlag(isNecessaryExamDefaultYes);
diseasePhysical.setCreateUserId(UserUtil.getUser().getCreateUserId());
diseasePhysical.setUpdateUserId(UserUtil.getUser().getCreateUserId());
diseasePhysicals.add(diseasePhysical);
}
diseasePhysicalService.saveBatch(diseasePhysicals);
}
}

@ -28,6 +28,7 @@ import java.util.Objects;
public class FileManageServiceImpl implements FileManageService {
private final FileResourceService fileResourceService;
@Override
public FileResource uploadFile(MultipartFile multipartFile, String contentType) throws Exception {
// 把文件上传到minio
@ -60,7 +61,7 @@ public class FileManageServiceImpl implements FileManageService {
// 把文件上传到minio
FileResource fileResource = new FileResource();
try (BufferedInputStream inputStream = FileUtil.getInputStream(file)){
try (BufferedInputStream inputStream = FileUtil.getInputStream(file)) {
String minoId = MinioUtil.uploadFile(inputStream);
fileResource.setMinioId(minoId);
}
@ -71,6 +72,7 @@ public class FileManageServiceImpl implements FileManageService {
fileResourceService.save(fileResource);
return fileResource;
}
@Override
public void downloadFile(String fileId, HttpServletResponse response) throws Exception {
Assert.notEmpty(fileId, "文件id不能为空");
@ -79,24 +81,24 @@ public class FileManageServiceImpl implements FileManageService {
Assert.notNull(fileResource, "文件不存在");
try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId());
ServletOutputStream outputStream = response.getOutputStream()){
ServletOutputStream outputStream = response.getOutputStream()) {
String contentType = StrUtil.isEmpty(fileResource.getFileType()) ? "application/octet-stream" : fileResource.getFileType();
response.setContentType(contentType);
if (StrUtil.isNotEmpty(fileResource.getFileName())){
if (StrUtil.isNotEmpty(fileResource.getFileName())) {
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode(fileResource.getFileName(), "UTF-8"));
}
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes))!= -1){
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
outputStream.flush();
}catch (Exception e){
log.error("文件下载失败",e);
throw new BusinessException("下载文件失败",e);
} catch (Exception e) {
log.error("文件下载失败", e);
throw new BusinessException("下载文件失败", e);
}
}
@ -106,17 +108,17 @@ public class FileManageServiceImpl implements FileManageService {
Assert.notEmpty(fileId, "fileId不能为空");
FileResource fileResource = fileResourceService.getById(fileId);
Assert.notNull(fileResource,"文件不存在");
Assert.notNull(fileResource, "文件不存在");
String prefix = null;
String suffix = null;
if (StrUtil.isNotEmpty(fileResource.getFileName())){
if (StrUtil.isNotEmpty(fileResource.getFileName())) {
List<String> split = StrUtil.split(fileResource.getFileName(), ".");
prefix = CollUtil.getFirst(split);
if (CollUtil.size(split) > 1){
if (CollUtil.size(split) > 1) {
suffix = "." + split.get(1);
}
}
File tempFile = StrUtil.isEmpty(prefix) ? FileUtil.createTempFile() : FileUtil.createTempFile(prefix,suffix,true);
File tempFile = StrUtil.isEmpty(prefix) ? FileUtil.createTempFile() : FileUtil.createTempFile(prefix, suffix, true);
try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId());
FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
byte[] bytes = new byte[1024];
@ -125,12 +127,12 @@ public class FileManageServiceImpl implements FileManageService {
fileOutputStream.write(bytes, 0, len);
}
fileOutputStream.flush();
}catch (Exception e){
if (tempFile.exists()){
} catch (Exception e) {
if (tempFile.exists()) {
tempFile.delete();
}
log.error("文件下载失败",e);
throw new BusinessException("文件下载失败",e);
log.error("文件下载失败", e);
throw new BusinessException("文件下载失败", e);
}
return tempFile;
}
@ -140,12 +142,12 @@ public class FileManageServiceImpl implements FileManageService {
Assert.notEmpty(fileId, "文件id不能为空");
FileResource fileResource = fileResourceService.getById(fileId);
if (Objects.isNull(fileResource)){
log.info("deleteFile: fileId:{} 未找到数据",fileId);
if (Objects.isNull(fileResource)) {
log.info("deleteFile: fileId:{} 未找到数据", fileId);
return false;
}
if (StrUtil.isNotEmpty(fileResource.getMinioId())){
log.info("deleteFile:删除minio中的数据.minioId:{}",fileResource.getMinioId());
if (StrUtil.isNotEmpty(fileResource.getMinioId())) {
log.info("deleteFile:删除minio中的数据.minioId:{}", fileResource.getMinioId());
MinioUtil.deleteObject(fileResource.getMinioId());
}
return fileResourceService.removeById(fileId);

@ -2,31 +2,41 @@ package com.supervision.manage.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.dto.*;
import com.supervision.exception.BusinessException;
import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
import com.supervision.manage.pojo.vo.MedicalRecManageVO;
import com.supervision.manage.pojo.vo.MedicalRecQaVO;
import com.supervision.manage.pojo.vo.*;
import com.supervision.manage.service.*;
import com.supervision.manage.enums.*;
import com.supervision.manage.service.AskTemplateQuestionLibraryManageService;
import com.supervision.model.*;
import com.supervision.model.Process;
import com.supervision.service.*;
import com.supervision.service.MedicalRecService;
import com.supervision.util.UserUtil;
import com.supervision.vo.manage.*;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.*;
import java.util.function.Function;
@ -36,6 +46,10 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class MedicalRecManageServiceImpl implements MedicalRecManageService {
private final String CASE_TEMPLATE_TEMPLATE_EXCEL_PATH = "classpath:template/虚拟病例信息模板v3.0.xlsx";
private final String MEDICAL_ANSWER_TEMPLATE_EXCEL_PATH = "classpath:template/medical_answer_template.xlsx";
private final ResourceLoader resourceLoader;
@ -48,6 +62,8 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService;
private final AskTemplateQuestionLibraryManageService askTemplateQuestionLibraryManageService;
private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService;
private final CommonDicService commonDicService;
@ -77,7 +93,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
}
@Override
public IPage<MedicalRecPageResVO> queryMedicalRecManagePage(String selfDescKeyword, String gender,String patientName,
public IPage<MedicalRecPageResVO> queryMedicalRecManagePage(String selfDescKeyword, String gender, String patientName,
String diseaseId, Integer pageNum, Integer pageSize) {
// 注意,这里的diseaseId不支持查询复杂疾病,如果需要支持复杂疾病,这里需要单独进行改造
MedicalRecPageReqVO medicalRecPageReqVO = new MedicalRecPageReqVO();
@ -113,7 +129,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
Assert.notEmpty(chiildCommonDicList, "系统问题未找到");
List<String> dicIds = chiildCommonDicList.stream().map(i -> String.valueOf(i.getId())).collect(Collectors.toList());
List<AskTemplateQuestionLibrary> askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.lambdaQuery().in(AskTemplateQuestionLibrary::getDictId, dicIds).list();
if (CollUtil.isEmpty(askTemplateQuestionLibraryList)){
if (CollUtil.isEmpty(askTemplateQuestionLibraryList)) {
return;
}
Set<String> libraryIds = qaList.stream().map(MedicalRecQaVO::getLibraryQuestionId).collect(Collectors.toSet());
@ -124,7 +140,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
}
private void saveAskPatientAnswer(List<MedicalRecQaVO> qaList,String medicalRecId,Integer answerType){
private void saveAskPatientAnswer(List<MedicalRecQaVO> qaList, String medicalRecId, Integer answerType) {
if (CollUtil.isEmpty(qaList)) {
return;
}
@ -142,6 +158,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
askPatientAnswer.insert();
}
}
@Override
public List<DiseaseAncillaryResVo> queryDiseaseAncillaryByCreat(String diseaseId) {
// 辅助检查
@ -201,7 +218,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
assertDefaultAnswer(reqVO.getDefaultQaList());
BeanUtil.copyProperties(reqVO, medicalRec, "id","patientId");
BeanUtil.copyProperties(reqVO, medicalRec, "id", "patientId");
medicalRec.updateById();
// 然后修改问答
// 首先找到数据库中的问答
@ -227,7 +244,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
askPatientAnswer.setAnswer(medicalRecQaVO.getMedicalRecAnswer());
askPatientAnswer.setMedicalId(medicalRec.getId());
askPatientAnswer.setQuestion(CollUtil.getFirst(medicalRecQaVO.getQuestionList()));
if (null == askPatientAnswer.getAnswerType()){
if (null == askPatientAnswer.getAnswerType()) {
askPatientAnswer.setAnswerType(1);
}
askPatientAnswer.insert();
@ -268,7 +285,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
medicalRecQaVO.setAnswerType(Objects.isNull(e.getAnswerType()) ? 1 : e.getAnswerType());
// 病历的回答
medicalRecQaVO.setMedicalRecAnswer(e.getAnswer());
if (StrUtil.isNotEmpty(e.getQuestion())){
if (StrUtil.isNotEmpty(e.getQuestion())) {
medicalRecQaVO.setQuestionList(CollUtil.newArrayList(e.getQuestion()));
}
return medicalRecQaVO;
@ -290,12 +307,12 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
if (ObjectUtil.isNotEmpty(questionLibrary)) {
// 问题
List<String> question = libraryMapQuestion.get(medicalRecQaVO.getLibraryQuestionId());
if (CollUtil.isNotEmpty(medicalRecQaVO.getQuestionList())){
if (CollUtil.isNotEmpty(question)){
if (CollUtil.isNotEmpty(medicalRecQaVO.getQuestionList())) {
if (CollUtil.isNotEmpty(question)) {
question.remove(CollUtil.getFirst(medicalRecQaVO.getQuestionList()));
medicalRecQaVO.getQuestionList().addAll(question);
}
}else {
} else {
medicalRecQaVO.setQuestionList(question);
}
@ -331,7 +348,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
@Override
public MedicalAnswerVideoResVo preUploadMedicalAnswer(MultipartFile multipartFile, String medicalRecId) throws Exception {
return answerVideoResourceService.preGenerationMedicalAnswerVideo(multipartFile.getInputStream(),medicalRecId);
return answerVideoResourceService.preGenerationMedicalAnswerVideo(multipartFile.getInputStream(), medicalRecId);
}
@ -352,7 +369,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
final Map<String, AskTemplateQuestionLibrary> libraryMap = new HashMap<>();
if (CollUtil.isNotEmpty(askPatientAnswerList)){
if (CollUtil.isNotEmpty(askPatientAnswerList)) {
// 查询问题库信息
List<String> questionIds = askPatientAnswerList.stream()
.map(AskPatientAnswer::getLibraryQuestionId).filter(Objects::nonNull).collect(Collectors.toList());
@ -369,10 +386,10 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
medicalRecQaVO.setMedicalRecAnswer(e.getAnswer());
// 组装问题列表 和 字典数据
AskTemplateQuestionLibrary askTemplateQuestionLibrary = libraryMap.get(e.getLibraryQuestionId());
if (Objects.nonNull(askTemplateQuestionLibrary)){
if (Objects.nonNull(askTemplateQuestionLibrary)) {
medicalRecQaVO.setQuestionList(libraryMapQuestion.get(e.getLibraryQuestionId()));
Long dictId = askTemplateQuestionLibrary.getDictId();
if (Objects.nonNull(dictId)){
if (Objects.nonNull(dictId)) {
medicalRecQaVO.setDictId(dictId);
medicalRecQaVO.setDictNamePath(childCommonDicMap.getOrDefault(dictId, new CommonDic()).getNameZhPath());
}
@ -401,7 +418,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode("病历问诊问题导入模板.xlsx", "UTF-8"));
IoUtil.copy(resource.getInputStream(),outputStream);
IoUtil.copy(resource.getInputStream(), outputStream);
}
@Override
@ -414,4 +431,309 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
return medicalRecService.lambdaUpdate().eq(MedicalRec::getId, medicalRecId).set(MedicalRec::getStatus, status).update();
}
@Override
public void downloadMedicalTemplate(HttpServletResponse response) throws Exception {
Resource resource = resourceLoader.getResource(CASE_TEMPLATE_TEMPLATE_EXCEL_PATH);
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode("虚拟病例信息模板v3.0.xlsx", "UTF-8"));
IoUtil.copy(resource.getInputStream(), outputStream);
}
@Transactional(rollbackFor = Exception.class)
@Override
public UploadDiseaseResVo uploadMedical(MultipartFile multipartFile) throws Exception {
InputStream inputStream = multipartFile.getInputStream();
TimeInterval timer = DateUtil.timer();
ExcelReader reader = ExcelUtil.getReader(inputStream);
log.info("uploadQuestionLibrary : 读取文件耗时:{} s", timer.intervalSecond());
// 校验sheet
assertTemplate(reader);
// 疾病
Disease disease = null;
// 病人
MedicalRec medicalRec = null;
// 遍历sheet
List<Sheet> sheets = reader.getSheets();
for (int i = 0; i < 6; i++) {
String sheetName = sheets.get(i).getSheetName();
ExcelReader excelReader = reader.setSheet(i);
String virtualSheetNameEnum = VirtualSheetNameEnum.fromCode(sheetName);
Assert.isTrue(StringUtils.isNoneBlank(virtualSheetNameEnum), "未查询到sheet" + sheetName);
switch (sheetName) {
case "基本信息":
assertTitle(excelReader, "基本信息");
List<UploadDiseaseDTO> uploadDiseaseResVos = excelReader.readAll(UploadDiseaseDTO.class);
assertSheetDataBasicInfo(uploadDiseaseResVos);
disease = diseaseService.saveDisease(uploadDiseaseResVos);
medicalRec = batchSaveMedicalRec(uploadDiseaseResVos, disease);
continue;
case "临床问诊":
assertTitle(excelReader, "临床问诊");
List<ClinicalInterviewDTO> clinicalInterviewDTOS = excelReader.readAll(ClinicalInterviewDTO.class);
if (null == clinicalInterviewDTOS || clinicalInterviewDTOS.isEmpty()) {
continue;
}
assertSheetDataClinicalInterview(clinicalInterviewDTOS);
askTemplateQuestionLibraryManageService.saveSimilarityQuestion(clinicalInterviewDTOS);
continue;
case "体格检查":
assertTitle(excelReader, "体格检查");
List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS = excelReader.readAll(UploadPhysicalExaminationDTO.class);
if (null == uploadPhysicalExaminationDTOS || uploadPhysicalExaminationDTOS.isEmpty()) {
continue;
}
assertSheetDataPhysicalExamination(uploadPhysicalExaminationDTOS);
diseasePhysicalManageService.batchSavePhysicalExaminationList(disease, uploadPhysicalExaminationDTOS);
continue;
case "辅助检查":
assertTitle(excelReader, "辅助检查");
List<SupplementaryTestDto> supplementaryTestDtos = excelReader.readAll(SupplementaryTestDto.class);
if (null == supplementaryTestDtos || supplementaryTestDtos.isEmpty()) {
continue;
}
assertSheetDataSupplementaryTest(supplementaryTestDtos);
diseaseAncillaryManageService.batchSaveAncillaryExaminationList(disease, supplementaryTestDtos);
continue;
case "处置计划":
assertTitle(excelReader, "处置计划");
List<HandlingPlanDto> handlingPlanDtos = excelReader.readAll(HandlingPlanDto.class);
System.out.println(handlingPlanDtos);
continue;
case "评估结果概述":
assertTitle(excelReader, "评估结果概述");
List<OverviewEvaluationResultsDto> overviewEvaluationResultsDtos = excelReader.readAll(OverviewEvaluationResultsDto.class);
if (null == overviewEvaluationResultsDtos || overviewEvaluationResultsDtos.isEmpty()) {
continue;
}
updateMedicalRec(medicalRec.getId(), overviewEvaluationResultsDtos);
continue;
default:
Assert.isTrue(true, "未查询到sheet" + sheetName);
break;
}
}
return null;
}
/**
* sheet
*/
private void assertTemplate(ExcelReader excelReader) {
List<Sheet> sheets = excelReader.getSheets();
for (int i = 0; i < 6; i++) {
Sheet sheet = sheets.get(i);
String virtualSheetNameEnum = VirtualSheetNameEnum.fromCode(sheet.getSheetName());
Assert.isTrue(virtualSheetNameEnum != null, "请检查sheet名称" + sheet.getSheetName());
}
// 保证第一个sheet必须为病例信息
String sheetName = sheets.get(0).getSheetName();
Assert.isTrue(sheetName.equals("基本信息"), "模板错误,请更换模板,sheet {} " + "必须为第一个" + sheetName);
}
@Transactional
public MedicalRec batchSaveMedicalRec(List<UploadDiseaseDTO> uploadDiseaseResVos, Disease disease) {
UploadDiseaseDTO uploadDiseaseDTO = uploadDiseaseResVos.get(0);
// 保存病历
String name = uploadDiseaseDTO.getName();
String sex = uploadDiseaseDTO.getSex();
String ageStar = uploadDiseaseDTO.getAgeStar();
String maritalStatus = uploadDiseaseDTO.getMaritalStatus();
String occupation = uploadDiseaseDTO.getOccupation();
String nation = uploadDiseaseDTO.getNation();
String birthPlaceOrOrigin = uploadDiseaseDTO.getBirthPlaceOrOrigin();
String address = uploadDiseaseDTO.getAddress();
String birthPlace = uploadDiseaseDTO.getBirthPlace();
String mainSymptom = uploadDiseaseDTO.getMainSymptom();
MedicalRec medicalRec = new MedicalRec();
medicalRec.setDigitalHumanType(1);
medicalRec.setPatientName(name);
medicalRec.setPatientGender(sex);
medicalRec.setPatientAge(Integer.parseInt(ageStar));
medicalRec.setPatientMarriage(maritalStatus);
medicalRec.setPatientProfession(occupation);
medicalRec.setNativePlace(birthPlaceOrOrigin);
medicalRec.setPatientNation(nation);
medicalRec.setPatientBirthplace(birthPlace);
medicalRec.setPatientHabitation(address);
medicalRec.setDiseaseId(disease.getId());
medicalRec.setPatientSelfDesc(mainSymptom);
medicalRec.setStatus(1);
medicalRec.setCreateUserId(UserUtil.getUser().getId());
medicalRec.setUpdateUserId(UserUtil.getUser().getId());
medicalRec.setMedicalStatus(MedicalStatusEnum.CREATE.getCode());
medicalRec.setMedicalImportType(MedicalTypeEnum.TEMPLATE_IMPORT.getCode());
medicalRecService.save(medicalRec);
medicalRecService.updateMedicalRecNo("QL", "男".equals(sex) ? "M" : "F", medicalRec.getId());
return medicalRec;
}
/**
*
*
* @param id id
* @param overviewEvaluationResultsDtos
*/
private void updateMedicalRec(String id, List<OverviewEvaluationResultsDto> overviewEvaluationResultsDtos) {
MedicalRec medicalRec = new MedicalRec();
medicalRec.setId(id);
for (OverviewEvaluationResultsDto overviewEvaluationResultsDto : overviewEvaluationResultsDtos) {
String assessmentItem = overviewEvaluationResultsDto.getAssessmentItem();
switch (assessmentItem) {
case "*预期诊断结果":
String assessmentOverview = overviewEvaluationResultsDto.getAssessmentOverview();
medicalRec.setFullCheck(assessmentOverview);
continue;
case "*初步诊断依据":
String assessmentOverview1 = overviewEvaluationResultsDto.getAssessmentOverview();
medicalRec.setPrimarilyDiagnosisCriteria(assessmentOverview1);
continue;
case "*证实诊断依据":
String assessmentOverview2 = overviewEvaluationResultsDto.getAssessmentOverview();
medicalRec.setConfirmDiagnosisCriteria(assessmentOverview2);
continue;
case "*鉴别依据":
String assessmentOverview3 = overviewEvaluationResultsDto.getAssessmentOverview();
medicalRec.setDifferentialDiagnosisCriteria(assessmentOverview3);
continue;
default:
Assert.isTrue(true, "请检查评估结果概述sheet第一列是否正确");
}
}
medicalRecService.updateById(medicalRec);
}
/**
*
* todo sheetcase
*
* @param reader
* @param sheetName
*/
private void assertTitle(ExcelReader reader, String sheetName) {
List<Object> titleList = reader.readRow(0);
Assert.isTrue(CollUtil.isNotEmpty(titleList), "表头格式有误,请重新导入");
switch (sheetName) {
case "基本信息":
for (int i = 0; i < UploadDiseaseDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
Assert.isTrue(UploadDiseaseDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
}
break;
case "临床问诊":
for (int i = 0; i < ClinicalInterviewDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
Assert.isTrue(ClinicalInterviewDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
}
break;
case "体格检查":
for (int i = 0; i < UploadPhysicalExaminationDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
Assert.isTrue(UploadPhysicalExaminationDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
}
break;
case "辅助检查":
for (int i = 0; i < SupplementaryTestDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
Assert.isTrue(SupplementaryTestDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
}
break;
case "评估结果概述":
for (int i = 0; i < OverviewEvaluationResultsDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
Assert.isTrue(OverviewEvaluationResultsDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
}
break;
}
}
/**
*
*
* @param uploadDiseaseResVos
*/
private void assertSheetDataBasicInfo(List<UploadDiseaseDTO> uploadDiseaseResVos) {
Assert.notEmpty(uploadDiseaseResVos, "病例基本信息数据数据为空");
Assert.isTrue(uploadDiseaseResVos.size() != 1, "目前仅限传一个病例");
uploadDiseaseResVos.forEach(this::assertDiseaseQuestion);
}
/**
*
*
* @param uploadDiseaseResVos
*/
private void assertSheetDataClinicalInterview(List<ClinicalInterviewDTO> uploadDiseaseResVos) {
uploadDiseaseResVos.forEach(this::assertClinicalInterview);
}
private void assertSheetDataPhysicalExamination(List<UploadPhysicalExaminationDTO> uploadDiseaseResVos) {
uploadDiseaseResVos.forEach(this::assertPhysicalExamination);
}
private void assertSheetDataSupplementaryTest(List<SupplementaryTestDto> uploadDiseaseResVos) {
uploadDiseaseResVos.forEach(this::supplementaryTestDto);
}
private void assertDiseaseQuestion(UploadDiseaseDTO diseaseQuestion) {
Assert.notEmpty(diseaseQuestion.getSex(), "性别不能为空");
Assert.notEmpty(diseaseQuestion.getAgeStar(), "年龄不能为空");
Assert.isTrue(StrUtil.isNotEmpty(diseaseQuestion.getDiseaseClassificationName()), "疾病分类名称不能为空");
Assert.notEmpty(diseaseQuestion.getCommonName(), "通用名不能为空");
Assert.notEmpty(diseaseQuestion.getCategoryCode(), "疾病代码不能为空");
Assert.notEmpty(diseaseQuestion.getMainSymptom(), "主诉不能为空");
}
private void assertClinicalInterview(ClinicalInterviewDTO clinicalInterviewDTO) {
Assert.notEmpty(clinicalInterviewDTO.getConsultationI(), "问诊I不能为空");
Assert.notEmpty(clinicalInterviewDTO.getConsultationII(), "问诊Ⅱ不能为空");
}
private void assertPhysicalExamination(UploadPhysicalExaminationDTO uploadPhysicalExaminationDTO) {
// Assert.isTrue(StrUtil.isEmpty(uploadPhysicalExaminationDTO.getIiLevelClassification()), "Ⅰ级分类不能为空");
// Assert.notEmpty(uploadPhysicalExaminationDTO.getIiLevelClassification(), "Ⅱ级分类不能为空");
// Assert.notEmpty(uploadPhysicalExaminationDTO.getHumanBodyPartI(), "人体部位Ⅰ不能为空");
// Assert.notEmpty(uploadPhysicalExaminationDTO.getHumanBodyPartIi(), "人体部位Ii不能为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getNormalExamResult(), "正常检查结果不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getStatus(), "状态不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getIsNecessaryExamDefaultYes(), "*是否必查(默认是)不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getPreliminaryDiagnosisBasis(), "初步诊断依据不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getConfirmedDiagnosisBasis(), "证实诊断依据不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getDifferentialDiagnosisBasis(), "鉴别依据不可为空");
}
private void supplementaryTestDto(SupplementaryTestDto uploadPhysicalExaminationDTO) {
// Assert.isTrue(StrUtil.isEmpty(uploadPhysicalExaminationDTO.getFirstLevelCategory()), "Ⅰ级分类不能为空");
// Assert.notEmpty(uploadPhysicalExaminationDTO.getSecondLevelCategory(), "Ⅱ级分类不能为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getNormalTestResult(), "正常检查结果不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getPatientTestResult(), "病人检查结果不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getIsRequiredCheck(), "*是否必查(默认是)不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getPreliminaryDiagnosisBasis(), "初步诊断依据不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getConfirmedDiagnosisBasis(), "证实诊断依据不可为空");
Assert.notEmpty(uploadPhysicalExaminationDTO.getDifferentialDiagnosisBasis(), "鉴别依据不可为空");
}
}

@ -1,6 +1,7 @@
package com.supervision.manage;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import com.supervision.exception.BusinessException;
import com.supervision.manage.service.FileManageService;
import com.supervision.manage.service.MaterialLibraryManageService;
@ -16,13 +17,40 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import java.util.*;
@Slf4j
@SpringBootTest
public class MedicalAiAnswerSetter {
@Test
public void sd(){
String s = "现病史 发病时间\n" +
"现病史 现病史2 发病时间\n";
String[] split = s.split("\n");
for (String string : split) {
String[] split1 = string.split(" ");
Assert.isTrue(split1.length ==2, "数据格式错误");
Map<String, String> map = new HashMap<>();
map.put("item1", split1[0]);
map.put("item2", split1[1]);
}
}
public static int countChar(String str, char targetChar) {
return (int) Arrays.stream(str.split(""))
.filter(s -> s.charAt(0) == targetChar)
.count();
}
@Autowired
private MaterialLibraryManageService materialLibraryManageService;

@ -0,0 +1,33 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/10/29 10:00
* @Description: excel
*/
@Data
public class ClinicalInterviewDTO {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("问诊Ⅰ", "问诊Ⅱ", "*问题(可不选择具体问题,根据问诊类目系统识别问诊意图)","患者回复(必填-模拟专业度较高问诊场景需要 获取有效的问诊回复)");
@Alias(value = "问诊Ⅰ")
private String ConsultationI;
@Alias(value = "问诊Ⅱ")
private String ConsultationII;
@Alias(value = "问题")
private String QuestionIntentRecognition;
@Alias(value = "患者回复")
private String PatientResponseRequired;
}

@ -0,0 +1,33 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/11/5 11:09
* @Description:
*/
@Data
public class HandlingPlanDto {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("*处置方案(请选择)","* 一级措施(请选择)","* 二级措施(请选择)", "* 说明");
@Alias(value = "处置方案")
private String disposalScheme;
@Alias(value = "一级措施")
private String firstLevelMeasure;
@Alias(value = "二级措施")
private String secondLevelMeasure;
@Alias(value = "说明")
private String description;
}

@ -0,0 +1,30 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/11/5 11:09
* @Description:
*/
@Data
public class OverviewEvaluationResultsDto {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("NO.","评估项目","评估概述(需医生提供,以下为示例 可删除)", "填写说明");
@Alias(value = "评估项目")
private String assessmentItem;
@Alias(value = "评估概述(需医生提供,以下为示例 可删除)")
private String assessmentOverview;
@Alias(value = "填写说明")
private String fillingInstructions;
}

@ -0,0 +1,54 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/11/4 21:34
* @Description:
*/
@Data
public class SupplementaryTestDto {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("1级分类","Ⅱ级分类","*正常检测结果", "*病人检查结果", "状态", "*初步诊断依据", "*证实诊断依据", "*鉴别依据", "*是否必查\n默认是",
"补充项1", "补充项2");
@Alias(value = "1级分类")
private String firstLevelCategory;
@Alias(value = "Ⅱ级分类")
private String secondLevelCategory;
@Alias(value = "*正常检测结果")
private String normalTestResult;
@Alias(value = "*病人检查结果")
private String patientTestResult;
@Alias(value = "状态")
private String status;
@Alias(value = "*初步诊断依据")
private String preliminaryDiagnosisBasis;
@Alias(value = "*证实诊断依据")
private String confirmedDiagnosisBasis;
@Alias(value = "*鉴别依据")
private String differentialDiagnosisBasis;
@Alias(value = "*是否必查\n默认是")
private String isRequiredCheck;
@Alias(value = "补充项1")
private String supplementaryItem1;
@Alias(value = "补充项2")
private String supplementaryItem2;
}

@ -0,0 +1,63 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/10/29 10:00
* @Description: excel
*/
@Data
public class UploadDiseaseDTO {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("姓名","*性别","*年龄", "婚姻状态", "职业", "民族", "出生地/籍贯", "住址", "出生地","*疾病代码", "*疾病分类名称", "*通用名", "最终诊断", "*(主诉)主要症状");
@Alias(value = "姓名")
private String name;
@Alias(value = "*性别")
private String sex;
@Alias(value = "*年龄")
private String ageStar;
@Alias(value = "婚姻状态")
private String maritalStatus;
@Alias(value = "职业")
private String occupation;
@Alias(value = "民族")
private String nation;
@Alias(value = "出生地/籍贯")
private String birthPlaceOrOrigin;
@Alias(value = "住址")
private String address;
@Alias(value = "出生地")
private String birthPlace;
@Alias(value = "*疾病代码")
private String categoryCode;
@Alias(value = "*疾病分类名称")
private String diseaseClassificationName;
@Alias(value = "*通用名")
private String commonName;
// @Alias(value = "最终诊断")
// private String finalDiagnosis;
@Alias(value = "*(主诉)主要症状")
private String mainSymptom;
}

@ -0,0 +1,60 @@
package com.supervision.dto;
import cn.hutool.core.annotation.Alias;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/10/29 11:00
* @Description: excel
*/
@Data
public class UploadPhysicalExaminationDTO {
public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
("Ⅰ级分类", "Ⅱ级分类", "人体部位Ⅰ", "人体部位Ⅱ", "*正常检查结果",
"病人检查结果", "*状态", "*初步诊断依据", "*证实诊断依据", "*鉴别依据", "*是否必查\n默认是", "补充项1", "补充项2");
@Alias(value = "Ⅰ级分类")
private String iLevelClassification;
@Alias(value = "Ⅱ级分类")
private String iiLevelClassification;
@Alias(value = "人体部位Ⅰ")
private String humanBodyPartI;
@Alias(value = "人体部位Ⅱ")
private String humanBodyPartIi;
@Alias(value = "*正常检查结果")
private String normalExamResult;
@Alias(value = "病人检查结果")
private String patientExamResult;
@Alias(value = "*状态")
private String status;
@Alias(value = "*初步诊断依据")
private String preliminaryDiagnosisBasis;
@Alias(value = "*证实诊断依据")
private String confirmedDiagnosisBasis;
@Alias(value = "*鉴别依据")
private String differentialDiagnosisBasis;
@Alias(value = "*是否必查\n默认是")
private String isNecessaryExamDefaultYes;
private String supplementItem1;
private String supplementItem2;
}

@ -0,0 +1,32 @@
package com.supervision.enums;
/**
* @Authorlongbao
* @Date2024/10/31 16:59
* @Description:
*/
public enum EnumMedicalRec {
DIGITAL_HUMAN_CREATED("已创建病例", "00"),
ESTABLISHED_RECORD("数字人生成中", "01"),
MEDICAL_RECORD_ESTABLISHED("已生成数字人", "02"),
COMPLETE("完成", "03"),
;
private String description;
private String code;
EnumMedicalRec(String description, String code) {
this.description = description;
this.code = code;
}
public String getDescription() {
return description;
}
public String getCode() {
return code;
}
}

@ -23,6 +23,10 @@ public interface AskTemplateQuestionLibraryMapper extends BaseMapper<AskTemplate
Page<AskQuestionLibraryResVo> queryPageList(IPage<AskQuestionLibraryResVo> page,
@Param("askQuestionLibrary") AskQuestionLibraryReqVo askQuestionLibrary);
String queryByName(@Param("askQuestionLibrary") String nameZh);
}

@ -11,6 +11,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface AskTemplateQuestionSimilarityMapper extends BaseMapper<AskTemplateQuestionSimilarity> {
/**
*
* @param nameZh
* @param similarityQuestion
* @return
*/
public AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion);
}

@ -10,11 +10,11 @@ import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author flevance
* @description vp_disease_ancillary()Mapper
* @createDate 2023-10-20 17:19:21
* @Entity com.supervision.model.DiseaseAncillary
*/
* @author flevance
* @description vp_disease_ancillary()Mapper
* @createDate 2023-10-20 17:19:21
* @Entity com.supervision.model.DiseaseAncillary
*/
public interface DiseaseAncillaryMapper extends BaseMapper<DiseaseAncillary> {
List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(@Param("diseaseAncillary")DiseaseAncillary diseaseAncillary);

@ -9,11 +9,11 @@ import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author flevance
* @description vp_disease_physical()Mapper
* @createDate 2023-10-20 17:19:21
* @Entity com.supervision.model.DiseasePhysical
*/
* @author flevance
* @description vp_disease_physical()Mapper
* @createDate 2023-10-20 17:19:21
* @Entity com.supervision.model.DiseasePhysical
*/
public interface DiseasePhysicalMapper extends BaseMapper<DiseasePhysical> {
List<DiseasePhysicalResVo> queryListByDiseaseId(@Param("diseaseId") String diseaseId);

@ -27,13 +27,6 @@ public class Disease implements Serializable {
private String id;
@Schema(description = "疾病名称")
private String diseaseName;
@Schema(description = "疾病分类别名")
private String diseaseNameAlias;
/**
*
*/
@ -41,10 +34,11 @@ public class Disease implements Serializable {
private String code;
@Schema(description = "包含的疾病id")
@TableField(typeHandler = StringListTypeHandler.class)
private List<String> containDiseaseIds;
@Schema(description = "疾病名称")
private String diseaseName;
@Schema(description = "疾病分类别名")
private String diseaseNameAlias;
/**
* 0 1
*/
@ -54,6 +48,11 @@ public class Disease implements Serializable {
@Schema(description = "疾病类型 0单一疾病 1 复合疾病")
private Integer diseaseType;
@Schema(description = "包含的疾病id")
@TableField(typeHandler = StringListTypeHandler.class)
private List<String> containDiseaseIds;
@Schema(description = "症状")
private String symptom;

@ -125,7 +125,8 @@ public class MedicalRec extends Model<MedicalRec> implements Serializable {
@Schema(description = "鉴别诊断依据")
private String differentialDiagnosisCriteria;
@Schema(description = "全面检查")
// 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
@Schema(description = "预期诊断结果")
private String fullCheck;
@Schema(description = "提交给大模型的病历")
@ -158,6 +159,19 @@ public class MedicalRec extends Model<MedicalRec> implements Serializable {
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
*
*/
@Schema(description = "病例生成状态")
private String medicalStatus;
/**
*
*/
@Schema(description = "病例创建类型")
private String medicalImportType;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -1,5 +1,6 @@
package com.supervision.service;
import com.supervision.dto.ClinicalInterviewDTO;
import com.supervision.model.AskTemplateQuestionLibrary;
import com.supervision.model.AskTemplateQuestionSimilarity;
import com.baomidou.mybatisplus.extension.service.IService;
@ -30,4 +31,14 @@ public interface AskTemplateQuestionSimilarityService extends IService<AskTempla
*/
Map<String, List<String>> querySimilarityQuestionMapByLibraryLists(List<AskTemplateQuestionLibrary> libraryList);
/**
*
* @param nameZh
* @param similarityQuestion
* @return
*/
AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion);
}

@ -4,6 +4,7 @@ import com.supervision.dto.CommonDictTreeDTO;
import com.supervision.model.CommonDic;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.ArrayList;
import java.util.List;
/**
@ -19,4 +20,12 @@ public interface CommonDicService extends IService<CommonDic> {
*/
List<CommonDictTreeDTO> queryCommonDictTree(String groupCode);
/**
*
* @param code
* @return
*/
public Long queryCommonDictTreeByCode(ArrayList<String> code);
}

@ -19,4 +19,13 @@ public interface ConfigAncillaryItemService extends IService<ConfigAncillaryItem
List<ConfigAncillaryItemVo> queryVoList(AncillaryItemReqVo ancillaryItemReqVo);
List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo);
/**
*
* @param name1
* @param name2
* @return
*/
ConfigAncillaryItem queryAncillaryItem( String name1,String name2);
}

@ -10,4 +10,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ConfigPhysicalLocationService extends IService<ConfigPhysicalLocation> {
/**
* locationName
* @param locationName
* @param level
* @return
*/
ConfigPhysicalLocation queryLocationTreeForLocationName(String locationName, String level);
}

@ -15,4 +15,12 @@ public interface ConfigPhysicalToolService extends IService<ConfigPhysicalTool>
List<ConfigPhysicalToolResVO> queryPhysicalToolList();
/**
*
* @param type
* @param toolName
* @return
*/
ConfigPhysicalTool queryPhysicalToolByTypeAndToolName(String type, String toolName);
}

@ -10,10 +10,10 @@ import java.util.List;
import java.util.function.Supplier;
/**
* @author flevance
* @description vp_disease_ancillary()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_disease_ancillary()Service
* @createDate 2023-10-20 17:19:21
*/
public interface DiseaseAncillaryService extends IService<DiseaseAncillary> {
List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(DiseaseAncillary diseaseAncillary);

@ -8,10 +8,10 @@ import com.supervision.vo.manage.DiseasePhysicalStrResVo;
import java.util.List;
/**
* @author flevance
* @description vp_disease_physical()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_disease_physical()Service
* @createDate 2023-10-20 17:19:21
*/
public interface DiseasePhysicalService extends IService<DiseasePhysical> {
List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId);

@ -1,6 +1,7 @@
package com.supervision.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.dto.UploadDiseaseDTO;
import com.supervision.model.Disease;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.vo.manage.DiseaseReqVo;
@ -33,4 +34,21 @@ public interface DiseaseService extends IService<Disease> {
List<String> queryAllDiseaseListByDiseaseId(List<String> diseaseId);
/**
*
*
* @param codeId
* @return
*/
List<String> queryDiseaseListByDiseaseCode(List<String> codeId);
/**
*
* @param uploadDiseaseResVos
* @return
*/
Disease saveDisease(List<UploadDiseaseDTO> uploadDiseaseResVos);
}

@ -7,10 +7,10 @@ import com.supervision.vo.manage.MedicalRecPageReqVO;
import com.supervision.vo.manage.MedicalRecPageResVO;
/**
* @author flevance
* @description vp_medical_rec()Service
* @createDate 2023-11-03 11:25:43
*/
* @author flevance
* @description vp_medical_rec()Service
* @createDate 2023-11-03 11:25:43
*/
public interface MedicalRecService extends IService<MedicalRec> {
/**
@ -26,7 +26,7 @@ public interface MedicalRecService extends IService<MedicalRec> {
* ,+1
* @param code
* @param gender M F
* @param id ID
* @param id ID
*/
void updateMedicalRecNo(String code,String gender,String id);

@ -14,13 +14,13 @@ import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Administrator
* @description vp_ask_template_question_similarity()Service
* @createDate 2024-06-06 16:31:25
*/
* @author Administrator
* @description vp_ask_template_question_similarity()Service
* @createDate 2024-06-06 16:31:25
*/
@Service
public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTemplateQuestionSimilarityMapper, AskTemplateQuestionSimilarity>
implements AskTemplateQuestionSimilarityService{
implements AskTemplateQuestionSimilarityService {
@Override
public Map<String, List<String>> querySimilarityQuestionMapByLibraryIds(List<String> libraryIdList) {
@ -31,9 +31,9 @@ public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTem
.collect(Collectors.groupingBy(AskTemplateQuestionSimilarity::getLibraryId,
Collectors.mapping(AskTemplateQuestionSimilarity::getSimilarityQuestion, Collectors.toList())));
if (CollUtil.isNotEmpty(libraryIdList)){
if (CollUtil.isNotEmpty(libraryIdList)) {
for (String libraryId : libraryIdList) {
if (!similarityMap.containsKey(libraryId)){
if (!similarityMap.containsKey(libraryId)) {
similarityMap.put(libraryId, new ArrayList<>());
}
}
@ -45,11 +45,23 @@ public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTem
@Override
public Map<String, List<String>> querySimilarityQuestionMapByLibraryLists(List<AskTemplateQuestionLibrary> libraryList) {
List<String> libraryIdList = new ArrayList<>();
if (CollUtil.isNotEmpty(libraryList)){
if (CollUtil.isNotEmpty(libraryList)) {
libraryIdList = libraryList.stream().map(AskTemplateQuestionLibrary::getId).collect(Collectors.toList());
}
return querySimilarityQuestionMapByLibraryIds(libraryIdList);
}
/**
*
*
* @param nameZh
* @param similarityQuestion
* @return
*/
@Override
public AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion) {
return this.baseMapper.querySimilarityQuestionByNameZhAndSimilarityQuestion(nameZh, similarityQuestion);
}
}

@ -28,7 +28,7 @@ public class CommonDicServiceImpl extends ServiceImpl<CommonDicMapper, CommonDic
List<CommonDic> list = new ArrayList<>();
if (StrUtil.isBlank(groupCode)) {
list = super.lambdaQuery().list();
}else {
} else {
list = super.lambdaQuery().eq(CommonDic::getGroupCode, groupCode).list();
}
Map<Long, List<CommonDic>> commonDicParentIdMap = list.stream().filter(e -> ObjectUtil.isNotNull(e.getParentId()))
@ -58,6 +58,22 @@ public class CommonDicServiceImpl extends ServiceImpl<CommonDicMapper, CommonDic
}
}
/**
*
* @param code
* @return
*/
public Long queryCommonDictTreeByCode(ArrayList<String> code) {
return this.lambdaQuery()
.eq(CommonDic::getGroupCode, "AQT")
.ne(CommonDic::getParentId, "179")
.in(CommonDic::getCode, code)
.isNotNull(CommonDic::getParentId)
.count();
}
}

@ -91,6 +91,15 @@ public class ConfigAncillaryItemServiceImpl extends ServiceImpl<ConfigAncillaryI
return super.lambdaQuery().like(StrUtil.isNotEmpty(keyWord), ConfigAncillaryItem::getItemName, keyWord)
.or().like(StrUtil.isNotEmpty(keyWord), ConfigAncillaryItem::getType, keyWord).list();
}
@Override
public ConfigAncillaryItem queryAncillaryItem(String name1, String name2) {
return this.lambdaQuery()
.eq(ConfigAncillaryItem::getType, name1)
.eq(ConfigAncillaryItem::getItemName, name2)
.one();
}
}

@ -7,14 +7,22 @@ import com.supervision.mapper.ConfigPhysicalLocationMapper;
import org.springframework.stereotype.Service;
/**
* @author flevance
* @description vp_config_physical_location()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_config_physical_location()Service
* @createDate 2023-10-20 17:19:21
*/
@Service
public class ConfigPhysicalLocationServiceImpl extends ServiceImpl<ConfigPhysicalLocationMapper, ConfigPhysicalLocation>
implements ConfigPhysicalLocationService{
implements ConfigPhysicalLocationService {
@Override
public ConfigPhysicalLocation queryLocationTreeForLocationName(String locationName, String level) {
return this.lambdaQuery()
.eq(ConfigPhysicalLocation::getLocationName, locationName)
.ne(ConfigPhysicalLocation::getLevel, level)
.one();
}
}

@ -40,6 +40,16 @@ public class ConfigPhysicalToolServiceImpl extends ServiceImpl<ConfigPhysicalToo
return tool;
}).sorted(Comparator.comparingInt(ConfigPhysicalToolResVO::getPriority)).collect(Collectors.toList());
}
@Override
public ConfigPhysicalTool queryPhysicalToolByTypeAndToolName(String type, String toolName) {
ConfigPhysicalTool configPhysicalTool = this.lambdaQuery()
.eq(ConfigPhysicalTool::getType, type)
.eq(ConfigPhysicalTool::getToolName, toolName)
.one();
return configPhysicalTool;
}
}

@ -16,14 +16,14 @@ import java.util.List;
import java.util.function.Supplier;
/**
* @author flevance
* @description vp_disease_ancillary()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_disease_ancillary()Service
* @createDate 2023-10-20 17:19:21
*/
@Service
@RequiredArgsConstructor
public class DiseaseAncillaryServiceImpl extends ServiceImpl<DiseaseAncillaryMapper, DiseaseAncillary>
implements DiseaseAncillaryService{
implements DiseaseAncillaryService{
@Override
public List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(DiseaseAncillary diseaseAncillary) {

@ -11,13 +11,13 @@ import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author flevance
* @description vp_disease_physical()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_disease_physical()Service
* @createDate 2023-10-20 17:19:21
*/
@Service
public class DiseasePhysicalServiceImpl extends ServiceImpl<DiseasePhysicalMapper, DiseasePhysical>
implements DiseasePhysicalService{
implements DiseasePhysicalService{
@Override
public List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId) {

@ -5,30 +5,34 @@ import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.dto.UploadDiseaseDTO;
import com.supervision.model.Disease;
import com.supervision.service.DiseaseService;
import com.supervision.mapper.DiseaseMapper;
import com.supervision.util.StringChartUtil;
import com.supervision.util.UserUtil;
import com.supervision.vo.manage.DiseaseReqVo;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* @author flevance
* @description vp_disease()Service
* @createDate 2023-10-20 17:19:21
*/
* @author flevance
* @description vp_disease()Service
* @createDate 2023-10-20 17:19:21
*/
@Service
public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
implements DiseaseService{
implements DiseaseService {
@Override
public List<Disease> listDiseaseNestIfComposite(String id) {
Assert.notEmpty(id, "id is not allow empty");
Disease disease = super.getById(id);
if (!isCompositeDisease(disease) || CollUtil.isEmpty(disease.getContainDiseaseIds())){
if (!isCompositeDisease(disease) || CollUtil.isEmpty(disease.getContainDiseaseIds())) {
return CollUtil.newArrayList(disease);
}
@ -42,7 +46,7 @@ public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
@Override
public List<String> queryAllDiseaseListByDiseaseId(List<String> diseaseId) {
if (CollUtil.isEmpty(diseaseId)){
if (CollUtil.isEmpty(diseaseId)) {
return new ArrayList<>();
}
return this.baseMapper.queryAllDiseaseListByDiseaseId(diseaseId);
@ -50,24 +54,68 @@ public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
/**
*
*
* @param disease
* @return true false
*/
private boolean isCompositeDisease(Disease disease){
private boolean isCompositeDisease(Disease disease) {
if (Objects.isNull(disease)){
if (Objects.isNull(disease)) {
return false;
}
return isCompositeDisease(disease.getDiseaseType());
}
private boolean isCompositeDisease(Integer integer){
if (Objects.isNull(integer)){
private boolean isCompositeDisease(Integer integer) {
if (Objects.isNull(integer)) {
return false;
}
return Integer.valueOf(1).equals(integer);
}
@Override
public List<String> queryDiseaseListByDiseaseCode(List<String> codeId) {
List<String> diseaseIdList = new ArrayList<>();
List<Disease> diseaseList = this.lambdaQuery()
.select(Disease::getId)
.in(Disease::getCode, codeId)
.list();
for (Disease disease : diseaseList) {
String diseaseId = disease.getId();
diseaseIdList.add(diseaseId);
}
return diseaseIdList;
}
@Override
public Disease saveDisease(List<UploadDiseaseDTO> uploadDiseaseResVos) {
UploadDiseaseDTO uploadDiseaseDTO = uploadDiseaseResVos.get(0);
// 保存疾病
String categoryCode = uploadDiseaseDTO.getCategoryCode();
String diseaseClassificationName = uploadDiseaseDTO.getDiseaseClassificationName();
String commonName = uploadDiseaseDTO.getCommonName();
String mainSymptom = uploadDiseaseDTO.getMainSymptom();
int diseaseType = StringChartUtil.countChar(categoryCode, '/') > 0 ? 1 : 0;
Disease disease = new Disease();
disease.setCode(categoryCode);
disease.setDiseaseName(diseaseClassificationName);
disease.setDiseaseNameAlias(commonName);
disease.setStatus(0);
disease.setDiseaseType(diseaseType);
if (diseaseType == 1) {
List<String> codeIdList = Arrays.stream(categoryCode.split("/")).toList();
List<String> listByDiseaseCode = queryDiseaseListByDiseaseCode(codeIdList);
Assert.isTrue(listByDiseaseCode.size() != codeIdList.size(), "请检查复合疾病中的单一疾病是否存在");
disease.setContainDiseaseIds(listByDiseaseCode);
}
disease.setSymptom(mainSymptom);
disease.setCreateUserId(UserUtil.getUser().getId());
disease.setUpdateUserId(UserUtil.getUser().getId());
save(disease);
return disease;
}
}

@ -0,0 +1,24 @@
package com.supervision.util;
import java.util.Arrays;
/**
* @Authorlongbao
* @Date2024/11/1 13:52
* @Description:
*/
public class StringChartUtil {
/**
*
* @param str
* @param targetChar
* @return
*/
public static int countChar(String str, char targetChar) {
return (int) Arrays.stream(str.split(""))
.filter(s -> s.charAt(0) == targetChar)
.count();
}
}

@ -73,4 +73,17 @@
<select id="queryPageList" resultMap="askQuestionLibraryResultMap" resultType="com.supervision.vo.manage.AskQuestionLibraryResVo">
<include refid="queryListsql"></include>
</select>
<select id="queryByName" resultType="java.lang.String"
parameterType="java.lang.String">
select l.id
from vp_ask_template_question_library l
where l.dict_id = (select id
from vp_common_dic d
where d.parent_id IS NOT NULL
and d.group_code = 'AQT'
and d.parent_id != '179'
and d.name_zh = (#{nameZh}))
</select>
</mapper>

@ -5,18 +5,37 @@
<mapper namespace="com.supervision.mapper.AskTemplateQuestionSimilarityMapper">
<resultMap id="BaseResultMap" type="com.supervision.model.AskTemplateQuestionSimilarity">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="libraryId" column="library_id" jdbcType="VARCHAR"/>
<result property="similarityQuestion" column="similarity_question" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="libraryId" column="library_id" jdbcType="VARCHAR"/>
<result property="similarityQuestion" column="similarity_question" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,library_id,similarity_question,
id
,library_id,similarity_question,
create_user_id,create_time,update_user_id,
update_time
</sql>
<select id="querySimilarityQuestionByNameZhAndSimilarityQuestion" resultMap="BaseResultMap"
resultType="java.lang.String">
select *
from vp_ask_template_question_similarity s
where s.library_id = (select l.id
from vp_ask_template_question_library l
where l.dict_id = (select id
from vp_common_dic d
where d.parent_id IS NOT NULL
and d.group_code = 'AQT'
and d.parent_id != '179'
and d.name_zh = (#{nameZh})))
and similarity_question = #{similarityQuestion};
</select>
</mapper>

@ -90,10 +90,10 @@
da.item_id as itemId,
cai.item_name as itemName,
cai.type as itemType,
da.primarily_diagnosis_criteria_flag as primarilyDiagnosisCriteriaFlag,
da.basis_confirm_flag as basisConfirmFlag,
da.basis_identification_flag as basisIdentificationFlag,
da.full_check_flag as fullCheckFlag,
case ifnull(da.primarily_diagnosis_criteria_flag,0) when 0 then null when 1 then '初步诊断依据' end as primarilyDiagnosisCriteriaFlag,
case ifnull(da.basis_confirm_flag,0) when 0 then null when 1 then '证实诊断依据' end as basisConfirmFlag,
case ifnull(da.basis_identification_flag,0) when 0 then null when 1 then '鉴别依据' end as basisIdentificationFlag,
case ifnull(da.full_check_flag,0) when 0 then null when 1 then '全面依据' end as fullCheckFlag,
da.diagnosis_assessment_flag as diagnosisAssessmentFlag,
da.expected_diagnosis_result as expectedDiagnosisResult,
da.require_check_flag as requireCheckFlag,

@ -5,25 +5,25 @@
<mapper namespace="com.supervision.mapper.DiseasePhysicalMapper">
<resultMap id="BaseResultMap" type="com.supervision.model.DiseasePhysical">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="diseaseId" column="disease_id" jdbcType="VARCHAR"/>
<result property="toolId" column="tool_id" jdbcType="VARCHAR"/>
<result property="locationId" column="location_id" jdbcType="VARCHAR"/>
<result property="requireCheckFlag" column="require_check_flag" jdbcType="INTEGER"/>
<result property="primarilyDiagnosisCriteriaFlag" column="primarily_diagnosis_criteria_flag" jdbcType="INTEGER"/>
<result property="basisConfirmFlag" column="basis_confirm_flag" jdbcType="INTEGER"/>
<result property="basisIdentificationFlag" column="basis_identification_flag" jdbcType="INTEGER"/>
<result property="diagnosisAssessmentFlag" column="diagnosis_assessment_flag" jdbcType="INTEGER"/>
<result property="expectedDiagnosisResult" column="expected_diagnosis_result" jdbcType="VARCHAR"/>
<result property="fullCheckFlag" column="full_check_flag" jdbcType="INTEGER"/>
<result property="locationDiagnosisFlag" column="location_diagnosis_flag" jdbcType="INTEGER"/>
<result property="result" column="result" jdbcType="VARCHAR"/>
<result property="normalResult" column="normal_result" jdbcType="VARCHAR"/>
<result property="trait" column="trait" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="diseaseId" column="disease_id" jdbcType="VARCHAR"/>
<result property="toolId" column="tool_id" jdbcType="VARCHAR"/>
<result property="locationId" column="location_id" jdbcType="VARCHAR"/>
<result property="requireCheckFlag" column="require_check_flag" jdbcType="INTEGER"/>
<result property="primarilyDiagnosisCriteriaFlag" column="primarily_diagnosis_criteria_flag" jdbcType="INTEGER"/>
<result property="basisConfirmFlag" column="basis_confirm_flag" jdbcType="INTEGER"/>
<result property="basisIdentificationFlag" column="basis_identification_flag" jdbcType="INTEGER"/>
<result property="diagnosisAssessmentFlag" column="diagnosis_assessment_flag" jdbcType="INTEGER"/>
<result property="expectedDiagnosisResult" column="expected_diagnosis_result" jdbcType="VARCHAR"/>
<result property="fullCheckFlag" column="full_check_flag" jdbcType="INTEGER"/>
<result property="locationDiagnosisFlag" column="location_diagnosis_flag" jdbcType="INTEGER"/>
<result property="result" column="result" jdbcType="VARCHAR"/>
<result property="normalResult" column="normal_result" jdbcType="VARCHAR"/>
<result property="trait" column="trait" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
@ -70,10 +70,10 @@
cpl.location_name as locationName,
cpt.tool_name as toolName,
cpt.type as toolType,
dp.primarily_diagnosis_criteria_flag as primarilyDiagnosisCriteriaFlag,
dp.basis_confirm_flag as basisConfirmFlag,
dp.basis_identification_flag as basisIdentificationFlag,
dp.full_check_flag as fullCheckFlag,
case ifnull(dp.primarily_diagnosis_criteria_flag,0) when 0 then null when 1 then '初步诊断依据' end as primarilyDiagnosisCriteriaFlag,
case ifnull(dp.basis_confirm_flag,0) when 0 then null when 1 then '证实诊断依据' end as basisConfirmFlag,
case ifnull(dp.basis_identification_flag,0) when 0 then null when 1 then '鉴别依据' end as basisIdentificationFlag,
case ifnull(dp.full_check_flag,0) when 0 then null when 1 then '全面依据' end as fullCheckFlag,
dp.diagnosis_assessment_flag as diagnosisAssessmentFlag,
dp.location_diagnosis_flag as locationDiagnosisFlag,
dp.expected_diagnosis_result as expectedDiagnosisResult,

@ -21,8 +21,11 @@ public class DiagnosisResultResVO {
@Schema(description = "鉴别诊断依据")
private BasisIdentificationResultResVO basisIdentificationResult;
@Schema(description = "全面检查-(暂无相关数据)")
private FullCheckResVO fullCheck;
// @Schema(description = "全面检查-(暂无相关数据)")
// private FullCheckResVO fullCheck;
// 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
@Schema(description = "预期诊断结果")
private String fullCheck;
@Schema(description = "处置方案")
private DealPlanResVO dealPlan;

@ -62,6 +62,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
private final DiseaseAncillaryService diseaseAncillaryService;
public static <K> Predicate<K> distinctPredicateNotNull(Function<K, Object> function) {
ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
// 根据key进行去重,并排除为null的数据
return t -> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true);
}
@Override
public DiagnosisResultResVO queryDiagnosisResult(String processId) {
@ -79,7 +85,8 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
// 4.生成鉴别诊断依据
diagnosisResultResVO.setBasisIdentificationResult(createBasisIdentificationResult(medicalRec, processId));
// 5.全面检查-(暂无相关数据) 后面再看
diagnosisResultResVO.setFullCheck(null);
// 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
diagnosisResultResVO.setFullCheck(medicalRec.getFullCheck());
// 6.处置方案
diagnosisResultResVO.setDealPlan(createDealPlan(process.getDiseaseId(), processId));
return diagnosisResultResVO;
@ -194,7 +201,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
return basisPrimaryResultResVO;
}
private List<BasisDiagnosisNodeResVO> qaRecordMergeListsBasisPrimary(List<DiagnosisQaRecord> qaRecordList, List<AskPatientAnswer> list) {
BiFunction<DiagnosisQaRecord, AskPatientAnswer, Boolean> biFunction = (qaRecord, qa) -> qa.getLibraryQuestionId().equals(qaRecord.getQuestionLibraryId());
@ -209,7 +215,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
return mergeListsBasedOnCondition(qaRecordList, list, biFunction, t1, t2);
}
private List<BasisDiagnosisNodeResVO> physicalRecordMergeLists(List<PhysicalRecordByResultDTO> physicalRecordList,
List<DiseasePhysicalResVo> diseasePhysicalResVos,
Function<PhysicalRecordByResultDTO, Integer> functionCorrect) {
@ -290,7 +295,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
AncillaryRecordByResultDTO::getPrimarilyDiagnosisCriteriaFlag);
}
private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeListsConfirm(List<AncillaryRecordByResultDTO> ancillaryRecordList,
List<DiseaseAncillaryResVo> diseaseAncillaryResVos) {
@ -391,14 +395,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
return expertDiagnosisResultResVO;
}
public static <K> Predicate<K> distinctPredicateNotNull(Function<K, Object> function) {
ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
// 根据key进行去重,并排除为null的数据
return t -> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true);
}
/**
*
* <p>

Loading…
Cancel
Save