浏览代码

AI对话相关

zhouyy 3 月之前
父节点
当前提交
0b1fdff927

+ 9 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AIQuestionController.java

@@ -3,8 +3,10 @@ package com.management.platform.controller;
 import com.management.platform.entity.bo.QuestionBO;
 import com.management.platform.service.AIQuestionService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -25,4 +27,11 @@ public class AIQuestionController {
         return msg;
     }
 
+    @PostMapping("/downloadContent")
+    public ResponseEntity<byte[]> downloadContent(@RequestParam(value = "questionId")Integer questionId
+            , HttpServletRequest request){
+        ResponseEntity<byte[]> responseEntity = aiQuestionService.downloadContent(questionId, request);
+        return responseEntity;
+    }
+
 }

+ 8 - 8
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AIQuestionDetail.java

@@ -56,18 +56,18 @@ public class AIQuestionDetail extends Model<AIQuestionDetail> {
     /**
      * 系统表查询的开始时间
      */
-    @TableField("start_time")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date startTime;
+    @TableField("start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startDate;
 
     /**
      * 系统表查询的结束时间
      */
-    @TableField("end_time")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date endTime;
+    @TableField("end_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endDate;
 
 
     /**

+ 6 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/QuestionBO.java

@@ -27,13 +27,13 @@ public class QuestionBO {
     /**提问内容*/
     private String content;
 
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
-    private Date startTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date startDate;
 
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
-    private Date endTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date endDate;
 
 
     private MultipartFile file;

+ 22 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/provider/CusTableColumnProvider.java

@@ -3,9 +3,21 @@ package com.management.platform.provider;
 import com.management.platform.entity.BusObjRelation;
 import org.apache.commons.collections.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class CusTableColumnProvider {
+
+    public static List<String> EXCLUDE_COLUMNS = new ArrayList<>();
+    static {
+        EXCLUDE_COLUMNS.add("is_active");
+        EXCLUDE_COLUMNS.add("is_ops");
+        EXCLUDE_COLUMNS.add("is_first_login");
+        EXCLUDE_COLUMNS.add("is_mob_first_login");
+        EXCLUDE_COLUMNS.add("only_audit_once");
+        EXCLUDE_COLUMNS.add("cost_apply_date");
+    }
+
     public String getStructByTableName(String tableName, List<BusObjRelation> busObjRelations){
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder
@@ -17,13 +29,22 @@ public class CusTableColumnProvider {
                 .append(" AND COLUMN_NAME not like '%plate%'")
         ;
 
+        if(CollectionUtils.isNotEmpty(EXCLUDE_COLUMNS)){
+            stringBuilder.append(" AND COLUMN_NAME not in (");
+            for (String excludeColumn : EXCLUDE_COLUMNS) {
+                stringBuilder.append("'").append(excludeColumn).append("',");
+            }
+            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+            stringBuilder.append(") ");
+        }
+
         if(CollectionUtils.isNotEmpty(busObjRelations)){
             stringBuilder.append(" AND COLUMN_NAME not in (");
             for (BusObjRelation busObjRelation : busObjRelations) {
                 stringBuilder.append("'").append(busObjRelation.getFromCol()).append("',");
             }
             stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
-            stringBuilder.append(")");
+            stringBuilder.append(") ");
         }
         return stringBuilder.toString();
     }

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AIQuestionService.java

@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.AIQuestion;
 import com.management.platform.entity.bo.QuestionBO;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.http.ResponseEntity;
 
 import javax.servlet.http.HttpServletRequest;
 
 public interface AIQuestionService extends IService<AIQuestion> {
     HttpRespMsg ask(QuestionBO questionBO, HttpServletRequest request);
+
+    ResponseEntity<byte[]> downloadContent(Integer questionId, HttpServletRequest request);
 }

+ 117 - 26
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java

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

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanTask.java

@@ -37,7 +37,7 @@ public class VisitPlanTask {
     @Resource
     private UserMapper userMapper ;
 
-    @Scheduled(cron = "0 0/1 * * * *")
+//    @Scheduled(cron = "0 0/1 * * * *")
     //TODO 需还原
     public void checkRemindMessage() {
         Date now = new Date();

+ 4 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -182,3 +182,7 @@ supersonic:
   port: 9080
   username: admin
   password: e6+jQ26AESREiBBuKM1u1A==
+
+aiask:
+  fileaskurl: http://192.168.2.5:5000/analyze
+  askurl: http://192.168.2.5:5000/analyzeOnlyQuestion