From 5d9063603fe20060ff2d72447da0be62e948955d Mon Sep 17 00:00:00 2001 From: liu Date: Thu, 2 Nov 2023 11:42:04 +0800 Subject: [PATCH] =?UTF-8?q?rasa=E8=AE=AD=E7=BB=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/supervision/mapper/LockMapper.java | 18 ----- .../model/AskDiseaseQuestionAnswer.java | 6 +- .../main/java/com/supervision/model/Lock.java | 45 ------------ .../com/supervision/service/LockService.java | 13 ---- .../service/impl/LockServiceImpl.java | 22 ------ .../mapper/AskDiseaseQuestionAnswerMapper.xml | 4 +- .../src/main/resources/mapper/LockMapper.xml | 19 ----- .../rasa/VirtualPatientRasaApplication.java | 1 + .../rasa/controller/RasaFileController.java | 8 +-- .../controller/AskPrimaryController.java | 7 +- .../controller/RasaController.java | 22 +++++- .../controller/TestController.java | 2 +- .../com/supervision/service/RasaService.java | 9 ++- .../service/impl/RasaServiceImpl.java | 70 ++++++++++++++++--- .../java/com/supervision/util/RasaUtil.java | 5 +- .../src/main/resources/application.yml | 6 +- 16 files changed, 110 insertions(+), 147 deletions(-) delete mode 100644 virtual-patient-model/src/main/java/com/supervision/mapper/LockMapper.java delete mode 100644 virtual-patient-model/src/main/java/com/supervision/model/Lock.java delete mode 100644 virtual-patient-model/src/main/java/com/supervision/service/LockService.java delete mode 100644 virtual-patient-model/src/main/java/com/supervision/service/impl/LockServiceImpl.java delete mode 100644 virtual-patient-model/src/main/resources/mapper/LockMapper.xml diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/LockMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/LockMapper.java deleted file mode 100644 index 933d13c5..00000000 --- a/virtual-patient-model/src/main/java/com/supervision/mapper/LockMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.supervision.mapper; - -import com.supervision.model.Lock; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** -* @author flevance -* @description 针对表【lock(并发锁,目前没有redis,使用这个)】的数据库操作Mapper -* @createDate 2023-11-01 13:11:34 -* @Entity com.supervision.model.Lock -*/ -public interface LockMapper extends BaseMapper { - -} - - - - diff --git a/virtual-patient-model/src/main/java/com/supervision/model/AskDiseaseQuestionAnswer.java b/virtual-patient-model/src/main/java/com/supervision/model/AskDiseaseQuestionAnswer.java index 45042ba7..e6da314b 100644 --- a/virtual-patient-model/src/main/java/com/supervision/model/AskDiseaseQuestionAnswer.java +++ b/virtual-patient-model/src/main/java/com/supervision/model/AskDiseaseQuestionAnswer.java @@ -31,10 +31,10 @@ public class AskDiseaseQuestionAnswer extends Model im private String id; /** - * 疾病ID + * 病人ID */ - @ApiModelProperty("疾病ID") - private String diseaseId; + @ApiModelProperty("病人ID") + private String patientId; /** * 模板问题ID(如果not null,则从template_question表出code,desc,question) diff --git a/virtual-patient-model/src/main/java/com/supervision/model/Lock.java b/virtual-patient-model/src/main/java/com/supervision/model/Lock.java deleted file mode 100644 index 5a0fbd44..00000000 --- a/virtual-patient-model/src/main/java/com/supervision/model/Lock.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.supervision.model; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; -import lombok.Data; - -/** - * 并发锁,目前没有redis,使用这个 - * @TableName lock - */ -@TableName(value ="lock") -@Data -public class Lock implements Serializable { - /** - * - */ - @TableId - private String id; - - /** - * 锁 - */ - private String lockCode; - - /** - * 时间戳 - */ - private Long timestamp; - - /** - * 超时毫秒数 - */ - private Long expireMs; - - /** - * 线程ID,以支持重入 - */ - private String threadId; - - @TableField(exist = false) - private static final long serialVersionUID = 1L; -} \ No newline at end of file diff --git a/virtual-patient-model/src/main/java/com/supervision/service/LockService.java b/virtual-patient-model/src/main/java/com/supervision/service/LockService.java deleted file mode 100644 index 393b4cb5..00000000 --- a/virtual-patient-model/src/main/java/com/supervision/service/LockService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.supervision.service; - -import com.supervision.model.Lock; -import com.baomidou.mybatisplus.extension.service.IService; - -/** -* @author flevance -* @description 针对表【lock(并发锁,目前没有redis,使用这个)】的数据库操作Service -* @createDate 2023-11-01 13:11:34 -*/ -public interface LockService extends IService { - -} diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/LockServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/LockServiceImpl.java deleted file mode 100644 index e58d9810..00000000 --- a/virtual-patient-model/src/main/java/com/supervision/service/impl/LockServiceImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.supervision.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.supervision.model.Lock; -import com.supervision.service.LockService; -import com.supervision.mapper.LockMapper; -import org.springframework.stereotype.Service; - -/** -* @author flevance -* @description 针对表【lock(并发锁,目前没有redis,使用这个)】的数据库操作Service实现 -* @createDate 2023-11-01 13:11:34 -*/ -@Service -public class LockServiceImpl extends ServiceImpl - implements LockService{ - -} - - - - diff --git a/virtual-patient-model/src/main/resources/mapper/AskDiseaseQuestionAnswerMapper.xml b/virtual-patient-model/src/main/resources/mapper/AskDiseaseQuestionAnswerMapper.xml index 902614d2..6a8e90ef 100644 --- a/virtual-patient-model/src/main/resources/mapper/AskDiseaseQuestionAnswerMapper.xml +++ b/virtual-patient-model/src/main/resources/mapper/AskDiseaseQuestionAnswerMapper.xml @@ -6,7 +6,7 @@ - + @@ -19,7 +19,7 @@ - id,disease_id,template_question_id, + id,patient_id,template_question_id, code,description,question, answer,create_user_id,create_time, update_user_id,update_time diff --git a/virtual-patient-model/src/main/resources/mapper/LockMapper.xml b/virtual-patient-model/src/main/resources/mapper/LockMapper.xml deleted file mode 100644 index 7f5495cf..00000000 --- a/virtual-patient-model/src/main/resources/mapper/LockMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - id,lock_code,timestamp, - expire_ms,thread_id - - diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java index 3133aa8b..523e2d7e 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java @@ -11,6 +11,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling @MapperScan(basePackages = {"com.supervision.**.mapper"}) +// 排除JWT权限校验 @ComponentScan(basePackages = {"com.supervision"},excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {WebConfig.class})) public class VirtualPatientRasaApplication { diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java index cc96563c..95d1ba95 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java @@ -2,6 +2,7 @@ package com.supervision.rasa.controller; import cn.hutool.core.util.StrUtil; +import com.supervision.exception.BusinessException; import com.supervision.rasa.service.RasaFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -28,14 +29,13 @@ public class RasaFileController { public String saveRasaFile(@RequestParam("file") MultipartFile file, @RequestParam("modelId") String modelId) throws IOException { if (file == null || file.isEmpty()) { - return "file is empty"; + throw new BusinessException("file is empty"); } if (StrUtil.isEmpty(modelId)){ - return "modelId is empty"; + throw new BusinessException("modelId is empty"); } - rasaFileService.saveRasaFile(file,modelId); - return "succss"; + return "success"; } } diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/AskPrimaryController.java b/virtual-patient-web/src/main/java/com/supervision/controller/AskPrimaryController.java index 3ff59eb9..dc498fc9 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/AskPrimaryController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/AskPrimaryController.java @@ -8,10 +8,7 @@ import com.supervision.vo.ask.DiagnosisPrimaryVO; 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.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -36,7 +33,7 @@ public class AskPrimaryController { } @ApiOperation("保存初步诊断") - @GetMapping("savePrimary") + @PostMapping("savePrimary") public void savePrimary(@RequestBody DiagnosisPrimary reqVO){ askPrimaryService.savePrimary(reqVO); } diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/RasaController.java b/virtual-patient-web/src/main/java/com/supervision/controller/RasaController.java index 5c63ec87..9ac70462 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/RasaController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/RasaController.java @@ -1,7 +1,12 @@ package com.supervision.controller; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.supervision.domain.GlobalResult; import com.supervision.service.RasaService; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,9 +18,22 @@ public class RasaController { private final RasaService rasaService; + @ApiOperation("生成rasa的yml文件") @GetMapping("generateRasaYml") - public void generateRasaYml(String diseaseId){ - rasaService.generateRasaYml(diseaseId); + public GlobalResult generateRasaYml(String patientId) { + return rasaService.generateRasaYml(patientId); + } + + @ApiOperation("训练rasa") + @GetMapping("trainRasa") + public GlobalResult trainRasa(String patientId) throws JsonProcessingException { + return rasaService.trainRasa(patientId); + } + + @ApiOperation("运行Rasa") + @GetMapping("runRasa") + public GlobalResult runRasa(String patientId) throws JsonProcessingException { + return rasaService.runRasa(patientId); } diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java index b3b1c70a..6e95fbdf 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/TestController.java @@ -118,7 +118,7 @@ public class TestController { AskDiseaseQuestionAnswer askDiseaseQuestionAnswer = new AskDiseaseQuestionAnswer(); - askDiseaseQuestionAnswer.setDiseaseId("1"); + askDiseaseQuestionAnswer.setPatientId("1"); askDiseaseQuestionAnswer.setTemplateQuestionId(templateQuestion.getId()); askDiseaseQuestionAnswer.setAnswer(ListUtil.of(answer)); askDiseaseQuestionAnswer.insert(); diff --git a/virtual-patient-web/src/main/java/com/supervision/service/RasaService.java b/virtual-patient-web/src/main/java/com/supervision/service/RasaService.java index 3396a3be..ffc6977f 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/RasaService.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/RasaService.java @@ -1,6 +1,13 @@ package com.supervision.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.supervision.domain.GlobalResult; + public interface RasaService { - void generateRasaYml(String diseaseId); + GlobalResult generateRasaYml(String diseaseId); + + GlobalResult trainRasa(String patientId) throws JsonProcessingException; + + GlobalResult runRasa(String patientId) throws JsonProcessingException; } diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/RasaServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/RasaServiceImpl.java index b4c4126e..ed61af87 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/impl/RasaServiceImpl.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/RasaServiceImpl.java @@ -4,9 +4,18 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.supervision.domain.GlobalResult; import com.supervision.exception.BusinessException; import com.supervision.model.*; +import com.supervision.pojo.paddlespeech.res.PaddleSpeechResDTO; +import com.supervision.pojo.paddlespeech.res.TtsResultDTO; import com.supervision.pojo.rasa.train.DomainYmlTemplate; import com.supervision.pojo.rasa.train.NluYmlTemplate; import com.supervision.pojo.rasa.train.QuestionAnswerDTO; @@ -16,6 +25,7 @@ import freemarker.template.Configuration; import freemarker.template.Template; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; @@ -43,8 +53,19 @@ public class RasaServiceImpl implements RasaService { private final ConfigAncillaryItemService configAncillaryItemService; + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Value("${rasa.base-url}${rasa.saveRasaFile}") + private String saveRasaFileUrl; + + @Value("${rasa.base-url}${rasa.train}") + private String trainRasaUrl; + + @Value("${rasa.base-url}${rasa.run}") + private String runRasaUrl; + @Override - public void generateRasaYml(String diseaseId) { + public GlobalResult generateRasaYml(String patientId) { Map ymalFileMap = new HashMap<>(); // 默认问答MAP @@ -53,29 +74,42 @@ public class RasaServiceImpl implements RasaService { List ruleList = new ArrayList<>(); // 开始生成各种yaml文件 - generateNlu(diseaseId, questionCodeAndIdMap, ymalFileMap); + generateNlu(patientId, questionCodeAndIdMap, ymalFileMap); generateDomain(questionCodeAndIdMap, ruleList, ymalFileMap); generateRule(ruleList, ymalFileMap); // 生成压缩文件 + List tempFile = new ArrayList<>(); + File tempZipFile = FileUtil.createTempFile(".zip", true); ByteArrayOutputStream bos = new ByteArrayOutputStream(); try (ZipOutputStream zipOutputStream = new ZipOutputStream(bos)) { for (Map.Entry fileEntry : ymalFileMap.entrySet()) { zipOutputStream.putNextEntry(new ZipEntry(fileEntry.getKey())); IoUtil.copy(FileUtil.getInputStream(fileEntry.getValue()), zipOutputStream); zipOutputStream.closeEntry(); + tempFile.add(fileEntry.getValue()); } zipOutputStream.finish(); + // 调用接口传文件 + HttpRequest request = HttpRequest.post(saveRasaFileUrl); + IoUtil.copy(new ByteArrayInputStream(bos.toByteArray()), FileUtil.getOutputStream(tempZipFile)); + request.form("file", tempZipFile); + request.form("modelId", patientId); + HttpResponse response = request.execute(); + String responseBody = response.body(); + log.info(responseBody); + return objectMapper.readValue(responseBody, new TypeReference>() { + }); } catch (Exception e) { log.error("生成ZIP文件失败", e); throw new BusinessException("生成ZIP文件失败"); + } finally { + // 最后把临时文件删除 + tempFile.forEach(FileUtil::del); + FileUtil.del(tempZipFile); } - // TODO 这是压缩文件的字节流,这里需要把自己流调用Python程序 - byte[] byteArray = bos.toByteArray(); - File file = new File("rasa.zip"); - IoUtil.copy(new ByteArrayInputStream(byteArray), FileUtil.getOutputStream(file)); } - private void generateNlu(String diseaseId, + private void generateNlu(String patientId, Map intentCodeAndIdMap, Map ymalFileMap) { // 首先生成根据意图查找到nlu文件 @@ -98,7 +132,7 @@ public class RasaServiceImpl implements RasaService { } // 然后处理该疾病对应的意图 List diseaseQuestionAnswerList = askDiseaseQuestionAnswerService.lambdaQuery() - .eq(AskDiseaseQuestionAnswer::getDiseaseId, diseaseId).list(); + .eq(AskDiseaseQuestionAnswer::getPatientId, patientId).list(); // 使用通用模板的 Map templateQuestionMap = new HashMap<>(); // 根据默认意图找到所有的问题 @@ -215,7 +249,7 @@ public class RasaServiceImpl implements RasaService { configuration.setClassForTemplateLoading(clazz, "/templates"); // 模板文件的所在目录 // 获取模板 Template template = configuration.getTemplate(ftlName); - File tempFile = FileUtil.createTempFile(); + File tempFile = FileUtil.createTempFile(".yml", true); // 创建输出文件 try (PrintWriter out = new PrintWriter(tempFile);) { // 填充并生成输出 @@ -230,4 +264,22 @@ public class RasaServiceImpl implements RasaService { } + + @Override + public GlobalResult trainRasa(String patientId) throws JsonProcessingException { + Map param = new HashMap<>(); + param.put("modelId", patientId); + String responseBody = HttpUtil.post(trainRasaUrl, param); + return objectMapper.readValue(responseBody, new TypeReference>() { + }); + } + + @Override + public GlobalResult runRasa(String patientId) throws JsonProcessingException { + Map param = new HashMap<>(); + param.put("modelId", patientId); + String responseBody = HttpUtil.post(runRasaUrl, param); + return objectMapper.readValue(responseBody, new TypeReference>() { + }); + } } diff --git a/virtual-patient-web/src/main/java/com/supervision/util/RasaUtil.java b/virtual-patient-web/src/main/java/com/supervision/util/RasaUtil.java index 15cce320..aca9bd4a 100644 --- a/virtual-patient-web/src/main/java/com/supervision/util/RasaUtil.java +++ b/virtual-patient-web/src/main/java/com/supervision/util/RasaUtil.java @@ -16,14 +16,15 @@ import java.util.stream.Collectors; @Slf4j public class RasaUtil { - private static final String RASA_URL = SpringBeanUtil.getBean(Environment.class).getProperty("rasa.url"); + private static final Environment environment = SpringBeanUtil.getBean(Environment.class); + private static final String RASA_TALK_URL = environment.getProperty("rasa.base-url") + environment.getProperty("rasa.talk"); public static String talkRasa(String question, String sessionId, String patientId) { RasaTalkVo rasaTalkVo = new RasaTalkVo(); rasaTalkVo.setQuestion(question); rasaTalkVo.setSessionId(sessionId); rasaTalkVo.setModelId(patientId); - String post = HttpUtil.post(RASA_URL, JSONUtil.toJsonStr(rasaTalkVo)); + String post = HttpUtil.post(RASA_TALK_URL, JSONUtil.toJsonStr(rasaTalkVo)); List list = JSONUtil.toList(post, String.class); log.info("调用rasa对话返回结果:{}",post); if (CollUtil.isEmpty(list)){ diff --git a/virtual-patient-web/src/main/resources/application.yml b/virtual-patient-web/src/main/resources/application.yml index 0aabcc72..8da7ea82 100644 --- a/virtual-patient-web/src/main/resources/application.yml +++ b/virtual-patient-web/src/main/resources/application.yml @@ -62,7 +62,11 @@ paddle-speech: tts: http://192.168.10.137:8090/paddlespeech/tts asr: http://192.168.10.137:8090/paddlespeech/asr rasa: - url: http://192.168.10.137:8890/rasa/talkRasa + base-url: http://192.168.10.137:8890/ + talk: rasa/talkRasa + saveRasaFile: rasaFile/saveRasaFile + train: rasaCmd/trainExec + run: rasaCmd/runExec human: base-url: https://digital-human.jd.com room-id: /getRoomId