Commit b3191c83 authored by gaozhaochen's avatar gaozhaochen

update: 更新qa接口

parent 3f92b2eb
...@@ -27,6 +27,7 @@ public class EncodeResponseAdvice implements ResponseBodyAdvice { ...@@ -27,6 +27,7 @@ public class EncodeResponseAdvice implements ResponseBodyAdvice {
@Override @Override
public boolean supports(MethodParameter methodParameter, Class aClass) { public boolean supports(MethodParameter methodParameter, Class aClass) {
// 方法上有SecurityParameter注解的进行加密 根据需求可以在判断SecurityParameter注解中的outEncode是否为true // 方法上有SecurityParameter注解的进行加密 根据需求可以在判断SecurityParameter注解中的outEncode是否为true
// 这里返回true对所有接口返回结果加密,可能影响swagger显示
return true; return true;
} }
......
package cn.sh.stc.sict.theme.hpgp.controller.mobile; package cn.sh.stc.sict.theme.hpgp.controller.mobile;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
import cn.sh.stc.sict.cloud.common.core.util.R; import cn.sh.stc.sict.cloud.common.core.util.R;
...@@ -12,6 +15,7 @@ import cn.sh.stc.sict.theme.hpgp.vo.IntelligentAnswerVO; ...@@ -12,6 +15,7 @@ import cn.sh.stc.sict.theme.hpgp.vo.IntelligentAnswerVO;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.api.client.util.Lists; import com.google.api.client.util.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -24,10 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -24,10 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
...@@ -47,12 +48,8 @@ public class HpGpIntelligentQAController { ...@@ -47,12 +48,8 @@ public class HpGpIntelligentQAController {
@Value("${hpgp-guide.qa-history-limit:3}") @Value("${hpgp-guide.qa-history-limit:3}")
private Integer qaHistoryLimit; private Integer qaHistoryLimit;
private WebClient webClient;
private final static String QA_RESULT_FLAG = "Helper: "; private final static String QA_RESULT_FLAG = "Helper: ";
private static final String ERROR_MSG = "使用的人太多啦!等下再用吧!";
private static final Random RANDOM = new Random();
private static final Executor EXECUTOR = Executors.newFixedThreadPool(10);
// 报告查询、医疗知识问答、医疗分诊、预约挂号 // 报告查询、医疗知识问答、医疗分诊、预约挂号
private static final Set<String> QA_TYPE= Sets.newHashSet("报告查询","预约挂号"); private static final Set<String> QA_TYPE= Sets.newHashSet("报告查询","预约挂号");
...@@ -62,139 +59,139 @@ public class HpGpIntelligentQAController { ...@@ -62,139 +59,139 @@ public class HpGpIntelligentQAController {
private final static Set<String> DPQ_DEPARTMENT = Sets.newHashSet("皮肤性病科", "中医科", "儿保科", "全科医疗科"); private final static Set<String> DPQ_DEPARTMENT = Sets.newHashSet("皮肤性病科", "中医科", "儿保科", "全科医疗科");
private final static Set<String> XDM_DEPARTMENT = Sets.newHashSet("全科", "全科名医", "中医", "针伤科", "齿科"); private final static Set<String> XDM_DEPARTMENT = Sets.newHashSet("全科", "全科名医", "中医", "针伤科", "齿科");
// @SysLog
// @ApiOperation("智能问答")
// @PostMapping
// public R<?> qa(String question) {
// CurrentUser current = SecurityUtils.getCurrentUser();
// String from = StrUtil.isNotBlank(current.getOpenId()) ? current.getOpenId() : current.getId().toString();
//
// String xml = "<xml>\n" +
// " <ToUserName><![CDATA[huangpurobot]]></ToUserName>\n" +
// " <FromUserName><![CDATA[" + from + "]]></FromUserName>\n" +
// " <CreateTime>" + DateUtil.now() + "</CreateTime>\n" +
// " <MsgType><![CDATA[text]]></MsgType>\n" +
// " <Content><![CDATA[" + question + "]]></Content>\n" +
// " <MsgId>" + IdWorker.getId() + "</MsgId>\n" +
// "</xml>";
// // 162 为黄浦高血压专病导医机器人
// // 51 黄浦高血压全科导诊机器人
// String body = HttpRequest.post("http://30.30.5.74:9988/qa/jqrsvr.ashx?Command=talk_51")
// .body(xml)
// .execute()
// .body();
// log.error("孙总接口请求 xml = {}", xml);
// log.error("孙总接口返回 body = {}", body);
// IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
// Map<String, Object> result = XmlUtil.xmlToMap(body);
// if (result.containsKey(CONTENT)) {
// answerVO.setAnswer(MapUtil.getStr(result, CONTENT));
//
// // 打浦桥单独处理
// if (StrUtil.isNotBlank(current.getHospitalCode())
// && "42502942300".equals(current.getHospitalCode())) {
// if (StrUtil.isNotBlank(answerVO.getDeptName())
// && !DPQ_DEPARTMENT.contains(answerVO.getDeptName())) {
// String oldDeptName = answerVO.getDeptName();
// answerVO.setAnswer(answerVO.getAnswer().replace(oldDeptName, "全科医疗科"));
// answerVO.setDeptName("全科医疗科");
// }
// }
//
// // 小东门单独处理
// if (StrUtil.isNotBlank(current.getHospitalCode())
// && "42507025800".equals(current.getHospitalCode())) {
// if (StrUtil.isNotBlank(answerVO.getDeptName())
// && !XDM_DEPARTMENT.contains(answerVO.getDeptName())) {
// String oldDeptName = answerVO.getDeptName();
// answerVO.setAnswer(answerVO.getAnswer().replace(oldDeptName, "全科"));
// answerVO.setDeptName("全科");
// }
// }
//
// }
// return new R<>(answerVO);
// }
@SysLog @SysLog
@ApiOperation("智能问答") @ApiOperation("智能问答")
@PostMapping @PostMapping
public R qaV2(String question) { public R<?> qa(String question) {
if (StrUtil.isNotBlank(question) && question.contains("上周的血检报告出了")) {
IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
answerVO.setAnswer("<a href=\"https://www.sh-sict.com/healthExam\">https://www.sh-sict.com/healthExam</a>");
return new R(answerVO);
}
CurrentUser current = SecurityUtils.getCurrentUser(); CurrentUser current = SecurityUtils.getCurrentUser();
List<String> qaHistory = JSON.parseArray(current.getQaHistory(), String.class); String from = StrUtil.isNotBlank(current.getOpenId()) ? current.getOpenId() : current.getId().toString();
String from = current.getId().toString();
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", from);
if (CollUtil.isEmpty(qaHistory)) {
qaHistory = Lists.newArrayListWithCapacity(1);
}
if (qaHistory.size() > qaHistoryLimit) {
qaHistory = qaHistory.subList(0, qaHistoryLimit - 1);
}
List<String> currentQa = Lists.newArrayList();
currentQa.add(question);
currentQa.add(null);
qaHistory.add(JSON.toJSONString(currentQa));
List<List<String>> reqList = new ArrayList<>();
for (Object item : qaHistory) {
if (item instanceof String) {
List<String> itemList = JSONArray.parseArray((String) item, String.class);
reqList.add(itemList);
}
}
jsonObject.put("history", reqList);
String req = JSON.toJSONString(jsonObject);
String xml = "<xml>\n" +
" <ToUserName><![CDATA[huangpurobot]]></ToUserName>\n" +
" <FromUserName><![CDATA[" + from + "]]></FromUserName>\n" +
" <CreateTime>" + DateUtil.now() + "</CreateTime>\n" +
" <MsgType><![CDATA[text]]></MsgType>\n" +
" <Content><![CDATA[" + question + "]]></Content>\n" +
" <MsgId>" + IdWorker.getId() + "</MsgId>\n" +
"</xml>";
// 162 为黄浦高血压专病导医机器人 // 162 为黄浦高血压专病导医机器人
// 51 黄浦高血压全科导诊机器人 // 51 黄浦高血压全科导诊机器人
HttpResponse response = HttpRequest.post(qaUrl) String body = HttpRequest.post("http://30.30.5.74:9988/qa/jqrsvr.ashx?Command=talk_51")
.body(req, "application/json") .body(xml)
.execute(); .execute()
String body = response.body(); .body();
log.error("接口请求 req = {}", req); log.error("孙总接口请求 xml = {}", xml);
log.error("接口返回 body = {}", body); log.error("孙总接口返回 body = {}", body);
if (response.getStatus() != 200 || StrUtil.isBlank(body)) { IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
return new R(); Map<String, Object> result = XmlUtil.xmlToMap(body);
} if (result.containsKey(CONTENT)) {
answerVO.setAnswer(MapUtil.getStr(result, CONTENT));
JSONObject bodyJson = JSON.parseObject(body); // 打浦桥单独处理
String chat = bodyJson.getString("Chat"); if (StrUtil.isNotBlank(current.getHospitalCode())
JSONArray departmentArray = bodyJson.getJSONArray("Department"); && "42502942300".equals(current.getHospitalCode())) {
String medicalType = bodyJson.getString("Medical_type"); if (StrUtil.isNotBlank(answerVO.getDeptName())
if(StrUtil.isNotBlank(medicalType) && QA_TYPE.contains(medicalType)){ && !DPQ_DEPARTMENT.contains(answerVO.getDeptName())) {
IntelligentAnswerVO answerVO = new IntelligentAnswerVO(); String oldDeptName = answerVO.getDeptName();
answerVO.setAnswer("<a href=\"https://www.sh-sict.com/healthExam\">https://www.sh-sict.com/healthExam</a>"); answerVO.setAnswer(answerVO.getAnswer().replace(oldDeptName, "全科医疗科"));
return new R(answerVO); answerVO.setDeptName("全科医疗科");
} }
if (StrUtil.isBlank(chat)) { }
return new R();
}
chat = chat.replaceAll(QA_RESULT_FLAG, ""); // 小东门单独处理
if (chat.startsWith("\"") && chat.endsWith("\"")) { if (StrUtil.isNotBlank(current.getHospitalCode())
chat = chat.substring(1, chat.length() - 1); && "42507025800".equals(current.getHospitalCode())) {
} if (StrUtil.isNotBlank(answerVO.getDeptName())
currentQa.set(1, chat); && !XDM_DEPARTMENT.contains(answerVO.getDeptName())) {
current.setQaHistory(JSON.toJSONString(qaHistory)); String oldDeptName = answerVO.getDeptName();
SecurityUtils.updateCurrent(current); answerVO.setAnswer(answerVO.getAnswer().replace(oldDeptName, "全科"));
answerVO.setDeptName("全科");
}
}
IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
answerVO.setAnswer(chat);
if (CollUtil.isNotEmpty(departmentArray)) {
answerVO.setDeptName(departmentArray.getString(0));
} }
return new R(answerVO); return new R<>(answerVO);
} }
// @SysLog
// @ApiOperation("智能问答")
// @PostMapping
// public R qaV2(String question) {
// if (StrUtil.isNotBlank(question) && question.contains("上周的血检报告出了")) {
// IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
// answerVO.setAnswer("<a href=\"https://www.sh-sict.com/healthExam\">https://www.sh-sict.com/healthExam</a>");
// return new R(answerVO);
// }
// CurrentUser current = SecurityUtils.getCurrentUser();
// List<String> qaHistory = JSON.parseArray(current.getQaHistory(), String.class);
// String from = current.getId().toString();
//
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("username", from);
// if (CollUtil.isEmpty(qaHistory)) {
// qaHistory = Lists.newArrayListWithCapacity(1);
// }
//
// if (qaHistory.size() > qaHistoryLimit) {
// qaHistory = qaHistory.subList(0, qaHistoryLimit - 1);
// }
//
// List<String> currentQa = Lists.newArrayList();
// currentQa.add(question);
// currentQa.add(null);
// qaHistory.add(JSON.toJSONString(currentQa));
//
// List<List<String>> reqList = new ArrayList<>();
// for (Object item : qaHistory) {
// if (item instanceof String) {
// List<String> itemList = JSONArray.parseArray((String) item, String.class);
// reqList.add(itemList);
// }
// }
// jsonObject.put("history", reqList);
// String req = JSON.toJSONString(jsonObject);
//
// // 162 为黄浦高血压专病导医机器人
// // 51 黄浦高血压全科导诊机器人
// HttpResponse response = HttpRequest.post(qaUrl)
// .body(req, "application/json")
// .execute();
// String body = response.body();
// log.error("接口请求 req = {}", req);
// log.error("接口返回 body = {}", body);
// if (response.getStatus() != 200 || StrUtil.isBlank(body)) {
// return new R();
// }
//
// JSONObject bodyJson = JSON.parseObject(body);
// String chat = bodyJson.getString("Chat");
// JSONArray departmentArray = bodyJson.getJSONArray("Department");
// String medicalType = bodyJson.getString("Medical_type");
// if(StrUtil.isNotBlank(medicalType) && QA_TYPE.contains(medicalType)){
// IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
// answerVO.setAnswer("<a href=\"https://www.sh-sict.com/healthExam\">https://www.sh-sict.com/healthExam</a>");
// return new R(answerVO);
// }
// if (StrUtil.isBlank(chat)) {
// return new R();
// }
//
// chat = chat.replaceAll(QA_RESULT_FLAG, "");
// if (chat.startsWith("\"") && chat.endsWith("\"")) {
// chat = chat.substring(1, chat.length() - 1);
// }
// currentQa.set(1, chat);
// current.setQaHistory(JSON.toJSONString(qaHistory));
// SecurityUtils.updateCurrent(current);
//
// IntelligentAnswerVO answerVO = new IntelligentAnswerVO();
// answerVO.setAnswer(chat);
// if (CollUtil.isNotEmpty(departmentArray)) {
// answerVO.setDeptName(departmentArray.getString(0));
// }
// return new R(answerVO);
// }
/** /**
* post方式,可以解决特殊符号,过长的文本等问题 * post方式,可以解决特殊符号,过长的文本等问题
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment