manage :添加 导入问题库信息 功能

dev_2.1.0
xueqingkun 1 year ago
parent cb9088931a
commit ba9c67e80f

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

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

@ -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<UploadQuestionLibraryDTO.ErrorCodeEnum> errorCodeEnums = new ArrayList<>();
private String dictId;
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<CommonDic> questionTypeDicList){
this.absentCheck();
this.matchQuestion(questionLibraryList);
this.matchQuestionDicId(questionTypeDicList);
}
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);
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<AskTemplateQuestionLibrary> questionLibraryList){
if (StrUtil.isEmpty(this.question)){
return;
}
for (AskTemplateQuestionLibrary questionLibrary : questionLibraryList) {
String description = questionLibrary.getDescription();
List<String> 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<CommonDic> 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<String,String> getReadAlias(){
Map<String, String> 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<String,String> getWriteAlias(){
Map<String, String> 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;
}
}
}

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

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

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

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

@ -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<AskQuestionLibraryResVo> 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<String> 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<UploadQuestionLibraryDTO> uploadQuestionLibraryDTOS = reader.readAll(UploadQuestionLibraryDTO.class);
questionExcelDoAction(uploadQuestionLibraryDTOS);
// 更新知识库
List<UploadQuestionLibraryDTO> 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<String> assertTitle(ExcelReader reader){
HashSet<String> messages = new HashSet<>();
List<Object> 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<UploadQuestionLibraryDTO> uploadQuestionLibraryDTOS) throws Exception {
List<UploadQuestionLibraryDTO> errorList = uploadQuestionLibraryDTOS.stream()
.filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList());
List<Map<String, Object>> 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<UploadQuestionLibraryDTO> uploadQuestionLibraryDTOS) {
// 查询问题库问题
List<AskTemplateQuestionLibrary> questionLibraryList = askTemplateQuestionLibraryService.list();
// 查询类目字段
List<CommonDic> 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<UploadQuestionLibraryDTO> 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;
}
}

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

@ -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<String> 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<MedicalRecAnswerExcelDTO> 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<MedicalRecAnswerExcelDTO> medicalRecAnswerExcelDTOS) throws Exception {
/* List<MedicalRecAnswerExcelDTO> errorList = medicalRecAnswerExcelDTOS.stream()
.filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList());*/
List<MedicalRecAnswerExcelDTO> errorList = medicalRecAnswerExcelDTOS.stream()
.filter(dto -> CollUtil.isNotEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList());
List<Map<String, Object>> 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<String> assertTitle(ExcelReader reader){
HashSet<String> messages = new HashSet<>();
List<Object> 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);
}

@ -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<Pair<String, File>> videoFileAndContent = getVideoFileAndContent(videoPath,indexFile,".mp4");
if (CollUtil.isEmpty(videoFileAndContent)){
log.info("getVideoFileAndContent result is empty");
return;
}
//填充数据库中疾病问诊的资源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 = 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<Pair<String, File>> 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, "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());
}
}
}

Loading…
Cancel
Save