diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/config/AskQuestionLibraryManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/config/AskQuestionLibraryManageController.java index 4b38bb7d..b8c878fb 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/config/AskQuestionLibraryManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/config/AskQuestionLibraryManageController.java @@ -2,6 +2,7 @@ package com.supervision.manage.controller.config; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AskQuestionLibraryManageService; import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.CommonDic; @@ -9,8 +10,10 @@ import com.supervision.vo.manage.AskQuestionLibraryReqVo; import com.supervision.vo.manage.AskQuestionLibraryResVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -73,4 +76,11 @@ public class AskQuestionLibraryManageController { } + @ApiOperation("导入问题库信息") + @PostMapping("/uploadQuestionLibrary") + public UploadQuestionLibraryResVo uploadQuestionLibrary(@ApiParam("文件") @RequestParam("file") MultipartFile multipartFile) throws Exception { + + return askQuestionLibraryManageService.uploadQuestionLibrary(multipartFile); + } + } 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 index 7ff09f72..6bec414a 100644 --- 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 @@ -116,12 +116,12 @@ public class MedicalRecAnswerExcelDTO { return map; } public void absentCheck(){ - if (StrUtil.isEmpty(questionTypeOne)){ + /*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); } @@ -174,6 +174,7 @@ public class MedicalRecAnswerExcelDTO { String answerAnswer = askPatientAnswer.getAnswer(); if (this.libraryQuestionId.equals(questionId) && this.answer.equals(answerAnswer)){ this.askPatientAnswerId = askPatientAnswer.getId(); + errorCodeEnums.add(ErrorCodeEnum.ASK_PATIENT_ANSWER_REPEAT); return; } } @@ -241,9 +242,13 @@ public class MedicalRecAnswerExcelDTO { QUESTION_EMPTY("0003","知识不能为空"), ANSWER_EMPTY("0004","回答不能为空"), ANSWER_VIDEO_NAME_EMPTY("0005","视频名称不能为空"), - QUESTION_NOT_FIND("40001","知识未找到"), + QUESTION_NOT_FIND("40001","知识未训练"), ANSWER_VIDEO_NAME_NOT_FIND("40002","视频不存在"), - DICE_NOT_FIND("40003","类目字典码值未找到"); + DICE_NOT_FIND("40003","类目字典码值未找到"), + + // 重复回答数据 + ASK_PATIENT_ANSWER_REPEAT("50001","患者回答数据重复"); + private String code; private String desc; diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java new file mode 100644 index 00000000..b208b93b --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/dto/UploadQuestionLibraryDTO.java @@ -0,0 +1,169 @@ +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.AskTemplateQuestionLibrary; +import com.supervision.model.CommonDic; +import lombok.Data; + +import java.util.*; +import java.util.stream.Collectors; + +@Data +public class UploadQuestionLibraryDTO { + + /** + * 问诊类目1 + */ + @Alias(value = "问诊类目Ⅰ") + private String questionTypeOne; + + /** + * 问诊类目2 对应于 vp_ask_template_question_library 表中的 dict_id对应的 name_zh + */ + @Alias(value = "问诊类目Ⅱ") + private String questionTypeTwo; + + /** + * 问题 + */ + @Alias(value = "* 知识") + private String question; + + /** + * 回答 + */ + @Alias(value = "* 回答") + private String answer; + + + @Alias(value = "错误信息") + private static String errorReason; + + private List errorCodeEnums = new ArrayList<>(); + + private String dictId; + + + 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 questionTypeDicList){ + this.absentCheck(); + this.matchQuestion(questionLibraryList); + this.matchQuestionDicId(questionTypeDicList); + } + + + + 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); + 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(UploadQuestionLibraryDTO.ErrorCodeEnum.QUESTION_TYPE_ONE_EMPTY); + } + if (StrUtil.isEmpty(questionTypeTwo)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.QUESTION_TYPE_TWO_EMPTY); + }*/ + if (StrUtil.isEmpty(question)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.QUESTION_EMPTY); + } + if (StrUtil.isEmpty(answer)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.ANSWER_EMPTY); + } + } + + /** + * 匹配问题库 + * @param questionLibraryList 问题库 + */ + public void matchQuestion(List questionLibraryList){ + if (StrUtil.isEmpty(this.question)){ + return; + } + for (AskTemplateQuestionLibrary questionLibrary : questionLibraryList) { + String description = questionLibrary.getDescription(); + List questionList = questionLibrary.getQuestion(); + if (this.question.equals(description)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.QUESTION_REPEAT); + return; + } + if (CollUtil.isNotEmpty(questionList) && questionList.contains(this.question)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.QUESTION_REPEAT); + return; + } + } + } + public void matchQuestionDicId(List questionTypeDicList){ + if (StrUtil.isEmpty(this.questionTypeTwo)){ + return; + } + if(CollUtil.isEmpty(questionTypeDicList)){ + errorCodeEnums.add(UploadQuestionLibraryDTO.ErrorCodeEnum.DICE_NOT_FIND); + } + + for (CommonDic questionTypeDic : questionTypeDicList) { + if (this.questionTypeTwo.equals(questionTypeDic.getNameZh())){ + this.dictId = String.valueOf(questionTypeDic.getId()); + return; + } + } + } + + + private static Map getReadAlias(){ + Map map = new LinkedHashMap<>(); + map.put("问诊类目Ⅰ","questionTypeOne"); + map.put("问诊类目Ⅱ", "questionTypeTwo"); + map.put("* 知识", "question"); + map.put("* 回答", "answer"); + System.out.println("init -----getReadAlias -----"); + return map; + } + + private static Map getWriteAlias(){ + Map map = new LinkedHashMap<>(); + map.put("questionTypeOne","问诊类目Ⅰ"); + map.put("questionTypeTwo", "问诊类目Ⅱ"); + map.put("question", "* 知识"); + map.put("answer", "* 回答"); + 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","视频不存在"), + DICE_NOT_FIND("40003","类目字典码值未找到"), + + QUESTION_REPEAT("50001","知识数据重复"); + 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/MedicalAnswerVideoResVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalAnswerVideoResVo.java index a5460b38..59e8c580 100644 --- 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 @@ -3,6 +3,7 @@ package com.supervision.manage.pojo.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.time.temporal.TemporalUnit; import java.util.List; @Data @@ -11,6 +12,9 @@ public class MedicalAnswerVideoResVo { @ApiModelProperty("消息内容") private String message; + @ApiModelProperty("模板是否正确 true:正确 false:错误") + private boolean templateErrorFlag = true; + @ApiModelProperty("文件id") private String fileId; diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadQuestionLibraryResVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadQuestionLibraryResVo.java new file mode 100644 index 00000000..336a981b --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadQuestionLibraryResVo.java @@ -0,0 +1,17 @@ +package com.supervision.manage.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UploadQuestionLibraryResVo { + + @ApiModelProperty("消息内容") + private String message; + + @ApiModelProperty("文件id") + private String fileId; + + @ApiModelProperty("模板是否正确 true:正确 false:错误") + private boolean templateErrorFlag = true; +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskQuestionLibraryManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskQuestionLibraryManageService.java index 191806a9..b8d0ad4b 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskQuestionLibraryManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskQuestionLibraryManageService.java @@ -1,10 +1,12 @@ package com.supervision.manage.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.model.CommonDic; import com.supervision.vo.manage.AskQuestionLibraryReqVo; import com.supervision.vo.manage.AskQuestionLibraryResVo; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -20,4 +22,6 @@ public interface AskQuestionLibraryManageService { boolean updateQuestionLibrary(AskTemplateQuestionLibrary askTemplateQuestionLibrary); boolean deleteQuestionLibrary(String id); + + UploadQuestionLibraryResVo uploadQuestionLibrary(MultipartFile multipartFile) throws Exception; } 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 138a3e2c..7527dad3 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 @@ -5,13 +5,18 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.InputStream; public interface FileManageService { FileResource uploadFile(MultipartFile multipartFile, String contentType) throws Exception; + FileResource uploadFile(InputStream inputstream) throws Exception; + FileResource uploadFile(File file) throws Exception; void downloadFile(String fileId, HttpServletResponse response) throws Exception; + File downloadFile(String fileId) throws Exception; + boolean deleteFile(String fileId) throws Exception; } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java index f6a6ea51..99454adf 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java @@ -1,30 +1,55 @@ package com.supervision.manage.service.impl; 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.Assert; import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.supervision.manage.dto.UploadQuestionLibraryDTO; +import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AskQuestionLibraryManageService; -import com.supervision.model.AskTemplateQuestionLibrary; -import com.supervision.model.CommonDic; +import com.supervision.manage.service.FileManageService; +import com.supervision.model.*; import com.supervision.service.AskTemplateQuestionLibraryService; import com.supervision.service.CommonDicService; 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.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; - +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryManageService { + @Value("${ask.offline.template.error}") + private String errorTemplateResourceId; + private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; private final CommonDicService commonDicService; + + private final FileManageService fileManageService; @Override public List queryList(AskQuestionLibraryReqVo askQuestionLibraryReqVo) { @@ -92,9 +117,133 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa return askTemplateQuestionLibraryService.removeById(id); } + @Override + @Transactional + public UploadQuestionLibraryResVo uploadQuestionLibrary(MultipartFile multipartFile) throws Exception { + InputStream inputStream = multipartFile.getInputStream(); + + TimeInterval timer = DateUtil.timer(); + ExcelReader reader = ExcelUtil.getReader(inputStream); + log.info("uploadQuestionLibrary : 读取文件耗时:{} s" , timer.intervalSecond()); + + // 校验模板是否正确 + List assertTitle = assertTitle(reader); + if (CollUtil.isNotEmpty(assertTitle)){ + FileResource fileResource = fileManageService.uploadFile(multipartFile,multipartFile.getContentType()); + UploadQuestionLibraryResVo uploadQuestionLibraryResVo = new UploadQuestionLibraryResVo(); + uploadQuestionLibraryResVo.setFileId(fileResource.getId()); + uploadQuestionLibraryResVo.setTemplateErrorFlag(false); + return uploadQuestionLibraryResVo; + } + + List uploadQuestionLibraryDTOS = reader.readAll(UploadQuestionLibraryDTO.class); + questionExcelDoAction(uploadQuestionLibraryDTOS); + + // 更新知识库 + List currentDTOS = uploadQuestionLibraryDTOS.stream().filter(dto -> CollUtil.isEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(currentDTOS)){ + for (UploadQuestionLibraryDTO currentDTO : currentDTOS) { + AskTemplateQuestionLibrary questionLibrary = new AskTemplateQuestionLibrary(); + if (StrUtil.isNotEmpty(currentDTO.getDictId())){ + questionLibrary.setDictId(Long.parseLong(currentDTO.getDictId())); + } + questionLibrary.setDescription(currentDTO.getQuestion()); + questionLibrary.setDefaultAnswer(currentDTO.getAnswer()); + this.saveQuestionLibrary(questionLibrary); + } + } + + timer.restart(); + // 生成错误信息excel + File file = writeExcel(uploadQuestionLibraryDTOS); + log.info("uploadQuestionLibrary : 生成错误信息excel耗时:{} s" , timer.intervalSecond()); + + FileResource fileResource; + try { + fileResource = fileManageService.uploadFile(file); + } finally { + FileUtil.del(file); + } + + return wrapperUploadQuestionLibraryResVo(uploadQuestionLibraryDTOS,fileResource.getId()); + } + + + private void assertSave(AskTemplateQuestionLibrary askTemplateQuestionLibrary){ - Assert.notNull(askTemplateQuestionLibrary.getDictId(),"问题类目不能为空"); + //Assert.notNull(askTemplateQuestionLibrary.getDictId(),"问题类目不能为空"); Assert.notEmpty(askTemplateQuestionLibrary.getDescription(),"问题不能为空"); Assert.notEmpty(askTemplateQuestionLibrary.getDefaultAnswer(),"默认回答不能为空"); } + + /** + * 校验行头 + * @param reader + */ + private List assertTitle(ExcelReader reader){ + HashSet messages = new HashSet<>(); + List titleList = reader.readRow(0); + if (CollUtil.isEmpty(titleList)){ + messages.add("标题行为空"); + return CollUtil.newArrayList(messages); + } + for (int i = 0; i < UploadQuestionLibraryDTO.READ_ANSWER_VIDEO_TITLE.size(); i++) { + if (titleList.size() <= i){ + messages.add("标题行长度不匹配"); + return CollUtil.newArrayList(messages); + } + if (!UploadQuestionLibraryDTO.READ_ANSWER_VIDEO_TITLE.get(i).equals(titleList.get(i))){ + messages.add("标题行不匹配"); + } + } + return CollUtil.newArrayList(messages); + } + + + + public File writeExcel(List uploadQuestionLibraryDTOS) throws Exception { + + List errorList = uploadQuestionLibraryDTOS.stream() + .filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList()); + + List> collect = errorList.stream().map(dto -> dto.toExcelMap()).collect(Collectors.toList()); + File templateFile = fileManageService.downloadFile(errorTemplateResourceId); + try (ExcelWriter writer = ExcelUtil.getWriter(templateFile)){ + writer.setHeaderAlias(UploadQuestionLibraryDTO.WRITE_HEADER_ALIAS); + writer.setOnlyAlias(true); + writer.write(collect, true); + BufferedOutputStream outputStream = FileUtil.getOutputStream(templateFile); + writer.flush(outputStream); + } + return templateFile; + } + + private void questionExcelDoAction(List uploadQuestionLibraryDTOS) { + // 查询问题库问题 + List questionLibraryList = askTemplateQuestionLibraryService.list(); + // 查询类目字段 + List questionTypeDicList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); + uploadQuestionLibraryDTOS.forEach(dto->dto.doAction(questionLibraryList,questionTypeDicList)); + } + + /** + * 组装返回消息 + * @param uploadQuestionLibraryDTOS 数据 + * @param fileId 文件id + * @return MedicalAnswerVideoResVo + */ + private UploadQuestionLibraryResVo wrapperUploadQuestionLibraryResVo(List uploadQuestionLibraryDTOS, String fileId) { + + UploadQuestionLibraryResVo uploadQuestionLibraryResVo = new UploadQuestionLibraryResVo(); + + uploadQuestionLibraryResVo.setFileId(fileId); + + String message = StrUtil.format("共导入数据{}条,失败{}条。", uploadQuestionLibraryDTOS.size(), + uploadQuestionLibraryDTOS.stream().filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).count()); + uploadQuestionLibraryResVo.setMessage(message); + + + return uploadQuestionLibraryResVo; + + } } 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 a272afad..caa740f7 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 @@ -16,6 +16,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.InputStream; import java.util.Objects; @@ -41,6 +42,17 @@ public class FileManageServiceImpl implements FileManageService { return fileResource; } + @Override + public FileResource uploadFile(InputStream inputstream) throws Exception { + // 把文件上传到minio + String minoId = MinioUtil.uploadFile(inputstream); + //设置文件信息 + FileResource fileResource = new FileResource(); + fileResource.setMinioId(minoId); + fileResourceService.save(fileResource); + return fileResource; + } + @Override public FileResource uploadFile(File file) throws Exception { @@ -79,6 +91,26 @@ public class FileManageServiceImpl implements FileManageService { } } + @Override + public File downloadFile(String fileId) throws Exception { + + Assert.notEmpty(fileId, "fileId不能为空"); + + FileResource fileResource = fileResourceService.getById(fileId); + 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; + } + @Override public boolean deleteFile(String fileId) throws Exception { Assert.notEmpty(fileId, "文件id不能为空"); 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 8cbcfaf9..e4380748 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,7 +4,6 @@ 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.Assert; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; @@ -16,7 +15,6 @@ import com.supervision.manage.service.AnswerVideoResourceService; import com.supervision.manage.service.FileManageService; import com.supervision.model.*; import com.supervision.service.*; -import com.supervision.util.MinioUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -24,10 +22,9 @@ import org.springframework.stereotype.Service; import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.InputStream; +import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -47,8 +44,6 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { private final MaterialLibraryService materialLibraryService; - private final FileResourceService fileResourceService; - private final FileManageService fileManageService; private final CommonDicService commonDicService; @@ -60,7 +55,15 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { ExcelReader reader = ExcelUtil.getReader(bookStream); log.info("generationMedicalAnswerVideo : 读取文件耗时:{} s" , timer.intervalSecond()); - assertTitle(reader); + // 校验模板是否正确 + List assertTitle = assertTitle(reader); + if (CollUtil.isNotEmpty(assertTitle)){ + FileResource fileResource = fileManageService.uploadFile(bookStream); + MedicalAnswerVideoResVo medicalAnswerVideoResVo = new MedicalAnswerVideoResVo(); + medicalAnswerVideoResVo.setFileId(fileResource.getId()); + medicalAnswerVideoResVo.setTemplateErrorFlag(false); + return medicalAnswerVideoResVo; + } List medicalRecAnswerExcelDTOS = reader.readAll(MedicalRecAnswerExcelDTO.class); @@ -71,8 +74,13 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { File file = writeExcel(medicalRecAnswerExcelDTOS); log.info("generationMedicalAnswerVideo : 生成错误信息excel耗时:{} s" , timer.intervalSecond()); - FileResource fileResource = fileManageService.uploadFile(file); - FileUtil.del(file); + FileResource fileResource; + try { + fileResource = fileManageService.uploadFile(file); + } finally { + FileUtil.del(file); + } + return wrapperMedicalAnswerVideoResVo(medicalRecAnswerExcelDTOS,fileResource.getId()); } @@ -160,52 +168,41 @@ public class OfflineAnswerVideoResource implements AnswerVideoResourceService { public File writeExcel(List medicalRecAnswerExcelDTOS) throws Exception { - /* List errorList = medicalRecAnswerExcelDTOS.stream() - .filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList());*/ + List errorList = medicalRecAnswerExcelDTOS.stream() + .filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList()); - List> rowDataList = medicalRecAnswerExcelDTOS.stream().map(MedicalRecAnswerExcelDTO::toExcelMap).collect(Collectors.toList()); - File templateFile = downLoadTemplate(errorTemplateResourceId); + File templateFile = fileManageService.downloadFile(errorTemplateResourceId); try (ExcelWriter writer = ExcelUtil.getWriter(templateFile)){ writer.setHeaderAlias(MedicalRecAnswerExcelDTO.WRITE_HEADER_ALIAS); writer.setOnlyAlias(true); - writer.write(rowDataList, true); + writer.write(errorList, true); BufferedOutputStream outputStream = FileUtil.getOutputStream(templateFile); writer.flush(outputStream); } return templateFile; } - - private File downLoadTemplate(String templateId) throws Exception { - - 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; - } - /** * 校验行头 * @param reader */ - private void assertTitle(ExcelReader reader){ + private List assertTitle(ExcelReader reader){ + HashSet messages = new HashSet<>(); List titleList = reader.readRow(0); - Assert.notEmpty(titleList,"标题行为空"); + if (CollUtil.isEmpty(titleList)){ + messages.add("标题行为空"); + return CollUtil.newArrayList(messages); + } 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)),"标题行不匹配"); + if (titleList.size() <= i){ + messages.add("标题行长度不匹配"); + return CollUtil.newArrayList(messages); + } + if (!MedicalRecAnswerExcelDTO.READ_ANSWER_VIDEO_TITLE.get(i).equals(titleList.get(i))){ + messages.add("标题行不匹配"); + } } + return CollUtil.newArrayList(messages); } 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 9a359c6e..4085dbb2 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 @@ -3,25 +3,21 @@ package com.supervision.manage; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.Pair; -import cn.hutool.core.map.MapUtil; -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.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AnswerVideoResourceService; -import com.supervision.model.AskPatientAnswer; -import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.manage.service.AskQuestionLibraryManageService; import com.supervision.service.AskPatientAnswerService; import com.supervision.service.AskTemplateQuestionLibraryService; -import com.supervision.util.MinioUtil; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockMultipartFile; import java.io.*; import java.nio.file.Files; @@ -41,6 +37,9 @@ class VirtualPatientManageApplicationTests { @Autowired private AnswerVideoResourceService answerVideoResourceService; + @Autowired + private AskQuestionLibraryManageService askQuestionLibraryManageService; + @Test @@ -89,79 +88,17 @@ class VirtualPatientManageApplicationTests { } @Test - void preGenerationMedicalAnswerVideo(){ - - String medicalId = "ww"; - - String videoPath = "F:\\tmp\\video"; - String indexFile = "标准病人语料库v1.3.xlsx"; - - // 1. 获取视频文件,及视频内容 - List> videoFileAndContent = getVideoFileAndContent(videoPath,indexFile,".mp4"); - - if (CollUtil.isEmpty(videoFileAndContent)){ - log.info("getVideoFileAndContent result is empty"); - return; - } - - //填充数据库中疾病问诊的资源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 = MinioUtil.uploadFile(Files.newInputStream(pair.getValue().toPath())); - askPatientAnswer.setAnswerResourceId(resourceId); - resourceIds.add(resourceId); - askPatientAnswerService.updateById(askPatientAnswer); - log.info("update askPatientAnswer:{}", JSONUtil.toJsonStr(askPatientAnswer)); - }else { - //todo: 获取模板中的数据 - } - } - } catch (Exception e) { - // 文件处理过程中出现异常,删除文件 - for (String resourceId : resourceIds) { - try { - MinioUtil.deleteObject(resourceId); - } catch (Exception ex) { - log.info("删除资源失败:{}", resourceId); - } - } - } - } - + public void uploadQuestionLibraryTest() throws Exception { - /** - * 获取视频文件及内容 - * @param videoPath 视频存放路径 - * @return pair.getKey():视频内容 pair.getValue():视频文件对象 - */ + MockMultipartFile mockMultipartFile = new MockMultipartFile("test.xls","originalFilename" , + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + FileUtil.getInputStream("F:\\tmp\\excel\\知识导入模板 - 副本.xlsx")); - List> getVideoFileAndContent(String videoPath,String indexFileName,String videoSuffix){ + UploadQuestionLibraryResVo uploadQuestionLibraryResVo = askQuestionLibraryManageService.uploadQuestionLibrary(mockMultipartFile); - try (ExcelReader reader = ExcelUtil.getReader(FileUtil.file(String.join(File.separator,videoPath,indexFileName)))){ + System.out.println(JSONUtil.toJsonStr(uploadQuestionLibraryResVo)); - return reader.readAll().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()); - } } - - - }