TakaiAiServiceImpl.java 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  1. package com.takai.ai.service.impl;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.alibaba.fastjson2.JSONArray;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import com.takai.ai.domain.TakaiSysOss;
  6. import com.takai.ai.domain.dto.*;
  7. import com.takai.ai.domain.entity.*;
  8. import com.takai.ai.mapper.*;
  9. import com.takai.ai.service.ITakaiAiService;
  10. import com.takai.ai.utils.MinioUtil;
  11. import com.takai.ai.utils.SnowflakeDigitGenerator;
  12. import com.takai.common.annotation.DataSource;
  13. import com.takai.common.config.DeepseekConfig;
  14. import com.takai.common.core.domain.entity.SysDictData;
  15. import com.takai.common.core.redis.RedisCache;
  16. import com.takai.common.enums.DataSourceType;
  17. import com.takai.common.utils.StringUtils;
  18. import com.takai.common.utils.uuid.IdUtils;
  19. import lombok.extern.slf4j.Slf4j;
  20. import okhttp3.*;
  21. import okhttp3.sse.EventSource;
  22. import okhttp3.sse.EventSourceListener;
  23. import okhttp3.sse.EventSources;
  24. import org.slf4j.Logger;
  25. import org.slf4j.LoggerFactory;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.data.redis.core.RedisTemplate;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.web.multipart.MultipartFile;
  31. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  32. import javax.validation.constraints.NotNull;
  33. import java.io.IOException;
  34. import java.time.LocalDate;
  35. import java.time.LocalDateTime;
  36. import java.time.temporal.ChronoUnit;
  37. import java.util.*;
  38. import java.util.concurrent.TimeUnit;
  39. import java.util.stream.Collectors;
  40. /**
  41. * 高井 业务层处理
  42. *
  43. * @author takai
  44. */
  45. @Slf4j
  46. @Service
  47. @DataSource(DataSourceType.MASTER)
  48. public class TakaiAiServiceImpl implements ITakaiAiService {
  49. private static final Logger logger = LoggerFactory.getLogger(TakaiAiServiceImpl.class);
  50. @Autowired
  51. private TakaiDialogMapper takaiDialogMapper;
  52. @Autowired
  53. private TakaiApplicationMapper takaiApplicationMapper;
  54. @Autowired
  55. private TakaiQuestionMapper takaiQuestionMapper;
  56. @Autowired
  57. private TakaiKnowledgeMapper takaiKnowledgeMapper;
  58. @Autowired
  59. private TakaiDocumentMapper takaiDocumentMapper;
  60. @Autowired
  61. private TakaiSysOssConfigMapper takaiSysOssConfigMapper;
  62. @Autowired
  63. private TakaiSysOssMapper takaiSysOssMapper;
  64. @Autowired
  65. private MinioUtil minioUtil;
  66. @Autowired
  67. private TakaiDocumentSettingsMapper takaiDocumentSettingsMapper;
  68. @Autowired
  69. private DeepseekConfig deepseekConfig;
  70. @Autowired
  71. private TakaiAppInfoMapper takaiAppInfoMapper;
  72. @Autowired
  73. private TakaiMediaReplacementMapper takaiMediaReplacementMapper;
  74. @Autowired
  75. private RedisCache redisCache;
  76. @Autowired
  77. public RedisTemplate redisTemplate;
  78. @Autowired
  79. private TakaiSliceInfoMapper takaiSliceInfoMapper;
  80. public static final String START_SIGN = "【";
  81. public static final String END_SIGN = "】";
  82. public static final String SYMBOL = "【示意图序号";
  83. public static final String USER_STR = "user";
  84. public static final String TODAY = "今天";
  85. public static final String BEFOR = "天前";
  86. @Override
  87. public void initDeepseekInfo() {
  88. //获取应用列表
  89. // List<TakaiApplication> appList = takaiApplicationMapper.selectApplicationList(null);
  90. setRedisCache(null);
  91. }
  92. private void setRedisCache(String knowledgeId) {
  93. //获取知识库列表
  94. List<TakaiKnowledge> knowledgeList = null;
  95. if (StringUtils.isEmpty(knowledgeId)) {
  96. knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(null);
  97. } else {
  98. knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  99. }
  100. //获取知识列表
  101. if (!knowledgeList.isEmpty()) {
  102. for (TakaiKnowledge bmKnowledge : knowledgeList) {
  103. TakaiDocument conditon = TakaiDocument.builder().knowledgeId(bmKnowledge.getKnowledgeId()).build();
  104. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(conditon);
  105. if (!documentList.isEmpty()) {
  106. for (TakaiDocument bmDocument : documentList) {
  107. //获取知识图片列表
  108. TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(bmDocument.getDocumentId()).build();
  109. List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
  110. if (!imageList.isEmpty()) {
  111. for (TakaiMediaReplacement image : imageList) {
  112. redisCache.setCacheObject(image.getOriginText(), image.getMediaUrl());
  113. }
  114. }
  115. }
  116. }
  117. }
  118. }
  119. }
  120. @Override
  121. public SseEmitter sseInvoke(TakaiSseInfoParams sseParams) {
  122. TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
  123. if (appInfo != null) {
  124. TakaiKnowledge knowledge = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(appInfo.getKnowledgeIds()).build());
  125. if (knowledge != null) {
  126. SseEmitter sseEmitter = new SseEmitter(0L);
  127. String url = deepseekConfig.getBaseurl() + deepseekConfig.getChat();
  128. TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
  129. JSONObject json = JSONObject.parseObject(info.getAppInfo());
  130. String query = sseParams.getPrompt().get(sseParams.getPrompt().size() - 1).getContent();
  131. log.info("deepseek聊天请求参数:" + query);
  132. json.put("query", query);
  133. json.put("embeddingId", knowledge.getEmbeddingId());
  134. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  135. Request request = buildPostRequest(url, requestBody);
  136. // 使用EventSourceListener处理来自服务器的SSE事件
  137. EventSourceListener listener = new EventSourceListener() {
  138. private String preData = "";
  139. //图片识别
  140. private String symbolData = "";
  141. @Override
  142. public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
  143. log.info("deepseek Connection opened. Headers: {}", response.headers());
  144. log.info("deepseek Request URL: {}", response.request().url());
  145. }
  146. @Override
  147. public void onClosed(@NotNull EventSource eventSource) {
  148. log.info("deepseek Connection closed.");
  149. sseEmitter.complete();
  150. }
  151. @Override
  152. public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
  153. if (!StringUtils.isEmpty(data)) {
  154. String newData = data.substring(preData.length());
  155. logger.info("deepseek聊天返回消息:" + data);
  156. preData = data;
  157. if (newData.indexOf(START_SIGN) > -1 || symbolData.length() > 0) {
  158. symbolData = symbolData + newData;
  159. //接收到了完整的图片标识
  160. int endSignPos = symbolData.indexOf(END_SIGN);
  161. if (endSignPos > -1) {
  162. JSONObject json = new JSONObject();
  163. json.put("id", id);
  164. json.put("event", "add");
  165. //是图片
  166. if (symbolData.indexOf(SYMBOL) > -1) {
  167. //获取完整Key
  168. int startPos = symbolData.indexOf(START_SIGN);
  169. int endPos = symbolData.indexOf(END_SIGN) + 1;
  170. String key = symbolData.substring(startPos, endPos);
  171. String url = redisCache.getCacheObject(key);
  172. if (org.springframework.util.StringUtils.hasText(url)) {
  173. if(url.contains("https://10.1.28.14:9000")){
  174. url = url.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
  175. }
  176. //匹配markdown图片格式
  177. // symbolData = symbolData.replace(key, "![](" + url + ")");
  178. } else {
  179. logger.error("图片标识符"+key+"没有获取到对应的URL{}: " + symbolData);
  180. }
  181. //检查是否当前token包含其他图片的开始符号”【“
  182. int lastPos = symbolData.lastIndexOf(START_SIGN);
  183. if(lastPos > endSignPos){
  184. // 从'【' 开始截取
  185. newData = symbolData.substring(0, lastPos);
  186. symbolData = symbolData.substring(lastPos);
  187. logger.info("截取结果{}: " + symbolData);
  188. } else {
  189. newData = symbolData;
  190. symbolData = "";
  191. }
  192. newData = newData.replace(key, " ![](" + url + ")");
  193. } else {
  194. newData = symbolData;
  195. symbolData = "";
  196. }
  197. json.put("data", newData);
  198. log.info("获取到图片替换结束符号,返回前端信息:" + json);
  199. send(sseEmitter, json);
  200. //如果超过长度200还没收到】符号,直接返回。
  201. } else if (symbolData.length() > 200) {
  202. JSONObject json = new JSONObject();
  203. json.put("id", id);
  204. json.put("event", "add");
  205. json.put("data", symbolData);
  206. }
  207. } else {
  208. JSONObject json = new JSONObject();
  209. json.put("id", id);
  210. json.put("event", type);
  211. json.put("data", newData);
  212. log.info("deepseek返回信息:" + json);
  213. send(sseEmitter, json);
  214. }
  215. }
  216. if (com.takai.common.utils.StringUtils.isNotEmpty(type) && "finish".equals(type)) {
  217. log.info("deepseek聊天结束");
  218. JSONObject json = new JSONObject();
  219. json.put("id", id);
  220. json.put("event", type);
  221. json.put("data", data);
  222. log.info("deepseek返回信息:" + json);
  223. send(sseEmitter, json);
  224. }
  225. }
  226. @Override
  227. public void onFailure(@NotNull EventSource eventSource, Throwable t, Response response) {
  228. if (response != null) {
  229. log.error("deepseek Connection failed. Response code: {}, message: {}, body: {}",
  230. response.code(), response.message(), response.body() != null ? response.body().toString() : "null");
  231. } else {
  232. log.error("deepseek Connection failed with no response", t);
  233. }
  234. sseEmitter.completeWithError(t);
  235. }
  236. private void send(SseEmitter sseEmitter, Object obj) {
  237. try {
  238. sseEmitter.send(obj);
  239. } catch (IOException e) {
  240. log.error("deepseek 推送数据失败", e);
  241. }
  242. }
  243. };
  244. OkHttpClient client = buildOkHttpClient();
  245. EventSource.Factory factory = EventSources.createFactory(client);
  246. final EventSource eventSources = factory.newEventSource(request, listener);
  247. // 客户端主动关闭连接
  248. sseEmitter.onCompletion(() -> {
  249. logger.info("deepseek客户端主动关闭连接 -- SSE 连接关闭");
  250. });
  251. // 超时回调
  252. sseEmitter.onTimeout(() -> {
  253. logger.info("deepseek客户端连接超时 -- SSE 连接关闭");
  254. if(eventSources != null) {
  255. logger.info("deepseek超时回调 -- 成功关闭SSE连接 ");
  256. eventSources.cancel();
  257. }
  258. });
  259. // 错误回调
  260. sseEmitter.onError(e -> {
  261. logger.info("deepseek客户端回调失败 -- SSE 连接关闭");
  262. if(eventSources != null) {
  263. logger.info("deepseek错误回调 -- 成功关闭SSE连接 ");
  264. eventSources.cancel();
  265. }
  266. });
  267. return sseEmitter;
  268. }
  269. }
  270. return null;
  271. }
  272. @Override
  273. public List<String> asyncCompletions(TakaiCompletionsParams params) {
  274. List<String> list = new ArrayList<>();
  275. TakaiApplication vo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(params.getAppId()).build());
  276. if (vo != null) {
  277. TakaiPromptInfo info = new TakaiPromptInfo();
  278. info.setContent(deepseekConfig.getPrompt());
  279. info.setRole("user");
  280. params.getMessages().add(info);
  281. JSONObject jsonObject = new JSONObject();
  282. jsonObject.put("model", vo.getModel());
  283. jsonObject.put("messages", params.getMessages());
  284. jsonObject.put("chat_id", params.getChat_id());
  285. JSONObject result = getasyncCompletions(jsonObject);
  286. if (result != null && result.getInteger("code") == 200) {
  287. JSONArray array = result.getJSONArray("data");
  288. list.addAll(array.toJavaList(String.class));
  289. }
  290. }
  291. return list;
  292. }
  293. private JSONObject getasyncCompletions(JSONObject jsonObject) {
  294. String url = deepseekConfig.getBaseurl() + deepseekConfig.getAsyncCompletions();
  295. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  296. Request request = buildPostRequest(url, requestBody);
  297. OkHttpClient client = buildOkHttpClient();
  298. try {
  299. Response response = client.newCall(request).execute();
  300. if (response.isSuccessful()) {
  301. String body = response.body().string();
  302. if (isJsonObject(body)) {
  303. return JSON.parseObject(body);
  304. }
  305. }
  306. } catch (IOException e) {
  307. log.info("deepseek Request URL: {}", e.getMessage());
  308. }
  309. return null;
  310. }
  311. @Override
  312. public List<TakaiDialogRespDTO> getDialogDetail(String dialogId) {
  313. List<TakaiDialogRespDTO> detail = takaiDialogMapper.selectDialogDetail(dialogId);
  314. if(detail != null && detail.size() != 0){
  315. for(TakaiDialogRespDTO dto : detail){
  316. if(StringUtils.isNotEmpty(dto.getSliceJson())){
  317. dto.setSliceInfo(JSON.parseObject(dto.getSliceJson(), TakaiSliceInfoDTO.class));
  318. }
  319. }
  320. }
  321. return detail;
  322. }
  323. @Override
  324. public void saveDialog(TakaiDialogReqDTO dialogReqDTO) {
  325. String dialogId = null;
  326. TakaiDialogRespDTO dialogVo = null;
  327. if (com.takai.common.utils.StringUtils.isNotEmpty(dialogReqDTO.getId())) {
  328. dialogVo = takaiDialogMapper.selectDialogById(dialogReqDTO.getId());
  329. }
  330. if (dialogVo == null) {
  331. takaiDialogMapper.insertDialog(dialogReqDTO);
  332. dialogId = dialogReqDTO.getId();
  333. } else {
  334. dialogId = dialogReqDTO.getId();
  335. }
  336. for (TakaiDialogDetailReqDTO dto : dialogReqDTO.getMessages()) {
  337. dto.setDialogId(dialogId);
  338. TakaiDialogRespDTO detail = takaiDialogMapper.selectDialogDetailById(dto.getId());
  339. if (detail == null) {
  340. if (dto.getSliceInfo() != null) dto.setSliceJson(JSON.toJSONString(dto.getSliceInfo()));
  341. takaiDialogMapper.insertDialogDetail(dto);
  342. }
  343. }
  344. }
  345. @Override
  346. public List<Object> getDialogList(String appId) {
  347. List<TakaiDialogRespDTO> dialogRespDTOS = takaiDialogMapper.selectDialogList(appId);
  348. //当前日期
  349. LocalDate today = LocalDate.now();
  350. //根据时间分组降序排序
  351. NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = dialogRespDTOS.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
  352. List<Object> obj = new ArrayList();
  353. if (!groupList.isEmpty()) {
  354. for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
  355. // 对比两个时间相差多少天
  356. long daysBetween = ChronoUnit.DAYS.between(today, entry.getKey());
  357. Map<String, Object> m = new HashMap();
  358. m.put("key", System.nanoTime());
  359. m.put("type", "group");
  360. if (daysBetween == 0l) {
  361. m.put("label", TODAY);
  362. m.put("children", setValue(entry.getValue()));
  363. obj.add(m);
  364. } else {
  365. m.put("label", -daysBetween + BEFOR);
  366. m.put("children", setValue(entry.getValue()));
  367. obj.add(m);
  368. }
  369. }
  370. }
  371. return obj;
  372. }
  373. @Override
  374. public void DelDialogDetail(String id) {
  375. int result = takaiDialogMapper.delDialog(id);
  376. if (result > 0) {
  377. takaiDialogMapper.delDialogDetail(id);
  378. }
  379. }
  380. @Override
  381. public void updateDialog(TakaiDialogReqDTO dialogReqDTO) {
  382. takaiDialogMapper.updateDialog(dialogReqDTO);
  383. }
  384. @Override
  385. public List<TakaiDialogRespDTO> exportExcel(String dialogId) {
  386. return takaiDialogMapper.selectDialogExport(dialogId);
  387. }
  388. @Override
  389. public int createKnowledge(TakaiKnowledgeParams knowledge) {
  390. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  391. long knowledgeId = snowflakeDigitGenerator.nextId();
  392. String url = deepseekConfig.getBaseurl() + deepseekConfig.getCreateKnowledge();
  393. JSONObject jsonObject = new JSONObject();
  394. jsonObject.put("knowledge_id", "a" + knowledgeId);
  395. jsonObject.put("embedding_id", knowledge.getEmbeddingId());
  396. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  397. Request request = buildPostRequest(url, requestBody);
  398. OkHttpClient client = buildOkHttpClient();
  399. try {
  400. Response response = client.newCall(request).execute();
  401. if (response.isSuccessful()) {
  402. String body = response.body().string();
  403. JSONObject obj = JSON.parseObject(body);
  404. Integer code = obj.getInteger("code");
  405. if (code == 200) {
  406. TakaiKnowledge params = TakaiKnowledge.builder()
  407. .knowledgeId("a" + knowledgeId)
  408. .name(knowledge.getName())
  409. .embeddingId(knowledge.getEmbeddingId())
  410. .description(knowledge.getDescription())
  411. .build();
  412. return takaiKnowledgeMapper.insertKnowledge(params);
  413. }
  414. } else {
  415. logger.error("创建知识库调用python接口失败,返回状态码:{}", response.code());
  416. }
  417. } catch (IOException e) {
  418. logger.error("创建知识库调用python接口失败", e.getMessage());
  419. }
  420. return 0;
  421. }
  422. @Override
  423. public int updateKnowledge(TakaiKnowledgeParams knowledge, String knowledgeId) {
  424. TakaiKnowledge params = TakaiKnowledge.builder().knowledgeId(knowledgeId)
  425. .name(knowledge.getName())
  426. .description(knowledge.getDescription())
  427. .embeddingId(knowledge.getEmbeddingId())
  428. .build();
  429. return takaiKnowledgeMapper.updateKnowledge(params);
  430. }
  431. @Override
  432. public TakaiKnowledge detailKnowledge(String knowledgeId) {
  433. TakaiKnowledge vo = TakaiKnowledge.builder().knowledgeId(knowledgeId).build();
  434. return takaiKnowledgeMapper.selectTargetKnowledge(vo);
  435. }
  436. @Override
  437. public int delKnowledge(String knowledgeId) {
  438. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteKnowledge() + "/" + knowledgeId;
  439. Request request = buildDeleteRequest(url);
  440. OkHttpClient client = buildOkHttpClient();
  441. Response response = null;
  442. try {
  443. response = client.newCall(request).execute();
  444. if (response.isSuccessful()) {
  445. String body = response.body().string();
  446. JSONObject obj = JSON.parseObject(body);
  447. Integer code = obj.getInteger("code");
  448. if (code == 200) {
  449. // TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  450. List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().knowledgeId(knowledgeId).build());
  451. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
  452. int knowledgeInt = takaiKnowledgeMapper.delKnowledge(knowledgeId);
  453. if (knowledgeInt > 0) {
  454. takaiDocumentMapper.delDocumentByKnowledgeId(knowledgeId);
  455. takaiDocumentSettingsMapper.deleteDocumentSettingsByKnowledgeId(knowledgeId);
  456. if(list != null && list.size() > 0){
  457. try {
  458. for(TakaiDocument document: documentList){
  459. logger.info("删除知识库->删除minio文件");
  460. minioUtil.remove("deepseek-doc", "/"+document.getName());
  461. }
  462. for (int k = 0; k < list.size(); k++ ) {
  463. logger.info("删除知识库->删除minio图片{}", k);
  464. String key = "/pdf/"+knowledgeId+"/"+list.get(k).getDocumentId()+"/【示意图序号_"+list.get(k).getDocumentId()+"_"+k+1+"】.jpg";
  465. logger.info("删除知识库->删除minio图片key{}", key);
  466. minioUtil.remove("deepseek-doc" , key);
  467. }
  468. } catch (Exception e) {
  469. logger.error("删除知识库->删除minion文件失败", e.getMessage());
  470. throw new RuntimeException(e);
  471. }
  472. }
  473. }
  474. return knowledgeInt;
  475. }
  476. }
  477. } catch (IOException e) {
  478. logger.error("删除知识库调用python接口失败", e.getMessage());
  479. }
  480. return 0;
  481. }
  482. @Override
  483. public int uploadDocument(MultipartFile[] files, String knowledgeId) {
  484. List<TakaiSysOss> result = null;
  485. try {
  486. result = minioUtil.uploadMultiple(files);
  487. } catch (Exception e) {
  488. logger.error("上传文件失败", e.getMessage());
  489. }
  490. if (result != null && result.size() > 0) {
  491. List<UploadDocumentParams> params = new ArrayList<>();
  492. for (int i = 0; i<result.size(); i++) {
  493. SnowflakeDigitGenerator documentIdGenerator = new SnowflakeDigitGenerator(i, i);
  494. long documentId = documentIdGenerator.nextId();
  495. UploadDocumentParams param = new UploadDocumentParams();
  496. param.setDocument_id("a" + documentId);
  497. param.setName(result.get(i).getOriginalName());
  498. param.setUrl(result.get(i).getUrl());
  499. params.add(param);
  500. }
  501. TakaiDocumentSettings settings = new TakaiDocumentSettings();
  502. settings.setKnowledgeId(knowledgeId);
  503. JSONObject jsonObject = analysisFile(params, settings, "upload");
  504. if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
  505. for (UploadDocumentParams vo : params) {
  506. TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  507. if(info != null){
  508. // 更新知识库文件大小,总字符数, 文件总数
  509. JSONObject docInfo = jsonObject.getJSONObject("doc_info");
  510. if(docInfo != null){
  511. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
  512. Integer fileLen = docInfo.getInteger("file_size");
  513. Integer wordNum = docInfo.getInteger("total_char_len");
  514. Integer sliceTotal = docInfo.getInteger("slice_num");
  515. TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(knowledgeId)
  516. .length(info.getLength() == null ? fileLen : info.getLength() + fileLen ) // 文件大小
  517. .wordNum(info.getWordNum() == null ? wordNum : info.getWordNum() + wordNum) // 总字符数
  518. .documentSize(documentList == null || documentList.size() == 0 ? 1 : documentList.size() + 1) // 文件总数
  519. .build();
  520. takaiKnowledgeMapper.updateKnowledge(paramInfo);
  521. for (TakaiSysOss oss : result) {
  522. // oss保存到数据库
  523. takaiSysOssMapper.insertSysOss(oss);
  524. }
  525. // 保存知识信息
  526. TakaiDocument document = TakaiDocument.builder()
  527. .documentId(vo.getDocument_id())
  528. .knowledgeId(knowledgeId)
  529. .customSeparator(String.format("[\"%s\"", "\\n") + "]")
  530. .sentenceSize("300")
  531. .name(vo.getName())
  532. .url(vo.getUrl())
  533. .sliceTotal(sliceTotal)
  534. .length(fileLen)
  535. .wordNum(wordNum)
  536. .build();
  537. int documentIdInsert = takaiDocumentMapper.insertDocument(document);
  538. if (documentIdInsert > 0) {
  539. // 保存知识设置信息
  540. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  541. long id = snowflakeDigitGenerator.nextId();
  542. TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
  543. dSettings.setId(String.valueOf(id));
  544. dSettings.setKnowledgeId(knowledgeId);
  545. dSettings.setDocumentId(vo.getDocument_id());
  546. dSettings.setSetSlice("0"); // 默认 按标题段落切片
  547. dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
  548. dSettings.setSetTable("0"); // 默认 ttable转图片
  549. takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
  550. }
  551. }
  552. }
  553. }
  554. setRedisCache(knowledgeId);
  555. return 1;
  556. }
  557. }
  558. return 0;
  559. }
  560. @Override
  561. public int updateDocument(TakaiDocumentParams documentParams, String documentId) {
  562. int i = takaiDocumentMapper.updateDocument(TakaiDocument.builder()
  563. .documentId(documentId)
  564. .name(documentParams.getName())
  565. .build());
  566. return i;
  567. }
  568. @Override
  569. public List<TakaiDocument> documentList(TakaiDocumentParams documentParams) {
  570. return takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(documentParams.getKnowledge_id()).build());
  571. }
  572. @Override
  573. public TakaiDocument documentDetail(String documentId) {
  574. return takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  575. }
  576. @Override
  577. public int delDocument(String documentId) {
  578. TakaiDocument vo = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  579. if(vo != null){
  580. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteDoc() + "/" + documentId + "/" + vo.getKnowledgeId();
  581. Request request = buildDeleteRequest(url);
  582. OkHttpClient client = buildOkHttpClient();
  583. try {
  584. Response response = client.newCall(request).execute();
  585. if (response.isSuccessful()) {
  586. String body = response.body().string();
  587. logger.info("删除知识文件调用python接口返回结果:{}", body);
  588. JSONObject obj = JSON.parseObject(body);
  589. Integer code = obj.getInteger("code");
  590. if (code == 200) {
  591. List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().documentId(documentId).build());
  592. // 删除图片
  593. takaiMediaReplacementMapper.deleteMedia(documentId);
  594. // 删除document文件
  595. int i = takaiDocumentMapper.delDocument(documentId);
  596. if(i > 0){
  597. TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(vo.getKnowledgeId()).build());
  598. if(info != null){
  599. // 更新知识库文件大小,总字符数, 文件总数
  600. TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(vo.getKnowledgeId())
  601. .length(vo.getLength() == null ? info.getLength() == null ? 0 : info.getLength() : info.getLength() - vo.getLength()) // 文件大小
  602. .wordNum(vo.getWordNum() == null ? info.getWordNum() == null ? 0 : info.getWordNum() : info.getWordNum() - vo.getWordNum()) // 总字符数
  603. .documentSize(info.getDocumentSize() == null ? 0 : info.getDocumentSize() - 1) // 文件总数
  604. .build();
  605. takaiKnowledgeMapper.updateKnowledge(paramInfo);
  606. }
  607. // 删除minio文件
  608. try {
  609. logger.info("删除minio文件");
  610. minioUtil.remove("deepseek-doc", "/"+vo.getName());
  611. if(list != null && list.size() > 0){
  612. for (int k=1; k<=list.size(); k++ ) {
  613. logger.info("删除minio图片{}", k);
  614. minioUtil.remove("deepseek-doc" , "/pdf/"+vo.getKnowledgeId()+"/"+documentId+"/【示意图序号_"+documentId+"_"+k+"】.jpg");
  615. }
  616. }
  617. } catch (Exception e) {
  618. logger.error("删除minion文件失败", e.getMessage());
  619. throw new RuntimeException(e);
  620. }
  621. return i;
  622. }
  623. }
  624. }
  625. } catch (IOException e) {
  626. logger.error("删除知识文件调用python接口失败", e.getMessage());
  627. }
  628. }
  629. return 0;
  630. }
  631. @Override
  632. public void uploadUrl(TakaiDocumentObject object) {
  633. }
  634. @Override
  635. public int createApplication(TakaiApplicationParams params) {
  636. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  637. long appId = snowflakeDigitGenerator.nextId();
  638. TakaiApplication info = TakaiApplication.builder().appId(String.valueOf(appId))
  639. .name(params.getName())
  640. .desc(params.getDesc())
  641. .model(params.getModel())
  642. .knowledgeIds(params.getKnowledge_ids().toString())
  643. .topP(params.getTop_p())
  644. .temperature(params.getTemperature())
  645. .maxToken(params.getMax_token())
  646. .prompt(params.getPrompt())
  647. .knowledgeInfo(params.getKnowledge_info())
  648. .sliceCount(params.getSlice_count())
  649. .typeId(params.getTypeId())
  650. .build();
  651. int i = takaiApplicationMapper.insertApplication(info);
  652. if (i > 0) {
  653. logger.info("create application success, id:{}, name:{}", appId, params.getName());
  654. TakaiAppInfo appInfo = new TakaiAppInfo();
  655. appInfo.setAppId(String.valueOf(appId));
  656. appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
  657. takaiAppInfoMapper.insertAppInfo(appInfo);
  658. List<String> list = params.getQuestionList();
  659. if (!list.isEmpty() && list.size() > 0) {
  660. for (String str : list) {
  661. if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
  662. String uuid = IdUtils.simpleUUID();
  663. TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
  664. takaiQuestionMapper.insertQuestion(question);
  665. }
  666. }
  667. }
  668. }
  669. return i;
  670. }
  671. @Override
  672. public int updateApplication(TakaiApplicationParams params, String appId) {
  673. TakaiApplication info = TakaiApplication.builder().appId(appId)
  674. .name(params.getName())
  675. .desc(params.getDesc())
  676. .model(params.getModel())
  677. .knowledgeIds(params.getKnowledge_ids().toString())
  678. .topP(params.getTop_p())
  679. .temperature(params.getTemperature())
  680. .maxToken(params.getMax_token())
  681. .prompt(params.getPrompt())
  682. .knowledgeInfo(params.getKnowledge_info())
  683. .sliceCount(params.getSlice_count())
  684. .typeId(params.getTypeId())
  685. .build();
  686. int i = takaiApplicationMapper.updateApplication(info);
  687. if (1 > 0) {
  688. TakaiAppInfo appInfo = new TakaiAppInfo();
  689. appInfo.setAppId(appId);
  690. appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
  691. takaiAppInfoMapper.updateAppInfoByAppId(appInfo);
  692. logger.info("update application success, id:{}, name:{}", appId, params.getName());
  693. //预设问题写入数据库
  694. takaiQuestionMapper.delQuestionByAppId(appId);
  695. List<String> list = params.getQuestionList();
  696. if (!list.isEmpty() && list.size() > 0) {
  697. for (String str : list) {
  698. if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
  699. String uuid = IdUtils.simpleUUID();
  700. TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
  701. takaiQuestionMapper.insertQuestion(question);
  702. }
  703. }
  704. }
  705. }
  706. return i;
  707. }
  708. @Override
  709. public List<TakaiApplication> getApplicationList() {
  710. return takaiApplicationMapper.selectApplicationList(null);
  711. }
  712. @Override
  713. public JSONObject selectApplication(String appId) {
  714. JSONObject object = new JSONObject();
  715. TakaiApplication application = TakaiApplication.builder().appId(appId).build();
  716. TakaiApplication takaiApplication = takaiApplicationMapper.selectTargetApplication(application);
  717. List<TakaiQuestionDTO> list = takaiQuestionMapper.getQuestionList(appId);
  718. object.put("detail", takaiApplication);
  719. object.put("questionlist", list);
  720. return object;
  721. }
  722. @Override
  723. public int delApplication(String appId) {
  724. int i = takaiApplicationMapper.delApplication(appId);
  725. if (i > 0) {
  726. takaiAppInfoMapper.delAppInfoByAppId(appId);
  727. takaiQuestionMapper.delQuestionByAppId(appId);
  728. }
  729. return i;
  730. }
  731. @Override
  732. public List<TakaiQuestionDTO> selectQuestionByAppId(String appId) {
  733. List<TakaiQuestionDTO> List = takaiQuestionMapper.getQuestionList(appId);
  734. return List;
  735. }
  736. @Override
  737. public List<TakaiKnowledge> queryKnowledgeList() {
  738. return takaiKnowledgeMapper.selectKnowledgeList(null);
  739. }
  740. @Override
  741. public List<Object> selectDialogListByAppId(String appId, String userId) {
  742. List<TakaiDialogRespDTO> list = takaiDialogMapper.selectDialog(appId, userId);
  743. List<Object> result = setDialogList(list);
  744. return result;
  745. }
  746. @Override
  747. public TakaiDocumentSettings documentSetting(String documentId) {
  748. return takaiDocumentSettingsMapper.selectById(documentId);
  749. }
  750. @Override
  751. public int updateDocumentSetting(TakaiDocumentSettings documentSettings, String documentId) {
  752. TakaiDocumentSettings settings = new TakaiDocumentSettings();
  753. TakaiDocumentSettings settingsVo = takaiDocumentSettingsMapper.selectById(documentId);
  754. settings.setKnowledgeId(settingsVo.getKnowledgeId());
  755. settings.setSetSlice(documentSettings.getSetSlice());
  756. settings.setSliceValue(documentSettings.getSliceValue());
  757. settings.setSetAnalyze(documentSettings.getSetAnalyze());
  758. settings.setSetTable(documentSettings.getSetTable());
  759. TakaiDocument document = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  760. List<UploadDocumentParams> listParams = new ArrayList<>();
  761. if (document != null) {
  762. UploadDocumentParams params = new UploadDocumentParams();
  763. params.setDocument_id(documentId);
  764. params.setName(document.getName());
  765. params.setUrl(document.getUrl());
  766. listParams.add(params);
  767. }
  768. JSONObject jsonObject = analysisFile(listParams, settings, "update");
  769. if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
  770. logger.info("update document setting success, id:{}", documentId);
  771. documentSettings.setDocumentId(documentId);
  772. return takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
  773. }
  774. return 0;
  775. }
  776. @Override
  777. public JSONObject getSliceList(TakaiSliceParams params) {
  778. // String url = deepseekConfig.getBaseurl() + deepseekConfig.getSlicePage();
  779. // JSONObject jsonObject = new JSONObject();
  780. // jsonObject.put("document_id", params.getDocument_id());
  781. // jsonObject.put("knowledge_id", params.getKnowledge_id());
  782. // jsonObject.put("text", params.getText());
  783. // jsonObject.put("pageNum", params.getPageNum());
  784. // jsonObject.put("pageSize", params.getPageSize());
  785. //
  786. // RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  787. // Request request = buildPostRequest(url, requestBody);
  788. //
  789. // OkHttpClient client = buildOkHttpClient();
  790. // Response response = null;
  791. // try {
  792. // response = client.newCall(request).execute();
  793. // if (response.isSuccessful()) {
  794. // String body = response.body().string();
  795. // JSONObject obj = JSON.parseObject(body);
  796. // Integer code = obj.getInteger("code");
  797. // if (code == 200) {
  798. // return obj;
  799. // }
  800. // } else {
  801. // logger.info("获取切片列表调用python接口失败,返回状态码:{}", response.code());
  802. // }
  803. // } catch (IOException e) {
  804. // logger.error("获取切片列表调用python接口失败", e.getMessage());
  805. // }
  806. return null;
  807. }
  808. @Override
  809. public int deleteSlice(String sliceId, String knowledgeId, String documentId) {
  810. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteSlice() + "/" + sliceId + "/" + knowledgeId + "/" + documentId;
  811. Request request = buildDeleteRequest(url);
  812. OkHttpClient client = buildOkHttpClient();
  813. Response response = null;
  814. try {
  815. response = client.newCall(request).execute();
  816. if (response.isSuccessful()) {
  817. String body = response.body().string();
  818. JSONObject obj = JSON.parseObject(body);
  819. Integer code = obj.getInteger("code");
  820. logger.info("删除切片调用python接口成功,返回结果:{}", body);
  821. if (code == 200) {
  822. return 1;
  823. }
  824. }
  825. } catch (IOException e) {
  826. logger.error("删除切片调用python接口失败", e.getMessage());
  827. }
  828. return 0;
  829. }
  830. @Override
  831. public JSONObject getSliceDetail(String sliceId, String knowledgeId) {
  832. String url = deepseekConfig.getBaseurl() + deepseekConfig.getSliceDetail() + "/" + knowledgeId + "/" + sliceId;
  833. Request request = buildGetRequest(url);
  834. OkHttpClient client = buildOkHttpClient();
  835. try {
  836. Response response = client.newCall(request).execute();
  837. if (response.isSuccessful()) {
  838. String body = response.body().string();
  839. log.info("查询切片详情返回:" + body);
  840. return JSON.parseObject(body);
  841. } else {
  842. logger.info("获取切片详情调用python接口失败,返回状态码:{}", response.code());
  843. }
  844. } catch (IOException e) {
  845. log.error("查询切片详情调用python接口失败", e.getMessage());
  846. }
  847. return null;
  848. }
  849. @Override
  850. public int updateSliceInfo(TakaiSliceUpdateParams params) {
  851. String url = deepseekConfig.getBaseurl() + deepseekConfig.getUpdateSlice();
  852. JSONObject object = new JSONObject();
  853. object.put("knowledge_id", params.getKnowledgeId());
  854. object.put("slice_id", params.getSliceId());
  855. object.put("slice_text", params.getSliceText());
  856. object.put("document_id", params.getDocumentId());
  857. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), object.toJSONString());
  858. Request request = buildPutRequest(url, requestBody);
  859. OkHttpClient client = buildOkHttpClient();
  860. try {
  861. Response response = client.newCall(request).execute();
  862. if (response.isSuccessful()) {
  863. String body = response.body().string();
  864. JSONObject obj = JSON.parseObject(body);
  865. Integer code = obj.getInteger("code");
  866. if (code == 200) {
  867. return 1;
  868. }
  869. }
  870. } catch (Exception e) {
  871. logger.error("更新切片信息调用python接口失败", e.getMessage());
  872. }
  873. return 0;
  874. }
  875. @Override
  876. public TakaiMediaReplacement getTakaiMediaReplacement() {
  877. TakaiMediaReplacement mrParams = TakaiMediaReplacement.builder()
  878. .documentId("a2912832435041734656")
  879. .originText("【示意图序号_a2912832435041734656_1】")
  880. .mediaType("image").build();
  881. TakaiMediaReplacement mrVo = takaiMediaReplacementMapper.selectTargetMedia(mrParams);
  882. return mrVo;
  883. }
  884. @Override
  885. public int addSlice(TakaiSliceUpdateParams params) {
  886. String url = deepseekConfig.getBaseurl() + deepseekConfig.getAddSlice();
  887. TakaiDocument info = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(params.getDocumentId()).build());
  888. if(info != null){
  889. JSONObject json = new JSONObject();
  890. json.put("knowledge_id", params.getKnowledgeId());
  891. json.put("document_id", params.getDocumentId());
  892. json.put("slice_text", params.getSliceText());
  893. json.put("doc_name", info.getName());
  894. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  895. Request request = buildPostRequest(url, requestBody);
  896. OkHttpClient client = buildOkHttpClient();
  897. try {
  898. Response response = client.newCall(request).execute();
  899. if (response.isSuccessful()) {
  900. String body = response.body().string();
  901. JSONObject obj = JSON.parseObject(body);
  902. Integer code = obj.getInteger("code");
  903. if (code == 200) {
  904. return 1;
  905. }
  906. }
  907. }catch (Exception e) {
  908. logger.error("新增切片调用python接口失败", e.getMessage());
  909. }
  910. }
  911. return 0;
  912. }
  913. @Override
  914. public List<TakaiSliceInfo> selectByDocumentId(String documentId) {
  915. return takaiSliceInfoMapper.selectByDocumentId(documentId);
  916. }
  917. @Override
  918. public TakaiSliceInfo selectBySliceId(String sliceId) {
  919. return takaiSliceInfoMapper.selectBySliceId(sliceId);
  920. }
  921. @Override
  922. public List<SliceInfo> slicePageInfoList(List<String> list) {
  923. return takaiSliceInfoMapper.slicePageInfoList(list);
  924. }
  925. @Override
  926. public JSONObject searchSlice(String id) {
  927. String url = deepseekConfig.getBaseurl() + deepseekConfig.getSearchSlice() + "/" + id;
  928. Request request = buildGetRequest(url);
  929. OkHttpClient client = buildOkHttpClient();
  930. try {
  931. Response response = client.newCall(request).execute();
  932. if (response.isSuccessful()) {
  933. String body = response.body().string();
  934. JSONObject obj = JSON.parseObject(body);
  935. Integer code = obj.getInteger("code");
  936. if (code == 200) {
  937. return obj;
  938. }
  939. }
  940. }catch (Exception e) {
  941. logger.error("切片得分调用python接口失败", e.getMessage());
  942. }
  943. return null;
  944. }
  945. @Override
  946. public List<Object> searchAppTypeGroupList(List<SysDictData> dictDataList) {
  947. List<Object> result = new ArrayList();
  948. if (dictDataList!= null && dictDataList.size() > 0) {
  949. for (SysDictData dictData : dictDataList){
  950. Map<String, Object> map = new HashMap();
  951. List<TakaiApplication> list = takaiApplicationMapper.selectApplicationList(TakaiApplication.builder().typeId(dictData.getDictCode()).build());
  952. if(list!= null && list.size() > 0){
  953. map.put("title", dictData.getDictLabel());
  954. List<Object> appInfoList = new ArrayList();
  955. for (TakaiApplication application : list){
  956. Map<String, Object> infoMap = new HashMap();
  957. infoMap.put("title", application.getName());
  958. infoMap.put("appId", application.getAppId());
  959. infoMap.put("showMenu", "false");
  960. infoMap.put("chatMode", "LOCAL");
  961. appInfoList.add(infoMap);
  962. }
  963. map.put("children", appInfoList);
  964. result.add(map);
  965. }
  966. }
  967. }
  968. return result;
  969. }
  970. private JSONObject analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
  971. String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
  972. JSONObject json = new JSONObject();
  973. json.put("knowledge_id", settings.getKnowledgeId());
  974. json.put("docs", result);
  975. if ("upload".equals(flag)) {
  976. json.put("set_slice", "0");
  977. json.put("slice_value", null);
  978. json.put("set_analyze", "1");
  979. json.put("set_table", "0");
  980. json.put("flag", "upload");
  981. } else {
  982. json.put("set_slice", settings.getSetSlice());
  983. json.put("slice_value", settings.getSliceValue());
  984. json.put("set_analyze", settings.getSetAnalyze());
  985. json.put("set_table", settings.getSetTable());
  986. json.put("flag", "update");
  987. }
  988. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json.toJSONString());
  989. Request request = buildPostRequest(url, requestBody);
  990. OkHttpClient client = buildOkHttpClient();
  991. Response response = null;
  992. try {
  993. response = client.newCall(request).execute();
  994. if (response.isSuccessful()) {
  995. String body = response.body().string();
  996. JSONObject obj = JSON.parseObject(body);
  997. Integer code = obj.getInteger("code");
  998. if (code == 200) {
  999. logger.info("上传文档调用python接口成功,返回内容:{}", body);
  1000. return obj;
  1001. }
  1002. return obj;
  1003. } else {
  1004. logger.error("上传文档调用python接口失败返回code:{}", response.code());
  1005. return null;
  1006. }
  1007. } catch (IOException e) {
  1008. logger.error("上传文档调用python接口失败", e.getMessage());
  1009. return null;
  1010. }
  1011. }
  1012. private List<Object> setDialogList(List<TakaiDialogRespDTO> list) {
  1013. //根据时间分组降序排序
  1014. NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = list.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
  1015. List<Object> obj = new ArrayList();
  1016. if (!groupList.isEmpty()) {
  1017. for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
  1018. List<TakaiDialogRespDTO> aList = entry.getValue();
  1019. List<TakaiDialogRespDTO> detailList = takaiDialogMapper.selectDialogExport(aList.get(0).getId());
  1020. Map<String, Object> map = new HashMap();
  1021. map.put("dialog_name", aList.get(0).getDialog_name());
  1022. map.put("length", detailList.size());
  1023. map.put("create_time", aList.get(0).getCreate_time());
  1024. map.put("did", aList.get(0).getDid());
  1025. map.put("id", aList.get(0).getId());
  1026. obj.add(map);
  1027. }
  1028. }
  1029. return obj;
  1030. }
  1031. private List<Map<String, Object>> setValue(List<TakaiDialogRespDTO> list) {
  1032. List<Map<String, Object>> l = new ArrayList();
  1033. for (TakaiDialogRespDTO vo : list) {
  1034. Map<String, Object> map = new HashMap();
  1035. map.put("key", vo.getId());
  1036. map.put("label", vo.getDialog_name());
  1037. l.add(map);
  1038. }
  1039. return l;
  1040. }
  1041. private OkHttpClient buildOkHttpClient() {
  1042. return new OkHttpClient.Builder()
  1043. .connectTimeout(10, TimeUnit.SECONDS)
  1044. .writeTimeout(50, TimeUnit.SECONDS)
  1045. .readTimeout(10, TimeUnit.MINUTES)
  1046. .build();
  1047. }
  1048. private Request buildGetRequest(String url) {
  1049. return new Request.Builder()
  1050. .addHeader("User-Agent", "insomnia/10.3.1")
  1051. .url(url).get().build();
  1052. }
  1053. private Request buildPostRequest(String url, RequestBody requestBody) {
  1054. return new Request.Builder()
  1055. .addHeader("User-Agent", "insomnia/10.3.1")
  1056. .addHeader("Content-Type", "application/json")
  1057. .url(url).post(requestBody).build();
  1058. }
  1059. private Request buildPutRequest(String url, RequestBody requestBody) {
  1060. return new Request.Builder()
  1061. .addHeader("User-Agent", "insomnia/10.3.1")
  1062. .url(url).put(requestBody).build();
  1063. }
  1064. private Request buildDeleteRequest(String url) {
  1065. return new Request.Builder()
  1066. .addHeader("Content-Type", "multipart/form-data")
  1067. .addHeader("User-Agent", "insomnia/10.3.1")
  1068. .url(url).delete().build();
  1069. }
  1070. private Request buildUploadPostRequest(String url, RequestBody requestBody) {
  1071. return new Request.Builder()
  1072. .addHeader("User-Agent", "insomnia/10.3.1")
  1073. .addHeader("Content-Type", "application/json")
  1074. .url(url).post(requestBody).build();
  1075. }
  1076. private boolean isJsonObject(String data) {
  1077. try {
  1078. JSON.parseObject(data);
  1079. return true;
  1080. } catch (Exception e) {
  1081. return false;
  1082. }
  1083. }
  1084. }