TakaiAiServiceImpl.java 51 KB

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