|
@@ -12,6 +12,10 @@ import com.management.platform.service.ExcelExportService;
|
|
|
import com.management.platform.util.ExcelConverter;
|
|
|
import com.management.platform.util.HttpRespMsg;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.poi.xwpf.usermodel.BreakType;
|
|
|
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
|
|
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
|
|
+import org.apache.poi.xwpf.usermodel.XWPFRun;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.core.io.ByteArrayResource;
|
|
|
import org.springframework.http.*;
|
|
@@ -27,11 +31,13 @@ import org.springframework.web.multipart.MultipartFile;
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.sql.DataSource;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
import java.io.IOException;
|
|
|
import java.nio.file.Files;
|
|
|
import java.nio.file.Path;
|
|
|
import java.nio.file.Paths;
|
|
|
import java.sql.*;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
@@ -42,6 +48,12 @@ import java.util.stream.Collectors;
|
|
|
@Service
|
|
|
public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuestion> implements AIQuestionService {
|
|
|
|
|
|
+ @Value("${aiask.fileaskurl}")
|
|
|
+ private String aiFileAskUrl;
|
|
|
+
|
|
|
+ @Value("${aiask.askurl}")
|
|
|
+ private String aiAskUrl;
|
|
|
+
|
|
|
@Resource
|
|
|
private AIQuestionMapper aiQuestionMapper;
|
|
|
|
|
@@ -138,7 +150,7 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
columnList,
|
|
|
fileName);
|
|
|
//下载到本地 TODO 生产环境注释
|
|
|
- excelFile.transferTo(new java.io.File(path + fileName));
|
|
|
+// excelFile.transferTo(new java.io.File(fileName));
|
|
|
byteArrayResource = new ByteArrayResource(excelFile.getBytes()) {
|
|
|
@Override
|
|
|
public String getFilename() {
|
|
@@ -153,7 +165,7 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
|
|
|
@Async
|
|
|
public ResponseEntity<String> getResponseEntityWithFileAI(List<Map<String,Object>> columnList,String question){
|
|
|
- String uploadUrl = "http://192.168.2.40:5000/analyzeByFile";
|
|
|
+// String uploadUrl = aiFileAskUrl;
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
//转换为MultipartFile 准备表单数据
|
|
|
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
|
|
@@ -167,14 +179,13 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
HttpEntity<MultiValueMap<String, Object>> requestEntity =
|
|
|
new HttpEntity<>(body, headers);
|
|
|
ResponseEntity<String> response = restTemplate.exchange(
|
|
|
- uploadUrl,
|
|
|
+ aiFileAskUrl,
|
|
|
HttpMethod.POST,
|
|
|
requestEntity,
|
|
|
String.class);
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public HttpRespMsg ask(QuestionBO questionBO, HttpServletRequest request) {
|
|
@@ -210,11 +221,12 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
.append(tableName)
|
|
|
.append(" where company_id =")
|
|
|
.append(user.getCompanyId());
|
|
|
- if(null != questionBO.getStartTime() && null != questionBO.getEndTime()){
|
|
|
- stringBuilder.append(" and create_time between ")
|
|
|
- .append(questionBO.getStartTime())
|
|
|
+ if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ stringBuilder.append(" and date_format(create_time,'%Y-%m-%d') between ")
|
|
|
+ .append("'").append(sdf.format(questionBO.getStartDate())).append("'")
|
|
|
.append(" and ")
|
|
|
- .append(questionBO.getEndTime());
|
|
|
+ .append("'").append(sdf.format(questionBO.getEndDate())).append("'");
|
|
|
}
|
|
|
|
|
|
List<Map<String,Object>> columnList = new ArrayList<>();
|
|
@@ -237,6 +249,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
}else{
|
|
|
queryRes = "AI分析有误,稍后再试";
|
|
|
}
|
|
|
+ }else{
|
|
|
+ queryRes = "无数据";
|
|
|
}
|
|
|
|
|
|
} else if (2 == questionBO.getQuestionDataSource()) {
|
|
@@ -245,7 +259,7 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
* 查询formId对应的sql,获取返回结果 封装为表格
|
|
|
*/
|
|
|
HttpRespMsg respMsg = cusTableColumnService.getFormResByFormId(Integer.parseInt(questionBO.getSourceContent()), request);
|
|
|
- if(respMsg.getCode().equals("200")){
|
|
|
+ if(respMsg.getCode().equals("ok")){
|
|
|
List<Map<String,Object>> resColumnList = (List<Map<String, Object>>) respMsg.getData();
|
|
|
if(CollectionUtils.isNotEmpty(resColumnList)){
|
|
|
ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(resColumnList, questionBO.getContent());
|
|
@@ -256,22 +270,19 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
}else{
|
|
|
queryRes = "AI分析有误,稍后再试";
|
|
|
}
|
|
|
+ }else{
|
|
|
+ queryRes = "无数据";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
} else if (3 == questionBO.getQuestionDataSource()) {
|
|
|
/**
|
|
|
* 获取url 读取文件内容并返回
|
|
|
*/
|
|
|
- String uploadUrl = "http://192.168.2.40:5000/analyzeByFile";
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
//转换为MultipartFile 准备表单数据
|
|
|
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
|
|
|
body.add("question", questionBO.getContent());
|
|
|
- String fileName = "提问数据"+System.currentTimeMillis()+".xlsx";
|
|
|
ByteArrayResource byteArrayResource = null;
|
|
|
try {
|
|
|
MultipartFile multipartFileFromPath = getMultipartFileFromPath(questionBO.getUrl());
|
|
@@ -291,7 +302,7 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
HttpEntity<MultiValueMap<String, Object>> requestEntity =
|
|
|
new HttpEntity<>(body, headers);
|
|
|
ResponseEntity<String> response = restTemplate.exchange(
|
|
|
- uploadUrl,
|
|
|
+ aiFileAskUrl,
|
|
|
HttpMethod.POST,
|
|
|
requestEntity,
|
|
|
String.class);
|
|
@@ -304,7 +315,28 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
- // 自由对话 TODO 目前没接口
|
|
|
+ // 自由对话
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ //转换为MultipartFile 准备表单数据
|
|
|
+ MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
|
|
|
+ body.add("question", questionBO.getContent());
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
|
|
+
|
|
|
+ HttpEntity<MultiValueMap<String, Object>> requestEntity =
|
|
|
+ new HttpEntity<>(body, headers);
|
|
|
+ ResponseEntity<String> response = restTemplate.exchange(
|
|
|
+ aiFileAskUrl,
|
|
|
+ HttpMethod.POST,
|
|
|
+ requestEntity,
|
|
|
+ String.class);
|
|
|
+ if(response.getStatusCode().is2xxSuccessful()){
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(response.getBody());
|
|
|
+ System.out.println("jsonObject=== "+jsonObject);
|
|
|
+ queryRes = jsonObject.getString("data");
|
|
|
+ }else{
|
|
|
+ queryRes = "AI分析有误,稍后再试";
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if(null == questionBO.getQuestionId()){
|
|
@@ -324,8 +356,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
cusAsk.setContent(questionBO.getContent());
|
|
|
cusAsk.setQuestionDataSource(questionBO.getQuestionDataSource());
|
|
|
cusAsk.setSourceContent(questionBO.getSourceContent());
|
|
|
- cusAsk.setStartTime(questionBO.getStartTime());
|
|
|
- cusAsk.setEndTime(questionBO.getEndTime());
|
|
|
+ cusAsk.setStartDate(questionBO.getStartDate());
|
|
|
+ cusAsk.setEndDate(questionBO.getEndDate());
|
|
|
aiQuestionDetailMapper.insert(cusAsk);
|
|
|
|
|
|
AIQuestionDetail aiAnswer = new AIQuestionDetail();
|
|
@@ -337,8 +369,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
aiAnswer.setContent(queryRes);
|
|
|
aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
|
|
|
aiAnswer.setSourceContent(questionBO.getSourceContent());
|
|
|
- aiAnswer.setStartTime(questionBO.getStartTime());
|
|
|
- aiAnswer.setEndTime(questionBO.getEndTime());
|
|
|
+ aiAnswer.setStartDate(questionBO.getStartDate());
|
|
|
+ aiAnswer.setEndDate(questionBO.getEndDate());
|
|
|
aiQuestionDetailMapper.insert(aiAnswer);
|
|
|
} else {
|
|
|
Integer questionId = questionBO.getQuestionId();
|
|
@@ -348,7 +380,10 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
.orderByDesc(AIQuestionDetail::getSeq)
|
|
|
.last(" limit 1 ")
|
|
|
);
|
|
|
- Integer startSeq = lastOne.getSeq();
|
|
|
+ Integer startSeq = 0;
|
|
|
+ if(null != lastOne){
|
|
|
+ startSeq = lastOne.getSeq();
|
|
|
+ }
|
|
|
AIQuestionDetail cusAsk = new AIQuestionDetail();
|
|
|
cusAsk.setCreatorId(user.getId());
|
|
|
cusAsk.setCompanyId(user.getCompanyId());
|
|
@@ -358,8 +393,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
cusAsk.setContent(questionBO.getContent());
|
|
|
cusAsk.setQuestionDataSource(questionBO.getQuestionDataSource());
|
|
|
cusAsk.setSourceContent(questionBO.getSourceContent());
|
|
|
- cusAsk.setStartTime(questionBO.getStartTime());
|
|
|
- cusAsk.setEndTime(questionBO.getEndTime());
|
|
|
+ cusAsk.setStartDate(questionBO.getStartDate());
|
|
|
+ cusAsk.setEndDate(questionBO.getEndDate());
|
|
|
aiQuestionDetailMapper.insert(cusAsk);
|
|
|
|
|
|
AIQuestionDetail aiAnswer = new AIQuestionDetail();
|
|
@@ -371,16 +406,72 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
|
|
|
aiAnswer.setContent(queryRes);
|
|
|
aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
|
|
|
aiAnswer.setSourceContent(questionBO.getSourceContent());
|
|
|
- aiAnswer.setStartTime(questionBO.getStartTime());
|
|
|
- aiAnswer.setEndTime(questionBO.getEndTime());
|
|
|
+ aiAnswer.setStartDate(questionBO.getStartDate());
|
|
|
+ aiAnswer.setEndDate(questionBO.getEndDate());
|
|
|
aiQuestionDetailMapper.insert(aiAnswer);
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ httpRespMsg.setData(queryRes);
|
|
|
return httpRespMsg;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public ResponseEntity<byte[]> downloadContent(Integer questionId, HttpServletRequest request) {
|
|
|
+// AIQuestionDetail aiQuestionDetail = aiQuestionDetailMapper.selectById(detailId);
|
|
|
+// String content = aiQuestionDetail.getContent();
|
|
|
+
|
|
|
+ List<AIQuestionDetail> aiQuestionDetails = aiQuestionDetailMapper.selectList(new LambdaQueryWrapper<AIQuestionDetail>()
|
|
|
+ .eq(AIQuestionDetail::getQuestionId, questionId)
|
|
|
+ .orderByAsc(AIQuestionDetail::getSeq)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 创建Word文档
|
|
|
+ XWPFDocument document = new XWPFDocument();
|
|
|
+
|
|
|
+ // 添加内容
|
|
|
+ if(CollectionUtils.isNotEmpty(aiQuestionDetails)){
|
|
|
+ int index = 0;
|
|
|
+ for (AIQuestionDetail aiQuestionDetail : aiQuestionDetails) {
|
|
|
+ XWPFParagraph paragraph = document.createParagraph();
|
|
|
+ XWPFRun run = paragraph.createRun();
|
|
|
+ run.setText(aiQuestionDetail.getContent());
|
|
|
+ run.setFontSize(12);
|
|
|
+ run.setFontFamily("Arial");
|
|
|
+
|
|
|
+ if (index< aiQuestionDetails.size() - 1) {
|
|
|
+ run.addBreak(BreakType.TEXT_WRAPPING);
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 将文档写入字节数组
|
|
|
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
|
+ try {
|
|
|
+ document.write(out);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }finally {
|
|
|
+ try {
|
|
|
+ document.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 设置响应头
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
|
|
+ headers.setContentDispositionFormData("attachment", "data.docx");
|
|
|
+
|
|
|
+ return ResponseEntity.ok()
|
|
|
+ .headers(headers)
|
|
|
+ .body(out.toByteArray());
|
|
|
+ }
|
|
|
+
|
|
|
public static List<Map<String, Object>> convertListWithAlias(ResultSet rs) {
|
|
|
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
|
|
|
try {
|