lifang 4 месяцев назад
Родитель
Сommit
a92c3b7ac0

+ 2 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ImServerAutoConfiguration.java

@@ -2,6 +2,7 @@ package cn.tr.module.mobile.config;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -22,6 +23,7 @@ public class ImServerAutoConfiguration {
      * Spring容器初始化完成后启动IM服务
      */
     @PostConstruct
+    @Async
     public void startIMServer() {
         imServerService.start();
     }

+ 1 - 0
tr-modules/tr-module-smartFollowUp/pom.xml

@@ -104,5 +104,6 @@
             <artifactId>tr-module-mobile</artifactId>
             <version>${revision}</version>
         </dependency>
+
     </dependencies>
 </project>

+ 3 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/properties/ALiYunProperties.java

@@ -16,4 +16,7 @@ public class ALiYunProperties {
     private String appId;
     private String apiKey;
 
+    private String llmApiKey;
+    private String llmModel;
+
 }

+ 3 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizQuestionGroupService.java

@@ -8,6 +8,8 @@ import cn.tr.module.smart.web.dto.BizDeptUnlinkQuestionQueryDTO;
 import cn.tr.module.smart.web.dto.BizWebQuestionAnswerDTO;
 import cn.tr.module.smart.web.vo.BizDeptUnlinkQuestionVO;
 import cn.tr.module.smart.wx.controller.vo.BizWebQuestionGroupVO;
+import com.alibaba.dashscope.exception.InputRequiredException;
+import com.alibaba.dashscope.exception.NoApiKeyException;
 
 import java.util.Collection;
 import java.util.List;
@@ -81,5 +83,5 @@ public interface IBizQuestionGroupService{
      */
     List<BizDeptUnlinkQuestionVO> queryAllUnlink(BizDeptUnlinkQuestionQueryDTO source);
 
-    List<BizQuestionDTO> generateAi(BizQuestionGroupAiDTO source);
+    List<BizQuestionDTO> generateAi(BizQuestionGroupAiDTO source) throws NoApiKeyException, InputRequiredException;
 }

+ 28 - 41
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizQuestionGroupServiceImpl.java

@@ -2,21 +2,17 @@ package cn.tr.module.smart.common.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.json.JSONUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.core.tenant.TenantContextHolder;
-import cn.tr.module.smart.app.controller.vo.WxDoctorClinicRoomThumbnailVO;
 import cn.tr.module.smart.common.dto.BizQuestionDTO;
 import cn.tr.module.smart.common.dto.BizQuestionGroupAiDTO;
 import cn.tr.module.smart.common.dto.BizQuestionGroupDTO;
 import cn.tr.module.smart.common.dto.BizQuestionGroupQueryDTO;
-import cn.tr.module.smart.common.entity.BizWxAppletQuestionAnswerEntity;
 import cn.tr.module.smart.common.enums.QuestionGroupTypeEnums;
 import cn.tr.module.smart.common.mapper.*;
 import cn.tr.module.smart.common.po.*;
@@ -28,21 +24,17 @@ import cn.tr.module.smart.common.repository.BizQuestionRepository;
 import cn.tr.module.smart.common.service.IBizQuestionGroupService;
 import cn.tr.module.smart.common.service.IBizQuestionGroupSquareService;
 import cn.tr.module.smart.web.dto.BizDeptUnlinkQuestionQueryDTO;
-import cn.tr.module.smart.web.dto.BizWebQuestionAnswerDTO;
 import cn.tr.module.smart.web.vo.BizDeptUnlinkQuestionVO;
-import cn.tr.module.smart.web.vo.BizWebQuestionAnswerVO;
 import cn.tr.module.smart.wx.controller.vo.BizWebQuestionGroupVO;
-import cn.tr.module.smart.wx.controller.vo.BizWxDeptQuestionVO;
-import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
-import com.alibaba.dashscope.app.Application;
-import com.alibaba.dashscope.app.ApplicationParam;
-import com.alibaba.dashscope.app.ApplicationResult;
+import com.alibaba.dashscope.aigc.generation.Generation;
+import com.alibaba.dashscope.aigc.generation.GenerationParam;
+import com.alibaba.dashscope.aigc.generation.GenerationResult;
+import com.alibaba.dashscope.common.Message;
+import com.alibaba.dashscope.common.Role;
 import com.alibaba.dashscope.exception.InputRequiredException;
 import com.alibaba.dashscope.exception.NoApiKeyException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
@@ -50,8 +42,6 @@ import org.springframework.core.io.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.FileCopyUtils;
-import org.springframework.web.multipart.MultipartFile;
-
 import javax.annotation.PostConstruct;
 import java.io.IOException;
 import java.io.InputStream;
@@ -298,36 +288,33 @@ public class BizQuestionGroupServiceImpl implements IBizQuestionGroupService {
     }
 
     @Override
-    public List<BizQuestionDTO> generateAi(BizQuestionGroupAiDTO source) {
+    public List<BizQuestionDTO> generateAi(BizQuestionGroupAiDTO source) throws NoApiKeyException, InputRequiredException {
+        Generation gen = new Generation();
+        Message systemMsg = Message.builder()
+                .role(Role.SYSTEM.getValue())
+                .content("你是一名专业的医疗问卷设计师,专注于手术患者管理。")
+                .build();
         //使用缓存模版
         String prompt = promptTemplate;
 
-        prompt=String.format(prompt,source.getName(),
-                QuestionGroupTypeEnums.AFTER.equals(source.getType())?"术前问卷":"术后问卷",
-                source.getFrequency(),
-                source.getInterval());
-
-        String imageUrl;
-        SysStorageRecordDTO uploadResult = null;
-        try {
-
-            ApplicationParam param = ApplicationParam.builder()
-                    .appId(aliyunProperties.getAppId())
-                    .apiKey(aliyunProperties.getApiKey())
-                    .prompt(prompt)
-                    .build();
+        prompt = promptTemplate.replace("${name}", source.getName())
+                .replace("${type}", QuestionGroupTypeEnums.AFTER.equals(source.getType()) ? "术前问卷" : "术后问卷")
+                .replace("${frequency}", String.valueOf(source.getFrequency()))
+                .replace("${interval}", String.valueOf(source.getInterval()));
+        ;
 
-            Application app = new Application();
-            ApplicationResult response = app.call(param);
-            String jsonResponse = response.getOutput().getText();
+        GenerationParam param = GenerationParam.builder()
+                .apiKey(aliyunProperties.getLlmApiKey())
+                .model(aliyunProperties.getLlmModel())
+                .enableThinking(Boolean.FALSE)
+                .messages(Arrays.asList(systemMsg, Message.builder()
+                        .role(Role.USER.getValue())
+                        .content(prompt)
+                        .build()))
+                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
+                .build();
+        GenerationResult result = gen.call(param);
+        return JSONUtil.toList(result.getOutput().getChoices().get(0).getMessage().getContent(), BizQuestionDTO.class);
 
-
-        } catch (NoApiKeyException e) {
-            throw new RuntimeException(e);
-        } catch (InputRequiredException e) {
-            throw new RuntimeException(e);
-        }
-        return null;
     }
-
 }

+ 3 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/web/controller/BizQuestionGroupController.java

@@ -6,6 +6,8 @@ import cn.tr.module.smart.web.dto.BizDeptUnlinkDocQueryDTO;
 import cn.tr.module.smart.web.dto.BizDeptUnlinkQuestionQueryDTO;
 import cn.tr.module.smart.web.vo.BizDeptUnlinkQuestionVO;
 import cn.tr.module.sys.oauth2.LoginTypeConstant;
+import com.alibaba.dashscope.exception.InputRequiredException;
+import com.alibaba.dashscope.exception.NoApiKeyException;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.tr.core.validation.Insert;
@@ -111,7 +113,7 @@ public class BizQuestionGroupController extends BaseController{
     @ApiOperation(value = "AI生成问卷组内容",notes = "权限: common:questionGroup:edit")
     @GetMapping("/generateAi")
     @SaCheckPermission("common:questionGroup:edit")
-    public CommonResult<List<BizQuestionDTO>> generateAi(@RequestBody@Validated BizQuestionGroupAiDTO source){
+    public CommonResult<List<BizQuestionDTO>> generateAi(@RequestBody@Validated BizQuestionGroupAiDTO source) throws NoApiKeyException, InputRequiredException {
         return CommonResult.success(bizQuestionGroupService.generateAi(source));
     }
 }

+ 7 - 13
tr-modules/tr-module-smartFollowUp/src/main/resources/llm/questionPrompt.txt

@@ -1,26 +1,20 @@
 【角色与背景】
-你是一名专业的医疗问卷设计师,专注于手术患者管理。你需要根据用户指定的问卷类型(术前或术后),为"{%s}"设计一套专业的评估问卷
+你是一名专业的医疗问卷设计师,专注于手术患者管理。你需要根据用户指定的问卷类型(术前或术后),为"${name}"设计一套专业的评估问卷
 
 【核心任务】
-根据用户指定的问卷类型({%s}}),生成一套包含10-20个问题的专业问卷。问题设计需完全符合指定类型的临床需求和信息收集目的。
-
+根据用户指定的问卷类型(${type}),生成一套包含10-20个问题的专业问卷。问题设计需完全符合指定类型的临床需求和信息收集目的。
 【输出格式要求】
 请输出一个完整的JSON对象,严格遵循以下结构:
 
 json
-{
-  "questionnaireType": "PREOPERATIVE或POSTOPERATIVE",
-  "questionnaireName": "问卷名称",
-  "pushFrequency": "推送次数",
-  "questions": [
+ [
     {
       "fieldName": "问题内容",
       "inputBoxType": "SINGLE_SELECT或TEXT",
       "options": ["选项1", "选项2", ...],
       "sort": 序号
     }
-  ]
-}
+ ]
 【问卷类型特定设计指南】
 
 当问卷类型为术前问卷时
@@ -50,8 +44,8 @@ json
 
 当问卷类型为 术后问卷时
 核心目的:恢复进程监测和并发症早期发现
-推送次数:{%d}
-推送间隔:{%d}小时
+推送次数:${frequency}
+推送间隔:${interval}小时
 重点内容领域:
 
 疼痛程度和性质的变化
@@ -100,4 +94,4 @@ json
 
 确保所有技术规范得到严格遵守
 
-只输出JSON格式内容,不要有任何额外解释
+只输出JSON格式内容,不要有任何额外解释

+ 1 - 0
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -6,6 +6,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 
+
 /**
  * @ClassName : WebApplication
  * @Description :

+ 3 - 1
tr-test/src/main/resources/application-dev.yml

@@ -51,4 +51,6 @@ wx:
 # 添加aliyun配置
 aliyun:
   appId: "b95862368a65422eab15d9838a03b79f"
-  apiKey: "sk-b08f4aaed4d641e5ba049c34a0eaf377"
+  apiKey: "sk-b08f4aaed4d641e5ba049c34a0eaf377"
+  llmApiKey: "sk-6038043b063c4f9eaadb497ec2fff50f"
+  llmModel: "qwen3-30b-a3b-instruct-2507"