diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/DirectoryInfoManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/DirectoryInfoManageController.java index c3ebbbd4..04efbb8a 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/DirectoryInfoManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/DirectoryInfoManageController.java @@ -1,6 +1,6 @@ package com.supervision.manage.controller.file; -import com.supervision.manage.pojo.vo.DirectoryInfoVo; +import com.supervision.manage.pojo.vo.DirectoryInfoVO; import com.supervision.manage.service.DirectoryInfoManageService; import com.supervision.model.DirectoryInfo; import io.swagger.annotations.Api; @@ -47,7 +47,7 @@ public class DirectoryInfoManageController { @ApiOperation("查询文件目录") @GetMapping("/getFileDirectory") - public List getFileDirectory(@ApiParam("父级目录ID") @RequestParam(value = "parentDirId",required = false) String parentDirId) { + public List getFileDirectory(@ApiParam("父级目录ID") @RequestParam(value = "parentDirId",required = false) String parentDirId) { return directoryInfoManageService.getFileDirectory(parentDirId); diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/AnswerVideoResourceController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/AnswerVideoResourceController.java deleted file mode 100644 index d7db6b7a..00000000 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/AnswerVideoResourceController.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.supervision.manage.controller.medicalrec; - -import com.supervision.manage.service.AnswerVideoResourceService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -@Api(tags = "病历管理") -@RestController -@RequestMapping("/answerVideo") -@RequiredArgsConstructor -public class AnswerVideoResourceController { - - private final AnswerVideoResourceService answerVideoResourceService; - - @ApiOperation("初步诊断下拉列表联想(这个接口查询所有疾病,包含复合疾病)") - @GetMapping("/preGenerationMedicalAnswerVideo") - public void preGenerationMedicalAnswerVideo(String medicalId) { - answerVideoResourceService.preGenerationMedicalAnswerVideo(medicalId); - } -} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java index ad7d4682..ca6eedcc 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java @@ -1,12 +1,10 @@ package com.supervision.manage.controller.medicalrec; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.supervision.dto.CommonDictTreeDTO; -import com.supervision.manage.pojo.vo.MedicalRecCheckResVO; +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.service.CommonDicService; import com.supervision.vo.manage.DiseaseAncillaryResVo; import com.supervision.vo.manage.DiseasePhysicalResVo; import com.supervision.vo.manage.DiseaseTreatmentPlanResVo; @@ -20,7 +18,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.util.List; @Api(tags = "病历管理") @@ -111,10 +108,10 @@ public class MedicalRecManageController { @ApiOperation("导入疾病问题回答") @PostMapping("/uploadMedicalAnswer") - public String uploadMaterial(@ApiParam("文件") @RequestParam("file") MultipartFile multipartFile, - @ApiParam("病例id") @RequestParam("medicalRecId") String medicalRecId) throws IOException { + public MedicalAnswerVideoResVo uploadMedicalAnswer(@ApiParam("文件") @RequestParam("file") MultipartFile multipartFile, + @ApiParam("病例id") @RequestParam("medicalRecId") String medicalRecId) throws Exception { - return medicalRecManageService.uploadMaterial(multipartFile, medicalRecId); + return medicalRecManageService.uploadMedicalAnswer(multipartFile, medicalRecId); } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java new file mode 100644 index 00000000..b5930979 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/MedicalRecAnswerExcelDTO.java @@ -0,0 +1,225 @@ +package com.supervision.manage.dto; + +import cn.hutool.core.annotation.Alias; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.model.AskPatientAnswer; +import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.MaterialLibrary; +import lombok.Data; + +import java.util.*; +import java.util.stream.Collectors; + +@Data +public class MedicalRecAnswerExcelDTO { + + /** + * 问诊类目1 + */ + @Alias(value = "问诊类目Ⅰ") + private String questionTypeOne; + + /** + * 问诊类目2 + */ + @Alias(value = "问诊类目Ⅱ") + private String questionTypeTwo; + + /** + * 问题 + */ + @Alias(value = "* 知识") + private String question; + + /** + * 回答 + */ + @Alias(value = "* 回答") + private String answer; + + /** + * 回答视频名称 + */ + @Alias(value = "* 视频名称") + private String answerVideoName; + + @Alias(value = "错误信息") + private static String errorReason; + + private List errorCodeEnums = new ArrayList<>(); + + /** + * 问诊问题库id + */ + private String libraryQuestionId; + + /** + * 问诊问题id + */ + private String askPatientAnswerId; + + /** + * 回答资源id + */ + private String answerResourceId; + + + public static final List READ_ANSWER_VIDEO_TITLE = CollUtil.newArrayList("问诊类目Ⅰ", "问诊类目Ⅱ", "* 知识", "* 回答","* 视频名称"); + + public static final List WRITE_ANSWER_VIDEO_TITLE = CollUtil.newArrayList("问诊类目Ⅰ", "问诊类目Ⅱ", "* 知识", "* 回答","* 视频名称","错误原因"); + + public static final Map READ_HEADER_ALIAS = getReadAlias(); + + public static final Map WRITE_HEADER_ALIAS = getWriteAlias(); + + + public void doAction(List questionLibraryList, + List askPatientAnswerList, + List materialLibraryList){ + this.absentCheck(); + this.matchQuestion(questionLibraryList); + this.matchAskPatientAnswer(askPatientAnswerList); + this.matchAnswerResource(materialLibraryList); + } + + public AskPatientAnswer toAskPatientAnswer(){ + AskPatientAnswer askPatientAnswer = new AskPatientAnswer(); + askPatientAnswer.setId(this.askPatientAnswerId); + askPatientAnswer.setAnswerResourceId(this.answerResourceId); + askPatientAnswer.setLibraryQuestionId(this.libraryQuestionId); + askPatientAnswer.setAnswer(this.answer); + // 默认自定义回答 + askPatientAnswer.setAnswerType("1"); + return askPatientAnswer; + } + + + public Map toExcelMap(){ + Map map = new HashMap<>(); + map.put("questionTypeOne",this.questionTypeOne); + map.put("questionTypeTwo",this.questionTypeTwo); + map.put("question",this.question); + map.put("answer",this.answer); + map.put("answerVideoName",this.answerVideoName); + if (CollUtil.isNotEmpty(errorCodeEnums)){ + String errorMessage = errorCodeEnums.stream().map(i -> i.desc).collect(Collectors.joining(";")); + map.put("errorReason",errorMessage); + } + return map; + } + public void absentCheck(){ + if (StrUtil.isEmpty(questionTypeOne)){ + errorCodeEnums.add(ErrorCodeEnum.QUESTION_TYPE_ONE_EMPTY); + } + if (StrUtil.isEmpty(questionTypeTwo)){ + errorCodeEnums.add(ErrorCodeEnum.QUESTION_TYPE_TWO_EMPTY); + } + if (StrUtil.isEmpty(question)){ + errorCodeEnums.add(ErrorCodeEnum.QUESTION_EMPTY); + } + if (StrUtil.isEmpty(answer)){ + errorCodeEnums.add(ErrorCodeEnum.ANSWER_EMPTY); + } + if (StrUtil.isEmpty(answerVideoName)){ + errorCodeEnums.add(ErrorCodeEnum.ANSWER_VIDEO_NAME_EMPTY); + } + } + + /** + * 匹配问题库 + * @param questionLibraryList 问题库 + */ + public void matchQuestion(List questionLibraryList){ + if (StrUtil.isEmpty(this.question)){ + return; + } + if (CollUtil.isEmpty(questionLibraryList)){ + errorCodeEnums.add(ErrorCodeEnum.QUESTION_NOT_FIND); + } + for (AskTemplateQuestionLibrary questionLibrary : questionLibraryList) { + String description = questionLibrary.getDescription(); + List questionList = questionLibrary.getQuestion(); + if (this.question.equals(description)){ + this.libraryQuestionId = questionLibrary.getId(); + return; + } + if (CollUtil.isNotEmpty(questionList) && questionList.contains(this.question)){ + this.libraryQuestionId = questionLibrary.getId(); + return; + } + } + } + + /** + * 匹配患者回答 + * @param askPatientAnswerList 只匹配libraryQuestionId不为空的数据 + */ + public void matchAskPatientAnswer(List askPatientAnswerList){ + if (StrUtil.isEmpty(this.libraryQuestionId) + || StrUtil.isEmpty(this.answer) || CollUtil.isEmpty(askPatientAnswerList)){ + return; + } + + for (AskPatientAnswer askPatientAnswer : askPatientAnswerList) { + String questionId = askPatientAnswer.getLibraryQuestionId(); + String answerAnswer = askPatientAnswer.getAnswer(); + if (this.libraryQuestionId.equals(questionId) && this.answer.equals(answerAnswer)){ + this.askPatientAnswerId = askPatientAnswer.getId(); + return; + } + } + } + + public void matchAnswerResource(List materialLibraryList){ + if (StrUtil.isEmpty(this.answerVideoName)|| CollUtil.isEmpty(materialLibraryList)){ + return; + } + + for (MaterialLibrary materialLibrary : materialLibraryList) { + if (this.answerVideoName.equals(materialLibrary.getMaterialName())){ + this.answerResourceId = materialLibrary.getId(); + return; + } + } + } + + + private static Map getReadAlias(){ + Map map = new LinkedHashMap<>(); + map.put("问诊类目Ⅰ","questionTypeOne"); + map.put("问诊类目Ⅱ", "questionTypeTwo"); + map.put("* 知识", "question"); + map.put("* 回答", "answer"); + map.put("* 视频名称", "answerVideoName"); + return map; + } + + private static Map getWriteAlias(){ + Map map = new LinkedHashMap<>(); + map.put("questionTypeOne","问诊类目Ⅰ"); + map.put("questionTypeTwo", "问诊类目Ⅱ"); + map.put("question", "* 知识"); + map.put("answer", "* 回答"); + map.put("answerVideoName", "* 视频名称"); + map.put("errorReason", "错误原因"); + return map; + } + public enum ErrorCodeEnum{ + QUESTION_TYPE_ONE_EMPTY("0001","问诊类目1不能为空"), + QUESTION_TYPE_TWO_EMPTY("0002","问诊类目2不能为空"), + QUESTION_EMPTY("0003","知识不能为空"), + ANSWER_EMPTY("0004","回答不能为空"), + ANSWER_VIDEO_NAME_EMPTY("0005","视频名称不能为空"), + QUESTION_NOT_FIND("40001","知识未找到"), + ANSWER_VIDEO_NAME_NOT_FIND("40002","视频不存在"); + private String code; + private String desc; + + ErrorCodeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } +} + diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVO.java similarity index 82% rename from virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVo.java rename to virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVO.java index ebc535ad..561d42af 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVo.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/DirectoryInfoVO.java @@ -8,7 +8,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) @Data -public class DirectoryInfoVo extends DirectoryInfo { +public class DirectoryInfoVO extends DirectoryInfo { private List child; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalAnswerVideoResVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalAnswerVideoResVo.java new file mode 100644 index 00000000..3e088cef --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalAnswerVideoResVo.java @@ -0,0 +1,11 @@ +package com.supervision.manage.pojo.vo; + +import lombok.Data; + +@Data +public class MedicalAnswerVideoResVo { + + private String message; + + private String fileId; +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AnswerVideoResourceService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AnswerVideoResourceService.java index bd0b134f..c56ff87d 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AnswerVideoResourceService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AnswerVideoResourceService.java @@ -1,14 +1,14 @@ package com.supervision.manage.service; +import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo; + +import java.io.InputStream; + /** * @Description: 病例答案视频资源服务 **/ public interface AnswerVideoResourceService { - /** - * 预生成病例答案视频 - * @param medicalId 疾病id - */ - void preGenerationMedicalAnswerVideo(String medicalId); + MedicalAnswerVideoResVo generationMedicalAnswerVideo(InputStream bookStream, String medicalId) throws Exception; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DirectoryInfoManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DirectoryInfoManageService.java index 26245517..b6615b9e 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DirectoryInfoManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DirectoryInfoManageService.java @@ -1,6 +1,6 @@ package com.supervision.manage.service; -import com.supervision.manage.pojo.vo.DirectoryInfoVo; +import com.supervision.manage.pojo.vo.DirectoryInfoVO; import com.supervision.model.DirectoryInfo; import java.util.List; @@ -24,5 +24,5 @@ public interface DirectoryInfoManageService { boolean updateDirectory(DirectoryInfo directoryInfo); - List getFileDirectory(String parentDirId); + List getFileDirectory(String parentDirId); } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/FileManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/FileManageService.java index be3fd069..138a3e2c 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/FileManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/FileManageService.java @@ -4,10 +4,13 @@ import com.supervision.model.FileResource; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.File; public interface FileManageService { FileResource uploadFile(MultipartFile multipartFile, String contentType) throws Exception; + FileResource uploadFile(File file) throws Exception; + void downloadFile(String fileId, HttpServletResponse response) throws Exception; boolean deleteFile(String fileId) throws Exception; diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java index 57f3796d..c97cb256 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java @@ -1,6 +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; @@ -11,7 +12,6 @@ import com.supervision.vo.manage.MedicalRecPageResVO; import com.supervision.model.Disease; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.util.List; public interface MedicalRecManageService { @@ -41,5 +41,5 @@ public interface MedicalRecManageService { List querySingleDiseaseListByDropList(); - String uploadMaterial(MultipartFile multipartFile, String medicalRecId) throws IOException; + MedicalAnswerVideoResVo uploadMedicalAnswer(MultipartFile multipartFile, String medicalRecId) throws Exception; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DirectoryInfoManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DirectoryInfoManageServiceImpl.java index ab8a3783..2ee68583 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DirectoryInfoManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DirectoryInfoManageServiceImpl.java @@ -5,7 +5,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; -import com.supervision.manage.pojo.vo.DirectoryInfoVo; +import com.supervision.manage.pojo.vo.DirectoryInfoVO; import com.supervision.manage.service.DirectoryInfoManageService; import com.supervision.model.DirectoryInfo; import com.supervision.service.DirectoryInfoService; @@ -66,7 +66,7 @@ public class DirectoryInfoManageServiceImpl implements DirectoryInfoManageServic } @Override - public List getFileDirectory(String parentDirId) { + public List getFileDirectory(String parentDirId) { List directoryInfoList = directoryInfoService.lambdaQuery() @@ -80,29 +80,29 @@ public class DirectoryInfoManageServiceImpl implements DirectoryInfoManageServic } - private List directoryInfoListToTree(List directoryInfoList) { + private List directoryInfoListToTree(List directoryInfoList) { - ArrayList directoryInfoVos = new ArrayList<>(); + ArrayList directoryInfoVOS = new ArrayList<>(); for (DirectoryInfo directoryInfo : directoryInfoList) { if (StrUtil.isNotEmpty(directoryInfo.getParentId())){ // 跳过非顶层的目录 continue; } - DirectoryInfoVo directoryInfoVo = BeanUtil.toBean(directoryInfo, DirectoryInfoVo.class); - directoryInfoVos.add(directoryInfoVo); + DirectoryInfoVO directoryInfoVo = BeanUtil.toBean(directoryInfo, DirectoryInfoVO.class); + directoryInfoVOS.add(directoryInfoVo); for (DirectoryInfo info : directoryInfoList) { if (!directoryInfoVo.getId().equals(info.getParentId())){ continue; } if (directoryInfoVo.getChild() == null) { - directoryInfoVo.setChild(CollectionUtil.newArrayList(BeanUtil.toBean(info, DirectoryInfoVo.class))); + directoryInfoVo.setChild(CollectionUtil.newArrayList(BeanUtil.toBean(info, DirectoryInfoVO.class))); } else { - directoryInfoVo.getChild().add(BeanUtil.toBean(info, DirectoryInfoVo.class)); + directoryInfoVo.getChild().add(BeanUtil.toBean(info, DirectoryInfoVO.class)); } } } - return directoryInfoVos; + return directoryInfoVOS; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java index 32654987..a272afad 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java @@ -1,5 +1,6 @@ package com.supervision.manage.service.impl; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.supervision.manage.service.FileManageService; @@ -13,6 +14,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.File; import java.io.InputStream; import java.util.Objects; @@ -38,6 +41,22 @@ public class FileManageServiceImpl implements FileManageService { return fileResource; } + @Override + public FileResource uploadFile(File file) throws Exception { + + // 把文件上传到minio + FileResource fileResource = new FileResource(); + try (BufferedInputStream inputStream = FileUtil.getInputStream(file)){ + String minoId = MinioUtil.uploadFile(inputStream); + fileResource.setMinioId(minoId); + } + //设置文件信息 + fileResource.setFileName(FileUtil.getName(file)); + fileResource.setFileSize(FileUtil.size(file)); + fileResource.setFileType(FileUtil.getMimeType(file.getPath())); + fileResourceService.save(fileResource); + return fileResource; + } @Override public void downloadFile(String fileId, HttpServletResponse response) throws Exception { Assert.notEmpty(fileId, "文件id不能为空"); diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java index 5a4611ac..047b21d8 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.util.List; import java.util.Objects; @Service @@ -30,7 +31,16 @@ public class MaterialLibraryManageServiceImpl implements MaterialLibraryManageSe // 校验素材名是否已经存在 Assert.notEmpty(materialName, "素材名不能为空"); Assert.notEmpty(materialType, "素材类型不能为空"); - Assert.isFalse(materialLibraryService.checkMaterialNameIfExist(materialName), "素材名已存在"); + List split = StrUtil.split(materialName, "."); + Integer count = materialLibraryService.lambdaQuery().likeRight(MaterialLibrary::getMaterialName, split.get(0)).count(); + if (count > 0){ + // 重新命名文件 + if (split.size() > 1){ + materialName = split.get(0) + "(" + count + ")" + "." + split.get(split.size()-1); + }else{ + materialName = materialName + "(" + count + ")"; + } + } // 保存素材 FileResource fileResource = fileManageService.uploadFile(multipartFile, multipartFile.getContentType()); diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java index ccdbff71..1856570b 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java @@ -5,28 +5,24 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.service.DiseaseAncillaryManageService; -import com.supervision.manage.service.DiseasePhysicalManageService; -import com.supervision.manage.service.DiseaseTreatmentPlanManageService; +import com.supervision.manage.service.*; import com.supervision.model.*; import com.supervision.service.*; import com.supervision.vo.manage.DiseaseAncillaryResVo; import com.supervision.vo.manage.DiseasePhysicalResVo; import com.supervision.vo.manage.DiseaseTreatmentPlanResVo; import com.supervision.vo.manage.MedicalRecPageResVO; -import com.supervision.manage.service.MedicalRecManageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.function.Function; @@ -43,8 +39,6 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { private final AskPatientAnswerService askPatientAnswerService; - private final PatientService patientService; - private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; private final CommonDicService commonDicService; @@ -57,6 +51,8 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { private final DiseaseTreatmentPlanManageService diseaseTreatmentPlanManageService; + private final AnswerVideoResourceService answerVideoResourceService; + public List queryDiseaseListByDropList() { return diseaseService.lambdaQuery().list(); } @@ -255,17 +251,12 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { } @Override - public String uploadMaterial(MultipartFile multipartFile, String medicalRecId) throws IOException { + public MedicalAnswerVideoResVo uploadMedicalAnswer(MultipartFile multipartFile, String medicalRecId) throws Exception { // 读取上传的文件内容 InputStream inputStream = multipartFile.getInputStream(); - //查询 - - - - + return answerVideoResourceService.generationMedicalAnswerVideo(inputStream,medicalRecId); - return null; } } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java index 9e3288ce..c164a06d 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/OfflineAnswerVideoResource.java @@ -4,32 +4,35 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.Pair; -import cn.hutool.core.map.MapUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import com.supervision.manage.dto.MedicalRecAnswerExcelDTO; +import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo; import com.supervision.manage.service.AnswerVideoResourceService; +import com.supervision.manage.service.FileManageService; import com.supervision.model.AskPatientAnswer; import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.FileResource; +import com.supervision.model.MaterialLibrary; import com.supervision.service.AskPatientAnswerService; import com.supervision.service.AskTemplateQuestionLibraryService; import com.supervision.service.FileResourceService; +import com.supervision.service.MaterialLibraryService; import com.supervision.util.MinioUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import java.io.BufferedOutputStream; import java.io.File; -import java.nio.file.Files; -import java.util.ArrayList; +import java.io.FileOutputStream; +import java.io.InputStream; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -40,105 +43,129 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class OfflineAnswerVideoResource implements AnswerVideoResourceService { - @Value("${answer.offline.videoPath}") - private String videoPath; - - @Value("${answer.offline.indexFile}") - private String indexFile; - - @Value("${answer.offline.videoSuffix}") - private String videoSuffix; + @Value("${answer.offline.templateResourceId}") + private String templateResourceId; private final AskPatientAnswerService askPatientAnswerService; private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + private final MaterialLibraryService materialLibraryService; + private final FileResourceService fileResourceService; + + private final FileManageService fileManageService; + @Override - @Transactional(rollbackFor = Exception.class) - public void preGenerationMedicalAnswerVideo(String medicalId) { - - // 1. 获取视频文件,及视频内容 - List> videoFileAndContent = getVideoFileAndContent(String.join(File.separator,videoPath,medicalId), - indexFile,videoSuffix); - if (CollUtil.isEmpty(videoFileAndContent)){ - log.info("getVideoFileAndContent result is empty"); + public MedicalAnswerVideoResVo generationMedicalAnswerVideo(InputStream bookStream, String medicalId) throws Exception { + + TimeInterval timer = DateUtil.timer(); + ExcelReader reader = ExcelUtil.getReader(bookStream); + + log.info("generationMedicalAnswerVideo : 读取文件耗时:{} s" , timer.intervalSecond()); + //校验行头 + assertTitle(reader); + + List medicalRecAnswerExcelDTOS = reader.readAll(MedicalRecAnswerExcelDTO.class); + + //数据合法性校验,填充不要的数据,为进一步处理准备 + List questionLibraryList = askTemplateQuestionLibraryService.list(); + List askPatientAnswerList = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, medicalId).list(); + List materialLibraryList = materialLibraryService.list(); + medicalRecAnswerExcelDTOS.forEach(dto->dto.doAction(questionLibraryList,askPatientAnswerList,materialLibraryList)); + + // 保存诊断问询数据 + updateAskPatientAnswer(medicalRecAnswerExcelDTOS,medicalId); + + // 生成错误信息excel + File file = writeExcel(medicalRecAnswerExcelDTOS); + FileResource fileResource = fileManageService.uploadFile(file); + FileUtil.del(file); + + //组装返回消息 + MedicalAnswerVideoResVo medicalAnswerVideoResVo = new MedicalAnswerVideoResVo(); + medicalAnswerVideoResVo.setFileId(fileResource.getId()); + String message = StrUtil.format("共导入数据{}条,失败{}条",medicalRecAnswerExcelDTOS.size(), + medicalRecAnswerExcelDTOS.stream().filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).count()); + medicalAnswerVideoResVo.setMessage(message); + + return medicalAnswerVideoResVo; + } + + + public void updateAskPatientAnswer(List medicalRecAnswerExcelDTOS,String medicalId){ + + if (CollUtil.isEmpty(medicalRecAnswerExcelDTOS)){ return; } - - //2. 填充数据库中疾病问诊的资源id - Map patientAnserMap = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, medicalId).list() - .stream().collect(Collectors.toMap(answer -> StrUtil.trim(answer.getAnswer()), answer -> answer)); - // 问诊模板数据 - List askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.lambdaQuery().list(); - List resourceIds = new ArrayList<>(); - try { - for (Pair pair : videoFileAndContent) { - AskPatientAnswer askPatientAnswer = patientAnserMap.get(pair.getKey()); - if (Objects.nonNull(askPatientAnswer)){ - String resourceId = saveResource(pair.getValue()); - askPatientAnswer.setAnswerResourceId(resourceId); - resourceIds.add(resourceId); - askPatientAnswerService.updateById(askPatientAnswer); - log.info("update askPatientAnswer:{}", JSONUtil.toJsonStr(askPatientAnswer)); - }else { - //todo: 获取模板中的数据 - } + for (MedicalRecAnswerExcelDTO dto : medicalRecAnswerExcelDTOS) { + if (CollUtil.isNotEmpty(dto.getErrorCodeEnums())){ + // 校验不通过,不进行入库处理 + continue; } - } catch (Exception e) { - // 文件处理过程中出现异常,删除文件 - log.error("preGenerationMedicalAnswerVideo:生成文件失败",e); - for (String resourceId : resourceIds) { - try { - MinioUtil.deleteObject(resourceId); - } catch (Exception ex) { - log.info("删除资源失败:{}", resourceId); - } + String askPatientAnswerId = dto.getAskPatientAnswerId(); + if (StrUtil.isNotEmpty(askPatientAnswerId)){ + //更新操作 + AskPatientAnswer askPatientAnswer = dto.toAskPatientAnswer(); + askPatientAnswerService.lambdaUpdate().eq(AskPatientAnswer::getId,askPatientAnswerId) + .set(AskPatientAnswer::getAnswerResourceId,askPatientAnswer.getAnswerResourceId()) + .update(); + }else { + //新增操作 + AskPatientAnswer askPatientAnswer = dto.toAskPatientAnswer(); + askPatientAnswer.setMedicalId(medicalId); + askPatientAnswerService.save(askPatientAnswer); } } } + public File writeExcel(List medicalRecAnswerExcelDTOS) throws Exception { - /** - * 保存资源 - * @param file file - * @return 资源id - * @throws Exception - */ - private String saveResource(File file) throws Exception { - String resourceId = MinioUtil.uploadFile(Files.newInputStream(file.toPath())); - - FileResource fileResource = new FileResource(); - fileResource.setMinioId(resourceId); - fileResource.setFileType(FileUtil.getMimeType(file.toPath())); - fileResource.setFileSize(FileUtil.size(file)); - fileResourceService.save(fileResource); - return fileResource.getId(); + if (CollUtil.isEmpty(medicalRecAnswerExcelDTOS)){ + return null; + } + List errorList = medicalRecAnswerExcelDTOS.stream() + .filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList()); + + List> rowDataList = errorList.stream().map(MedicalRecAnswerExcelDTO::toExcelMap).collect(Collectors.toList()); + File templateFile = downLoadTemplate(templateResourceId); + try (ExcelWriter writer = ExcelUtil.getWriter(templateFile)){ + writer.setHeaderAlias(MedicalRecAnswerExcelDTO.WRITE_HEADER_ALIAS); + writer.setOnlyAlias(true); + writer.write(rowDataList, true); + BufferedOutputStream outputStream = FileUtil.getOutputStream(templateFile); + writer.flush(outputStream); + } + return templateFile; } - /** - * 获取视频文件及内容 - * @param videoPath 视频存放路径 - * @return pair.getKey():视频内容 pair.getValue():视频文件对象 - */ - List> getVideoFileAndContent(String videoPath, String indexFileName, String videoSuffix){ + private File downLoadTemplate(String templateId) throws Exception { - log.info("preGenerationMedicalAnswerVideo: 开始读取excel表格中数据{}",String.join(File.separator,videoPath,indexFileName)); - TimeInterval timer = DateUtil.timer(); - try (ExcelReader reader = ExcelUtil.getReader(FileUtil.file(String.join(File.separator,videoPath,indexFileName)))){ - List> allMapList = reader.readAll(); - log.info("preGenerationMedicalAnswerVideo: 读取excel表格中数据耗时:{} s", timer.intervalSecond()); - - return allMapList.stream().map(map -> { - String answerText = MapUtil.getStr(map, "A(answer)"); - String fileName = MapUtil.getStr(map, "知识库A-ID\n[病征]"); - if (StrUtil.isEmpty(answerText) || StrUtil.isEmpty(fileName)) { - log.info("文件内容不完整:answerText:{},fileName:{}", answerText, fileName); - return null; - } - return Pair.of(answerText, FileUtil.file(String.join(File.separator,videoPath,fileName)+videoSuffix)); - }).filter(Objects::nonNull).collect(Collectors.toList()); + Assert.isTrue(StrUtil.isNotEmpty(templateId),"模板id不能为空"); + FileResource fileResource = fileResourceService.getById(templateId); + Assert.notNull(fileResource,"模板文件不存在"); + + File tempFile = FileUtil.createTempFile(); + try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId()); + FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) { + byte[] bytes = new byte[1024]; + int len; + while ((len = inputStream.read(bytes)) != -1) { + fileOutputStream.write(bytes, 0, len); + } + fileOutputStream.flush(); } + return tempFile; } + private void assertTitle(ExcelReader reader){ + List titleList = reader.readRow(0); + Assert.notEmpty(titleList,"标题行为空"); + for (int i = 0; i < MedicalRecAnswerExcelDTO.READ_ANSWER_VIDEO_TITLE.size(); i++) { + Assert.isTrue(titleList.size() > i,"标题行长度不匹配"); + Assert.isTrue(MedicalRecAnswerExcelDTO.READ_ANSWER_VIDEO_TITLE.get(i).equals(titleList.get(i)),"标题行不匹配"); + } + } + + } diff --git a/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java b/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java index f2ee40b3..8faedd8a 100644 --- a/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java +++ b/virtual-patient-manage/src/test/java/com/supervision/manage/VirtualPatientManageApplicationTests.java @@ -9,6 +9,9 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import com.supervision.manage.dto.MedicalRecAnswerExcelDTO; +import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo; import com.supervision.manage.service.AnswerVideoResourceService; import com.supervision.model.AskPatientAnswer; import com.supervision.model.AskTemplateQuestionLibrary; @@ -20,8 +23,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.nio.file.Files; import java.util.*; import java.util.stream.Collectors; @@ -42,10 +44,48 @@ class VirtualPatientManageApplicationTests { @Test - void preGenerationMedicalAnswerVideoTest() throws IOException { + void excelWriterTest() throws IOException { - answerVideoResourceService.preGenerationMedicalAnswerVideo("ww"); - System.out.println("ssss"); + MedicalRecAnswerExcelDTO dto = new MedicalRecAnswerExcelDTO(); + dto.setQuestionTypeOne("222"); + dto.setQuestionTypeTwo("ddd"); + dto.setQuestion("111"); + dto.setAnswer("dada"); + dto.setAnswerVideoName("dd.mpr"); + dto.setErrorCodeEnums(CollUtil.newArrayList(MedicalRecAnswerExcelDTO.ErrorCodeEnum.ANSWER_EMPTY)); + + ArrayList rows = new ArrayList<>(); + rows.add(dto); + rows.add(dto); + + List> collect = rows.stream().map(MedicalRecAnswerExcelDTO::toExcelMap).collect(Collectors.toList()); + + // 通过工具类创建writer,默认创建xls格式 + ExcelWriter writer = ExcelUtil.getWriter("F:\\tmp\\excel\\病历问诊问题导入模板-error.xlsx"); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.setHeaderAlias(MedicalRecAnswerExcelDTO.WRITE_HEADER_ALIAS); + writer.setOnlyAlias(true); + writer.write(collect, true); + //out为OutputStream,需要写出到的目标流n + + File tempFile = FileUtil.createTempFile(); + System.out.println(tempFile.getPath()); + BufferedOutputStream outputStream = FileUtil.getOutputStream(tempFile); + writer.flush(outputStream); + + writer.close(); + + } + + + @Test + public void generationMedicalAnswerVideoTest() throws Exception { + + BufferedInputStream inputStream = FileUtil.getInputStream("F:\\tmp\\excel\\病历问诊问题导入模板.xlsx"); + + MedicalAnswerVideoResVo medicalAnswerVideoResVo = answerVideoResourceService.generationMedicalAnswerVideo(inputStream, "1111"); + + System.out.println(JSONUtil.toJsonStr(medicalAnswerVideoResVo)); } @Test