manage : 添加 导入疾病问题回答 功能

dev_2.1.0
xueqingkun 1 year ago
parent 45260cadc8
commit 9c78933477

@ -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<DirectoryInfoVo> getFileDirectory(@ApiParam("父级目录ID") @RequestParam(value = "parentDirId",required = false) String parentDirId) {
public List<DirectoryInfoVO> getFileDirectory(@ApiParam("父级目录ID") @RequestParam(value = "parentDirId",required = false) String parentDirId) {
return directoryInfoManageService.getFileDirectory(parentDirId);

@ -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);
}
}

@ -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);
}

@ -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<ErrorCodeEnum> errorCodeEnums = new ArrayList<>();
/**
* id
*/
private String libraryQuestionId;
/**
* id
*/
private String askPatientAnswerId;
/**
* id
*/
private String answerResourceId;
public static final List<String> READ_ANSWER_VIDEO_TITLE = CollUtil.newArrayList("问诊类目Ⅰ", "问诊类目Ⅱ", "* 知识", "* 回答","* 视频名称");
public static final List<String> WRITE_ANSWER_VIDEO_TITLE = CollUtil.newArrayList("问诊类目Ⅰ", "问诊类目Ⅱ", "* 知识", "* 回答","* 视频名称","错误原因");
public static final Map<String,String> READ_HEADER_ALIAS = getReadAlias();
public static final Map<String,String> WRITE_HEADER_ALIAS = getWriteAlias();
public void doAction(List<AskTemplateQuestionLibrary> questionLibraryList,
List<AskPatientAnswer> askPatientAnswerList,
List<MaterialLibrary> 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<String,Object> toExcelMap(){
Map<String,Object> 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<AskTemplateQuestionLibrary> 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<String> 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<AskPatientAnswer> 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<MaterialLibrary> 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<String,String> getReadAlias(){
Map<String, String> map = new LinkedHashMap<>();
map.put("问诊类目Ⅰ","questionTypeOne");
map.put("问诊类目Ⅱ", "questionTypeTwo");
map.put("* 知识", "question");
map.put("* 回答", "answer");
map.put("* 视频名称", "answerVideoName");
return map;
}
private static Map<String,String> getWriteAlias(){
Map<String, String> 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;
}
}
}

@ -8,7 +8,7 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class DirectoryInfoVo extends DirectoryInfo {
public class DirectoryInfoVO extends DirectoryInfo {
private List<DirectoryInfo> child;
}

@ -0,0 +1,11 @@
package com.supervision.manage.pojo.vo;
import lombok.Data;
@Data
public class MedicalAnswerVideoResVo {
private String message;
private String fileId;
}

@ -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;
}

@ -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<DirectoryInfoVo> getFileDirectory(String parentDirId);
List<DirectoryInfoVO> getFileDirectory(String parentDirId);
}

@ -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;

@ -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<Disease> querySingleDiseaseListByDropList();
String uploadMaterial(MultipartFile multipartFile, String medicalRecId) throws IOException;
MedicalAnswerVideoResVo uploadMedicalAnswer(MultipartFile multipartFile, String medicalRecId) throws Exception;
}

@ -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<DirectoryInfoVo> getFileDirectory(String parentDirId) {
public List<DirectoryInfoVO> getFileDirectory(String parentDirId) {
List<DirectoryInfo> directoryInfoList = directoryInfoService.lambdaQuery()
@ -80,29 +80,29 @@ public class DirectoryInfoManageServiceImpl implements DirectoryInfoManageServic
}
private List<DirectoryInfoVo> directoryInfoListToTree(List<DirectoryInfo> directoryInfoList) {
private List<DirectoryInfoVO> directoryInfoListToTree(List<DirectoryInfo> directoryInfoList) {
ArrayList<DirectoryInfoVo> directoryInfoVos = new ArrayList<>();
ArrayList<DirectoryInfoVO> 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;
}

@ -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不能为空");

@ -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<String> 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());

@ -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<Disease> 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;
}
}

@ -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<Pair<String, File>> 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<MedicalRecAnswerExcelDTO> medicalRecAnswerExcelDTOS = reader.readAll(MedicalRecAnswerExcelDTO.class);
//数据合法性校验,填充不要的数据,为进一步处理准备
List<AskTemplateQuestionLibrary> questionLibraryList = askTemplateQuestionLibraryService.list();
List<AskPatientAnswer> askPatientAnswerList = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, medicalId).list();
List<MaterialLibrary> 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<MedicalRecAnswerExcelDTO> medicalRecAnswerExcelDTOS,String medicalId){
if (CollUtil.isEmpty(medicalRecAnswerExcelDTOS)){
return;
}
//2. 填充数据库中疾病问诊的资源id
Map<String, AskPatientAnswer> patientAnserMap = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, medicalId).list()
.stream().collect(Collectors.toMap(answer -> StrUtil.trim(answer.getAnswer()), answer -> answer));
// 问诊模板数据
List<AskTemplateQuestionLibrary> askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.lambdaQuery().list();
List<String> resourceIds = new ArrayList<>();
try {
for (Pair<String, File> 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<MedicalRecAnswerExcelDTO> 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<MedicalRecAnswerExcelDTO> errorList = medicalRecAnswerExcelDTOS.stream()
.filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList());
List<Map<String, Object>> 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<Pair<String, File>> 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<Map<String, Object>> allMapList = reader.readAll();
log.info("preGenerationMedicalAnswerVideo: 读取excel表格中数据耗时:{} s", timer.intervalSecond());
return allMapList.stream().map(map -> {
String answerText = MapUtil.getStr(map, "Aanswer");
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<Object> 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)),"标题行不匹配");
}
}
}

@ -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<MedicalRecAnswerExcelDTO> rows = new ArrayList<>();
rows.add(dto);
rows.add(dto);
List<Map<String, Object>> 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

Loading…
Cancel
Save