TakaiAiServiceImpl.java 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115
  1. package com.takai.ai.service.impl;
  2. import cn.hutool.crypto.digest.DigestUtil;
  3. import com.alibaba.fastjson2.JSON;
  4. import com.alibaba.fastjson2.JSONArray;
  5. import com.alibaba.fastjson2.JSONObject;
  6. import com.github.pagehelper.PageHelper;
  7. import com.takai.ai.domain.TakaiSysOss;
  8. import com.takai.ai.domain.dto.*;
  9. import com.takai.ai.domain.dto.drone.ProjectDetectionParam;
  10. import com.takai.ai.domain.entity.*;
  11. import com.takai.ai.mapper.*;
  12. import com.takai.ai.service.IMinioConfigService;
  13. import com.takai.ai.service.ITakaiAiService;
  14. import com.takai.ai.utils.*;
  15. import com.takai.common.annotation.DataScope;
  16. import com.takai.common.annotation.DataSource;
  17. import com.takai.common.config.DeepseekConfig;
  18. import com.takai.common.constant.UserConstants;
  19. import com.takai.common.core.domain.entity.SysDictData;
  20. import com.takai.common.core.domain.entity.SysUser;
  21. import com.takai.common.core.domain.model.LoginUser;
  22. import com.takai.common.core.redis.RedisCache;
  23. import com.takai.common.enums.AppTypeEnum;
  24. import com.takai.common.enums.DataSourceType;
  25. import com.takai.common.utils.SecurityUtils;
  26. import com.takai.common.utils.StringUtils;
  27. import com.takai.common.utils.uuid.IdUtils;
  28. import com.takai.framework.web.service.SysPermissionService;
  29. import com.takai.system.domain.*;
  30. import com.takai.system.mapper.*;
  31. import com.takai.system.service.ISysUserService;
  32. import lombok.extern.slf4j.Slf4j;
  33. import okhttp3.*;
  34. import okhttp3.sse.EventSource;
  35. import okhttp3.sse.EventSourceListener;
  36. import okhttp3.sse.EventSources;
  37. import org.apache.commons.collections4.MapUtils;
  38. import org.slf4j.Logger;
  39. import org.slf4j.LoggerFactory;
  40. import org.springframework.beans.BeanUtils;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import org.springframework.data.redis.core.RedisTemplate;
  43. import org.springframework.scheduling.annotation.Async;
  44. import org.springframework.stereotype.Service;
  45. import org.springframework.web.multipart.MultipartFile;
  46. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  47. import javax.validation.constraints.NotNull;
  48. import java.io.IOException;
  49. import java.nio.charset.StandardCharsets;
  50. import java.time.LocalDate;
  51. import java.time.LocalDateTime;
  52. import java.time.format.DateTimeFormatter;
  53. import java.time.temporal.ChronoUnit;
  54. import java.util.*;
  55. import java.util.concurrent.CompletableFuture;
  56. import java.util.concurrent.ExecutorService;
  57. import java.util.concurrent.TimeUnit;
  58. import java.util.concurrent.atomic.AtomicInteger;
  59. import java.util.stream.Collectors;
  60. /**
  61. * 高井 业务层处理
  62. *
  63. * @author takai
  64. */
  65. @Slf4j
  66. @Service
  67. @DataSource(DataSourceType.MASTER)
  68. public class TakaiAiServiceImpl implements ITakaiAiService {
  69. private static final Logger logger = LoggerFactory.getLogger(TakaiAiServiceImpl.class);
  70. @Autowired
  71. private TakaiDialogMapper takaiDialogMapper;
  72. @Autowired
  73. private TakaiApplicationMapper takaiApplicationMapper;
  74. @Autowired
  75. private TakaiQuestionMapper takaiQuestionMapper;
  76. @Autowired
  77. private TakaiKnowledgeMapper takaiKnowledgeMapper;
  78. @Autowired
  79. private TakaiDocumentMapper takaiDocumentMapper;
  80. @Autowired
  81. private TakaiSysOssConfigMapper takaiSysOssConfigMapper;
  82. @Autowired
  83. private TakaiSysOssMapper takaiSysOssMapper;
  84. @Autowired
  85. private MinioUtil minioUtil;
  86. @Autowired
  87. private TakaiDocumentSettingsMapper takaiDocumentSettingsMapper;
  88. @Autowired
  89. private DeepseekConfig deepseekConfig;
  90. @Autowired
  91. private TakaiAppInfoMapper takaiAppInfoMapper;
  92. @Autowired
  93. private TakaiMediaReplacementMapper takaiMediaReplacementMapper;
  94. @Autowired
  95. private RedisCache redisCache;
  96. @Autowired
  97. public RedisTemplate redisTemplate;
  98. @Autowired
  99. private TakaiSliceInfoMapper takaiSliceInfoMapper;
  100. @Autowired
  101. private DocumentAuditConfigMapper documentAuditConfigMapper;
  102. @Autowired
  103. private DocumentAuditInfoMapper documentAuditInfoMapper;
  104. @Autowired
  105. private SysPermissionService permissionService;
  106. @Autowired
  107. private TypeAppMapper appTypeMapper;
  108. @Autowired
  109. private TakaiAppCollectMapper appCollectMapper;
  110. @Autowired
  111. private SysDictDataMapper sysDictDataMapper;
  112. @Autowired
  113. private SysProjectAppMapper sysProjectAppMapper;
  114. @Autowired
  115. private TakaiFileInfoMapper fileInfoMapper;
  116. @Autowired
  117. private Base64DecodeUtil base64DecodeUtil;
  118. // 注入步骤1配置的线程池
  119. private final ExecutorService analysisFileExecutor;
  120. public static final String START_SIGN = "【";
  121. public static final String END_SIGN = "】";
  122. public static final String SYMBOL = "【示意图序号";
  123. public static final String USER_STR = "user";
  124. public static final String TODAY = "今日";
  125. public static final String BEFOR = "日前";
  126. private final String OSS_URL= "https://minio.jkec.info:9000";
  127. @Autowired
  128. private SysProjectMapper sysProjectMapper;
  129. @Autowired
  130. private ISysUserService userService;
  131. public TakaiAiServiceImpl(ExecutorService analysisFileExecutor) {
  132. this.analysisFileExecutor = analysisFileExecutor;
  133. }
  134. @Override
  135. public void initDeepseekInfo() {
  136. //获取应用列表
  137. // List<TakaiApplication> appList = takaiApplicationMapper.selectApplicationList(null);
  138. setRedisCache(null);
  139. }
  140. private void setRedisCache(String knowledgeId) {
  141. //获取知识库列表
  142. List<TakaiKnowledge> knowledgeList = null;
  143. if (StringUtils.isEmpty(knowledgeId)) {
  144. knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(null);
  145. } else {
  146. knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  147. }
  148. //获取知识列表
  149. if (!knowledgeList.isEmpty()) {
  150. for (TakaiKnowledge bmKnowledge : knowledgeList) {
  151. TakaiDocument conditon = TakaiDocument.builder().knowledgeId(bmKnowledge.getKnowledgeId()).build();
  152. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(conditon);
  153. if (!documentList.isEmpty()) {
  154. for (TakaiDocument bmDocument : documentList) {
  155. //获取知识图片列表
  156. TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(bmDocument.getDocumentId()).build();
  157. List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
  158. if (!imageList.isEmpty()) {
  159. for (TakaiMediaReplacement image : imageList) {
  160. redisCache.setCacheObject(image.getOriginText(), image.getMediaUrl());
  161. }
  162. }
  163. }
  164. }
  165. }
  166. }
  167. }
  168. @Override
  169. public SseEmitter sseInvoke(TakaiSseInfoParams sseParams) {
  170. TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
  171. if (appInfo != null) {
  172. List<String> idList = Arrays.stream(appInfo.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
  173. .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
  174. .collect(Collectors.toList());
  175. TakaiKnowledge knowledgeParam = TakaiKnowledge.builder().knowledgeIds(idList).build();
  176. List<TakaiKnowledge> knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(knowledgeParam);
  177. if (knowledgeList != null && !knowledgeList.isEmpty()) {
  178. SseEmitter sseEmitter = new SseEmitter(0L);
  179. String url = deepseekConfig.getBaseurl() + deepseekConfig.getChat();
  180. TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
  181. JSONObject json = JSONObject.parseObject(info.getAppInfo());
  182. //重新设置knowledgeIds为数组
  183. json.put("knowledgeIds",idList);
  184. String query = null;
  185. decodeMessage(sseParams.getMessages());
  186. decodeMessage(sseParams.getPrompt());
  187. if(sseParams.getMessages() != null && !sseParams.getMessages().isEmpty() ) {
  188. query = sseParams.getMessages().get(sseParams.getMessages().size() - 1).getContent();
  189. } else {
  190. query = sseParams.getPrompt().get(sseParams.getPrompt().size() - 1).getContent();
  191. }
  192. log.info("deepseek聊天请求参数:" + query);
  193. json.put("query", query);
  194. json.put("embeddingId", knowledgeList.get(0).getEmbeddingId());
  195. if(UserConstants.YES.equals(json.getString("isDeepThink"))) {
  196. json.put("enable_think", true);
  197. } else {
  198. json.put("enable_think", false);
  199. }
  200. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  201. Request request = buildPostRequest(url, requestBody);
  202. // 使用EventSourceListener处理来自服务器的SSE事件
  203. EventSourceListener listener = new EventSourceListener() {
  204. private String preData = "";
  205. //图片识别
  206. private String symbolData = "";
  207. @Override
  208. public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
  209. log.info("deepseek Connection opened. Headers: {}", response.headers());
  210. log.info("deepseek Request URL: {}", response.request().url());
  211. }
  212. @Override
  213. public void onClosed(@NotNull EventSource eventSource) {
  214. log.info("deepseek Connection closed.");
  215. sseEmitter.complete();
  216. }
  217. @Override
  218. public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
  219. if (!StringUtils.isEmpty(data)) {
  220. String newData = data.substring(preData.length());
  221. logger.info("deepseek聊天返回消息:" + data);
  222. preData = data;
  223. if (newData.indexOf(START_SIGN) > -1 || symbolData.length() > 0) {
  224. symbolData = symbolData + newData;
  225. //接收到了完整的图片标识
  226. int endSignPos = symbolData.indexOf(END_SIGN);
  227. if (endSignPos > -1) {
  228. JSONObject json = new JSONObject();
  229. json.put("id", id);
  230. json.put("event", "add");
  231. //是图片
  232. if (symbolData.indexOf(SYMBOL) > -1) {
  233. //获取完整Key
  234. int startPos = symbolData.indexOf(START_SIGN);
  235. int endPos = symbolData.indexOf(END_SIGN) + 1;
  236. String key = symbolData.substring(startPos, endPos);
  237. String url = redisCache.getCacheObject(key);
  238. if (org.springframework.util.StringUtils.hasText(url)) {
  239. if(url.contains("https://10.1.28.14:9000")){
  240. //url = url.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
  241. url = url.replace("https://10.1.28.14:9000", OSS_URL);
  242. }
  243. //匹配markdown图片格式
  244. // symbolData = symbolData.replace(key, "![](" + url + ")");
  245. } else {
  246. logger.error("图片标识符"+key+"没有获取到对应的URL{}: " + symbolData);
  247. }
  248. //检查是否当前token包含其他图片的开始符号”【“
  249. int lastPos = symbolData.lastIndexOf(START_SIGN);
  250. if(lastPos > endSignPos){
  251. // 从'【' 开始截取
  252. newData = symbolData.substring(0, lastPos);
  253. symbolData = symbolData.substring(lastPos);
  254. logger.info("截取结果{}: " + symbolData);
  255. } else {
  256. newData = symbolData;
  257. symbolData = "";
  258. }
  259. if(!StringUtils.isEmpty(url)) {
  260. newData = newData.replace(key, " ![](" + url + ")");
  261. }
  262. } else {
  263. newData = symbolData;
  264. symbolData = "";
  265. }
  266. json.put("data", newData);
  267. log.info("获取到图片替换结束符号,返回前端信息:" + json);
  268. send(sseEmitter, json);
  269. //如果超过长度200还没收到】符号,直接返回。
  270. } else if (symbolData.length() > 200) {
  271. JSONObject json = new JSONObject();
  272. json.put("id", id);
  273. json.put("event", "add");
  274. json.put("data", symbolData);
  275. }
  276. } else {
  277. JSONObject json = new JSONObject();
  278. json.put("id", id);
  279. json.put("event", type);
  280. json.put("data", newData);
  281. log.info("deepseek返回信息:" + json);
  282. send(sseEmitter, json);
  283. }
  284. }
  285. if (com.takai.common.utils.StringUtils.isNotEmpty(type) && "finish".equals(type)) {
  286. log.info("deepseek聊天结束");
  287. JSONObject json = new JSONObject();
  288. json.put("id", id);
  289. json.put("event", type);
  290. json.put("data", data);
  291. log.info("deepseek返回信息:" + json);
  292. send(sseEmitter, json);
  293. }
  294. }
  295. @Override
  296. public void onFailure(@NotNull EventSource eventSource, Throwable t, Response response) {
  297. if (response != null) {
  298. log.error("deepseek Connection failed. Response code: {}, message: {}, body: {}",
  299. response.code(), response.message(), response.body() != null ? response.body().toString() : "null");
  300. } else {
  301. log.error("deepseek Connection failed with no response", t);
  302. }
  303. sseEmitter.completeWithError(t);
  304. }
  305. private void send(SseEmitter sseEmitter, Object obj) {
  306. try {
  307. sseEmitter.send(obj);
  308. } catch (IOException e) {
  309. log.error("deepseek 推送数据失败", e);
  310. }
  311. }
  312. };
  313. OkHttpClient client = buildOkHttpClient();
  314. EventSource.Factory factory = EventSources.createFactory(client);
  315. final EventSource eventSources = factory.newEventSource(request, listener);
  316. // 客户端主动关闭连接
  317. sseEmitter.onCompletion(() -> {
  318. logger.info("deepseek客户端主动关闭连接 -- SSE 连接关闭");
  319. });
  320. // 超时回调
  321. sseEmitter.onTimeout(() -> {
  322. logger.info("deepseek客户端连接超时 -- SSE 连接关闭");
  323. if(eventSources != null) {
  324. logger.info("deepseek超时回调 -- 成功关闭SSE连接 ");
  325. eventSources.cancel();
  326. }
  327. });
  328. // 错误回调
  329. sseEmitter.onError(e -> {
  330. logger.info("deepseek客户端回调失败 -- SSE 连接关闭");
  331. if(eventSources != null) {
  332. logger.info("deepseek错误回调 -- 成功关闭SSE连接 ");
  333. eventSources.cancel();
  334. }
  335. });
  336. return sseEmitter;
  337. }
  338. }
  339. return null;
  340. }
  341. @Override
  342. public String syncInvoke(TakaiSseInfoParams sseParams) {
  343. TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
  344. if (appInfo != null) {
  345. List<String> idList = Arrays.stream(appInfo.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
  346. .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
  347. .collect(Collectors.toList());
  348. TakaiKnowledge knowledgeParam = TakaiKnowledge.builder().knowledgeIds(idList).build();
  349. List<TakaiKnowledge> knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(knowledgeParam);
  350. if (knowledgeList != null && !knowledgeList.isEmpty()) {
  351. SseEmitter sseEmitter = new SseEmitter(0L);
  352. String url = deepseekConfig.getPictureCheckUrl();
  353. TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
  354. JSONObject json = JSONObject.parseObject(info.getAppInfo());
  355. //重新设置knowledgeIds为数组
  356. json.put("knowledgeIds",idList);
  357. String query = null;
  358. // decodeMessage(sseParams.getMessages());
  359. // decodeMessage(sseParams.getPrompt());
  360. if(sseParams.getMessages() != null && !sseParams.getMessages().isEmpty() ) {
  361. query = sseParams.getMessages().get(sseParams.getMessages().size() - 1).getContent();
  362. } else {
  363. return null;
  364. }
  365. log.info("图片检测结果聊天请求参数:" + query);
  366. json.put("query", query);
  367. json.put("embeddingId", knowledgeList.get(0).getEmbeddingId());
  368. if(UserConstants.YES.equals(json.getString("isDeepThink"))) {
  369. json.put("enable_think", true);
  370. } else {
  371. json.put("enable_think", false);
  372. }
  373. // RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  374. // Request request = buildPostRequest(url, requestBody);
  375. OkHttpClient client = buildOkHttpClient();
  376. Request request = createOkHttpRequest(url,json);
  377. Response response = null;
  378. try {
  379. response = client.newCall(request).execute();
  380. //{"code":200,"data":
  381. // {"answer":"你好!欢迎来到企业级知识库问答系统。我可以根据您提供的知识片段为您进行归纳总结并生成对话式回答。请您提出具体问题,以便我为您提供准确的信息。","
  382. // chat_id":"chatcmpl-c5fedbec954a4966a92c5c01857987a7"}
  383. // }
  384. if (response.isSuccessful()) {
  385. String body = response.body().string();
  386. JSONObject obj = JSON.parseObject(body);
  387. Integer code = obj.getInteger("code");
  388. if (code == 200) {
  389. logger.info("图片检测结果调用python接口成功,返回内容:{}", body);
  390. return obj.getJSONObject("data").getString("answer");
  391. } else {
  392. logger.info("图片检测结果调用python接口失败,返回内容:{}", body);
  393. return null;
  394. }
  395. } else {
  396. logger.error("图片检测结果调用python接口失败返回code:{}", response.code());
  397. return null;
  398. }
  399. } catch (IOException e) {
  400. logger.error("上传文档调用python接口失败", e.getMessage());
  401. return null;
  402. }
  403. }
  404. }
  405. return null;
  406. }
  407. private Request createOkHttpRequest(String url, JSONObject requestJson) {
  408. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), requestJson.toJSONString());
  409. return buildPostRequest(url, requestBody);
  410. }
  411. @Override
  412. public boolean reportToApp(ProjectDetectionParam requestBody, String reportStr) {
  413. JSONObject requestJson = getRequestJson(requestBody, reportStr);
  414. OkHttpClient client = buildOkHttpClient();
  415. Request request = createOkHttpRequest(deepseekConfig.getPictureAppUrl(),requestJson);
  416. Response response = null;
  417. try {
  418. response = client.newCall(request).execute();
  419. if (response.isSuccessful()) {
  420. String body = response.body().string();
  421. JSONObject obj = JSON.parseObject(body);
  422. Integer code = obj.getInteger("code");
  423. if (code == 200) {
  424. logger.info("图片检测结果调用App接口成功,返回内容:{}", body);
  425. return true;
  426. } else {
  427. logger.info("图片检测结果调用App接口失败,返回内容:{}", body);
  428. }
  429. } else {
  430. logger.error("图片检测结果调用App接口失败返回code:{}", response.code());
  431. }
  432. } catch (IOException e) {
  433. logger.error("上传文档调用App接口失败", e.getMessage());
  434. }
  435. return false;
  436. }
  437. private JSONObject getRequestJson(ProjectDetectionParam requestBody, String reportStr) {
  438. // ============ 1. 定义所有字段的【动态变量值】,可以从接口/数据库/配置文件等任意地方取值 ============
  439. // client子对象的动态值
  440. String clientId = deepseekConfig.getPictureAppclientId();
  441. long timestamp = new Date().getTime(); // 时间戳建议用long类型
  442. // 一级对象的动态值
  443. String deviceId = requestBody.getDeviceId();
  444. String projectId = requestBody.getProjectId();
  445. String phaseId = requestBody.getPhaseId();
  446. String type = requestBody.getType();
  447. String time = requestBody.getTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  448. String resImageId = requestBody.getResImageId();
  449. //签名
  450. String dataInput = clientId+timestamp+type+resImageId;
  451. String signature = DigestUtil.sha256Hex(dataInput.toUpperCase()+deepseekConfig.getPictureAppSecretKey());
  452. // ============ 2. 动态构建嵌套的client子JSON对象 ============
  453. JSONObject clientJson = new JSONObject();
  454. clientJson.put("clientId", clientId); // 动态赋值
  455. clientJson.put("timestamp", timestamp); // 动态赋值
  456. clientJson.put("signature", signature); // 动态赋值
  457. // ============ 3. 动态构建最外层的主JSON对象 ============
  458. JSONObject mainJson = new JSONObject();
  459. mainJson.put("client", clientJson); // 放入嵌套的子对象
  460. mainJson.put("deviceId", deviceId);
  461. mainJson.put("projectId", projectId);
  462. mainJson.put("phaseId", phaseId);
  463. mainJson.put("type", type);
  464. mainJson.put("time", time);
  465. mainJson.put("resImageId", resImageId);
  466. mainJson.put("ragRes", reportStr);
  467. return mainJson;
  468. }
  469. private void decodeMessage(List<TakaiPromptInfo> messages) {
  470. if(messages == null || messages.isEmpty()) {
  471. return;
  472. }
  473. for (TakaiPromptInfo message : messages) {
  474. message.setContent(base64DecodeUtil.decodeIfNeeded(message.getContent()));
  475. }
  476. }
  477. @Override
  478. public List<String> asyncCompletions(TakaiCompletionsParams params) {
  479. List<String> list = new ArrayList<>();
  480. TakaiApplication vo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(params.getAppId()).build());
  481. if (vo != null) {
  482. TakaiPromptInfo info = new TakaiPromptInfo();
  483. info.setContent(deepseekConfig.getPrompt());
  484. info.setRole("user");
  485. decodeMessage(params.getMessages());
  486. params.getMessages().add(info);
  487. JSONObject jsonObject = new JSONObject();
  488. jsonObject.put("model", vo.getModel());
  489. jsonObject.put("messages", params.getMessages());
  490. jsonObject.put("chat_id", params.getChat_id());
  491. JSONObject result = getasyncCompletions(jsonObject);
  492. if (result != null && result.getInteger("code") == 200) {
  493. JSONArray array = result.getJSONArray("data");
  494. if(array != null){
  495. list.addAll(array.toJavaList(String.class));
  496. }
  497. }
  498. }
  499. return list;
  500. }
  501. private JSONObject getasyncCompletions(JSONObject jsonObject) {
  502. String url = deepseekConfig.getBaseurl() + deepseekConfig.getAsyncCompletions();
  503. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  504. Request request = buildPostRequest(url, requestBody);
  505. OkHttpClient client = buildOkHttpClient();
  506. try {
  507. Response response = client.newCall(request).execute();
  508. if (response.isSuccessful()) {
  509. String body = response.body().string();
  510. if (isJsonObject(body)) {
  511. return JSON.parseObject(body);
  512. }
  513. }
  514. } catch (IOException e) {
  515. log.info("deepseek Request URL: {}", e.getMessage());
  516. }
  517. return null;
  518. }
  519. @Override
  520. public List<TakaiDialogRespDTO> getDialogDetail(String dialogId) {
  521. List<TakaiDialogRespDTO> detail = takaiDialogMapper.selectDialogDetail(dialogId);
  522. if(detail != null && detail.size() != 0){
  523. for(TakaiDialogRespDTO dto : detail){
  524. if(StringUtils.isNotEmpty(dto.getSliceJson())){
  525. dto.setSliceInfo(JSON.parseObject(dto.getSliceJson(), TakaiSliceInfoDTO.class));
  526. }
  527. if("user".equals(dto.getType())){
  528. List<TakaiFileInfo> fileInfoList = fileInfoMapper.getFileInfoById(null, dto.getDialog_id(), dto.getDid());
  529. if(fileInfoList != null && !fileInfoList.isEmpty()){
  530. List<TakaiDocumentDTO> documentDTOS = new ArrayList<>();
  531. for(TakaiFileInfo fileInfo : fileInfoList){
  532. TakaiDocumentDTO documentDTO = new TakaiDocumentDTO();
  533. BeanUtils.copyProperties(fileInfo, documentDTO);
  534. documentDTOS.add(documentDTO);
  535. }
  536. dto.setDocuments(documentDTOS);
  537. }
  538. }
  539. }
  540. }
  541. return detail;
  542. }
  543. @Override
  544. public void saveDialog(TakaiDialogReqDTO dialogReqDTO) {
  545. String dialogId = null;
  546. TakaiDialogRespDTO dialogVo = null;
  547. if (com.takai.common.utils.StringUtils.isNotEmpty(dialogReqDTO.getId())) {
  548. dialogVo = takaiDialogMapper.selectDialogById(dialogReqDTO.getId());
  549. }
  550. if (dialogVo == null) {
  551. takaiDialogMapper.insertDialog(dialogReqDTO);
  552. dialogId = dialogReqDTO.getId();
  553. } else {
  554. dialogId = dialogReqDTO.getId();
  555. }
  556. for (TakaiDialogDetailReqDTO dto : dialogReqDTO.getMessages()) {
  557. dto.setDialogId(dialogId);
  558. dto.setContent(base64DecodeUtil.decodeIfNeeded(dto.getContent()));
  559. TakaiDialogRespDTO detail = takaiDialogMapper.selectDialogDetailById(dto.getId());
  560. if (detail == null) {
  561. if (dto.getSliceInfo() != null) dto.setSliceJson(JSON.toJSONString(dto.getSliceInfo()));
  562. takaiDialogMapper.insertDialogDetail(dto);
  563. }
  564. if(dto.getDocuments() != null && !dto.getDocuments().isEmpty()){
  565. for(TakaiDocumentDTO documentVo : dto.getDocuments()){
  566. if(!"".equals(documentVo.getId())) {
  567. List<TakaiFileInfo> fileInfo = fileInfoMapper.getFileInfoById(documentVo.getId(), null, null);
  568. if((fileInfo == null || fileInfo.isEmpty()) && "user".equals(dto.getRole())) {
  569. TakaiFileInfo params = new TakaiFileInfo();
  570. params.setId(documentVo.getId());
  571. params.setName(documentVo.getName());
  572. params.setUrl(documentVo.getUrl());
  573. params.setDialogId(dialogId);
  574. params.setDialogDid(dto.getId());
  575. fileInfoMapper.insertFileInfo(params);
  576. }
  577. }
  578. }
  579. }
  580. }
  581. }
  582. @Override
  583. public List<Object> getDialogList(String appId, String userId) {
  584. List<TakaiDialogRespDTO> dialogRespDTOS = takaiDialogMapper.selectDialogList(appId, userId);
  585. //当前日期
  586. LocalDate today = LocalDate.now();
  587. //根据时间分组降序排序
  588. NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = dialogRespDTOS.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
  589. List<Object> obj = new ArrayList();
  590. if (!groupList.isEmpty()) {
  591. for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
  592. // 对比两个时间相差多少天
  593. long daysBetween = ChronoUnit.DAYS.between(today, entry.getKey());
  594. Map<String, Object> m = new HashMap();
  595. m.put("key", System.nanoTime());
  596. m.put("type", "group");
  597. if (daysBetween == 0l) {
  598. m.put("label", TODAY);
  599. m.put("children", setValue(entry.getValue(), appId));
  600. obj.add(m);
  601. } else {
  602. m.put("label", -daysBetween + BEFOR);
  603. m.put("children", setValue(entry.getValue(), appId));
  604. obj.add(m);
  605. }
  606. }
  607. }
  608. return obj;
  609. }
  610. @Override
  611. public void DelDialogDetail(String id) {
  612. int result = takaiDialogMapper.delDialog(id);
  613. if (result > 0) {
  614. takaiDialogMapper.delDialogDetail(id);
  615. }
  616. }
  617. @Override
  618. public void updateDialog(TakaiDialogReqDTO dialogReqDTO) {
  619. takaiDialogMapper.updateDialog(dialogReqDTO);
  620. }
  621. @Override
  622. public List<TakaiDialogRespDTO> exportExcel(String dialogId) {
  623. return takaiDialogMapper.selectDialogExport(dialogId);
  624. }
  625. @Override
  626. public int createKnowledge(TakaiKnowledgeParams knowledge) {
  627. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  628. long knowledgeId = snowflakeDigitGenerator.nextId();
  629. String url = deepseekConfig.getBaseurl() + deepseekConfig.getCreateKnowledge();
  630. JSONObject jsonObject = new JSONObject();
  631. jsonObject.put("knowledge_id", "a" + knowledgeId);
  632. jsonObject.put("embedding_id", knowledge.getEmbeddingId());
  633. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  634. Request request = buildPostRequest(url, requestBody);
  635. OkHttpClient client = buildOkHttpClient();
  636. String createdBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
  637. try {
  638. Response response = client.newCall(request).execute();
  639. if (response.isSuccessful()) {
  640. String body = response.body().string();
  641. JSONObject obj = JSON.parseObject(body);
  642. Integer code = obj.getInteger("code");
  643. if (code == 200) {
  644. TakaiKnowledge params = TakaiKnowledge.builder()
  645. .knowledgeId("a" + knowledgeId)
  646. .name(knowledge.getName())
  647. .embeddingId(knowledge.getEmbeddingId())
  648. .description(knowledge.getDescription())
  649. .visible(knowledge.getVisible())
  650. .build();
  651. params.setCreateBy(createdBy);
  652. return takaiKnowledgeMapper.insertKnowledge(params);
  653. }
  654. } else {
  655. logger.error("创建知识库调用python接口失败,返回状态码:{}", response.code());
  656. }
  657. } catch (IOException e) {
  658. logger.error("创建知识库调用python接口失败", e.getMessage());
  659. }
  660. return 0;
  661. }
  662. @Override
  663. public int updateKnowledge(TakaiKnowledgeParams knowledge, String knowledgeId) {
  664. TakaiKnowledge params = TakaiKnowledge.builder().knowledgeId(knowledgeId)
  665. .name(knowledge.getName())
  666. .description(knowledge.getDescription())
  667. .embeddingId(knowledge.getEmbeddingId())
  668. .visible(knowledge.getVisible())
  669. .build();
  670. String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
  671. params.setUpdateBy(updateBy);
  672. params.setUpdateTime(new Date());
  673. return takaiKnowledgeMapper.updateKnowledge(params);
  674. }
  675. @Override
  676. public TakaiKnowledge detailKnowledge(String knowledgeId) {
  677. TakaiKnowledge vo = TakaiKnowledge.builder().knowledgeId(knowledgeId).build();
  678. return takaiKnowledgeMapper.selectTargetKnowledge(vo);
  679. }
  680. @Override
  681. public int delKnowledge(String knowledgeId) {
  682. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteKnowledge() + "/" + knowledgeId;
  683. Request request = buildDeleteRequest(url);
  684. OkHttpClient client = buildOkHttpClient();
  685. Response response = null;
  686. try {
  687. response = client.newCall(request).execute();
  688. if (response.isSuccessful()) {
  689. String body = response.body().string();
  690. JSONObject obj = JSON.parseObject(body);
  691. Integer code = obj.getInteger("code");
  692. if (code == 200) {
  693. // TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  694. List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().knowledgeId(knowledgeId).build());
  695. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
  696. int knowledgeInt = takaiKnowledgeMapper.delKnowledge(knowledgeId);
  697. if (knowledgeInt > 0) {
  698. takaiDocumentMapper.delDocumentByKnowledgeId(knowledgeId);
  699. takaiDocumentSettingsMapper.deleteDocumentSettingsByKnowledgeId(knowledgeId);
  700. if(list != null && list.size() > 0){
  701. try {
  702. for(TakaiDocument document: documentList){
  703. logger.info("删除知识库->删除minio文件");
  704. minioUtil.remove("deepseek-doc", "/"+document.getName());
  705. }
  706. for (int k = 0; k < list.size(); k++ ) {
  707. logger.info("删除知识库->删除minio图片{}", k);
  708. String key = "/pdf/"+knowledgeId+"/"+list.get(k).getDocumentId()+"/【示意图序号_"+list.get(k).getDocumentId()+"_"+k+1+"】.jpg";
  709. logger.info("删除知识库->删除minio图片key{}", key);
  710. minioUtil.remove("deepseek-doc" , key);
  711. }
  712. } catch (Exception e) {
  713. logger.error("删除知识库->删除minion文件失败", e.getMessage());
  714. throw new RuntimeException(e);
  715. }
  716. }
  717. }
  718. return knowledgeInt;
  719. }
  720. }
  721. } catch (IOException e) {
  722. logger.error("删除知识库调用python接口失败", e.getMessage());
  723. }
  724. return 0;
  725. }
  726. /**
  727. * 异步上传文档,analysisFile最大并发5个
  728. * @return 成功处理的文件数量
  729. */
  730. @Override
  731. public CompletableFuture<Integer> uploadDocument(MultipartFile[] files, String knowledgeId,List<TakaiSysOss> ossList,String updateBy) {
  732. // 2. 循环处理每个文件
  733. List<TakaiDocument> takaiDocuments = new ArrayList<>();
  734. for (int i = 0; i < ossList.size(); i++) {
  735. TakaiSysOss oss = ossList.get(i);
  736. // 生成文档ID
  737. SnowflakeDigitGenerator documentIdGenerator = new SnowflakeDigitGenerator(i, i);
  738. long documentId = documentIdGenerator.nextId();
  739. String docId = "a" + documentId;
  740. // 构建上传参数
  741. UploadDocumentParams param = new UploadDocumentParams();
  742. param.setDocument_id(docId);
  743. param.setName(oss.getOriginalName());
  744. param.setUrl(oss.getUrl());
  745. List<UploadDocumentParams> params = new ArrayList<>();
  746. params.add(param);
  747. // 3. 同步保存OSS到数据库
  748. takaiSysOssMapper.insertSysOss(oss);
  749. // 4. 保存文档信息到数据库
  750. TakaiDocument document = TakaiDocument.builder()
  751. .documentId(docId)
  752. .knowledgeId(knowledgeId)
  753. .customSeparator(String.format("[\"%s\"", "\\n") + "]")
  754. .sentenceSize("300")
  755. .name(oss.getOriginalName())
  756. .url(oss.getUrl())
  757. .status("0")
  758. .build();
  759. document.setCreateBy(updateBy);
  760. int insertResult = takaiDocumentMapper.insertDocument(document);
  761. takaiDocuments.add(document);
  762. // 5. 保存文档设置
  763. if (insertResult > 0) {
  764. SnowflakeDigitGenerator settingsIdGenerator = new SnowflakeDigitGenerator(1, 1);
  765. long settingsId = settingsIdGenerator.nextId();
  766. TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
  767. dSettings.setId(String.valueOf(settingsId));
  768. dSettings.setKnowledgeId(knowledgeId);
  769. dSettings.setDocumentId(docId);
  770. dSettings.setSetSlice("0"); // 默认 按标题段落切片
  771. dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
  772. dSettings.setSetTable("0"); // 默认 table转图片
  773. takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
  774. }
  775. }
  776. // 整体逻辑异步执行(默认使用ForkJoinPool,也可指定自定义线程池)
  777. return CompletableFuture.supplyAsync(() -> {
  778. // 记录成功处理的文件数
  779. AtomicInteger successCount = new AtomicInteger(0);
  780. // 收集analysisFile的异步任务,用于等待全部完成
  781. List<CompletableFuture<Void>> analysisTasks = new ArrayList<>();
  782. // 2. 循环处理每个文件
  783. for (int i = 0; i < takaiDocuments.size(); i++) {
  784. TakaiDocument document = takaiDocuments.get(i);
  785. try {
  786. // 构建上传参数
  787. UploadDocumentParams param = new UploadDocumentParams();
  788. param.setDocument_id(document.getDocumentId());
  789. param.setName(document.getName());
  790. param.setUrl(document.getUrl());
  791. List<UploadDocumentParams> params = new ArrayList<>();
  792. params.add(param);
  793. // 6. 异步调用analysisFile(限制5个并发)
  794. TakaiDocumentSettings settings = new TakaiDocumentSettings();
  795. settings.setKnowledgeId(knowledgeId);
  796. settings.setCreateBy(updateBy);
  797. // 注意:捕获循环变量,避免闭包陷阱
  798. List<UploadDocumentParams> finalParams = new ArrayList<>(params);
  799. CompletableFuture<Void> analysisTask = CompletableFuture.runAsync(() -> {
  800. try {
  801. // 执行文件解析逻辑
  802. analysisFile(finalParams, settings, "upload");
  803. } catch (Exception e) {
  804. log.error("文件解析失败:{}", e);
  805. }
  806. }, analysisFileExecutor); // 使用5线程池执行
  807. // 添加到任务列表
  808. analysisTasks.add(analysisTask);
  809. successCount.incrementAndGet();
  810. } catch (Exception e) {
  811. log.error("处理文件失败:{}", e);
  812. // 单个文件失败不影响其他文件,继续处理
  813. continue;
  814. }
  815. }
  816. // 7. 等待所有analysisFile异步任务完成(不阻塞主线程,仅等待任务结束)
  817. try {
  818. CompletableFuture.allOf(analysisTasks.toArray(new CompletableFuture[0])).join();
  819. log.info("所有文件解析任务已完成,成功处理文件数:{}", successCount.get());
  820. } catch (Exception e) {
  821. log.error("等待解析任务完成失败", e);
  822. }
  823. // 返回成功处理的文件数
  824. return successCount.get();
  825. });
  826. }
  827. @Override
  828. public void updateDocumentByPython(JkDocumentPythonParams parms) {
  829. TakaiDocument document = TakaiDocument.builder()
  830. .documentId(parms.getDocumentId())
  831. .knowledgeId(parms.getKnowledgeId())
  832. .status(parms.getStatus())
  833. .sliceTotal(parms.getSliceTotal())
  834. .length(parms.getLength())
  835. .wordNum(parms.getWordNum())
  836. .build();
  837. takaiDocumentMapper.updateDocument(document);
  838. updateKnowledgeSize(parms.getKnowledgeId());
  839. setRedisCache(parms.getKnowledgeId());
  840. }
  841. private void updateKnowledgeSize(String knowledgeId) {
  842. TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
  843. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
  844. int totalLen = documentList.stream()
  845. .mapToInt(doc -> doc.getLength() != null ? doc.getLength() : 0)
  846. .sum();
  847. int totalWordNum = documentList.stream()
  848. .mapToInt(doc -> doc.getWordNum() != null ? doc.getWordNum() : 0)
  849. .sum();
  850. int docSize = documentList == null || documentList.size() == 0 ? 0 : documentList.size();
  851. String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
  852. TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(knowledgeId)
  853. .length(totalLen) // 文件大小
  854. .wordNum(totalWordNum) // 总字符数
  855. .documentSize(docSize) // 文件总数
  856. .build();
  857. paramInfo.setUpdateBy(updateBy);
  858. paramInfo.setUpdateTime(new Date());
  859. takaiKnowledgeMapper.updateKnowledge(paramInfo);
  860. }
  861. private void updateDocumentSize(String knowledgeId,String documentId) {
  862. List<TakaiSliceInfo> sliceList = selectByDocumentId(documentId,null);
  863. //字符数
  864. int totalLen = sliceList.stream()
  865. .mapToInt(slice -> slice.getSliceText() != null ? slice.getSliceText().length() : 0)
  866. .sum();
  867. //文件大小
  868. int totalSize = sliceList.stream()
  869. .mapToInt(slice -> slice.getSliceText() != null ? slice.getSliceText().getBytes(StandardCharsets.UTF_8).length : 0)
  870. .sum();
  871. TakaiDocument doc = TakaiDocument.builder()
  872. .documentId(documentId)
  873. .length(totalSize)
  874. .wordNum(totalLen)
  875. .sliceTotal(sliceList.size())
  876. .build();
  877. String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
  878. doc.setUpdateBy(updateBy);
  879. doc.setUpdateTime(new Date());
  880. takaiDocumentMapper.updateDocument(doc);
  881. updateKnowledgeSize(knowledgeId);
  882. }
  883. @Override
  884. public int updateDocument(TakaiDocumentParams documentParams, String documentId) {
  885. int i = takaiDocumentMapper.updateDocument(TakaiDocument.builder()
  886. .documentId(documentId)
  887. .name(documentParams.getName())
  888. .build());
  889. return i;
  890. }
  891. @Override
  892. public List<TakaiDocument> documentList(TakaiDocumentParams documentParams) {
  893. List<String> statusList = new ArrayList<>();
  894. if(null != documentParams.getStatus()) {
  895. statusList.add(documentParams.getStatus());
  896. if(documentParams.getStatus().equals("0")) {
  897. statusList.add("2");
  898. }
  899. }
  900. List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(documentParams.getKnowledge_id()).status(documentParams.getStatus()).build());
  901. replaceOssUrl(documentList);
  902. return documentList;
  903. }
  904. private void replaceOssUrl(List<TakaiDocument> documentList) {
  905. if(documentList == null || documentList.isEmpty()) {
  906. return;
  907. }
  908. for(TakaiDocument document : documentList) {
  909. replaceDocUrl(document);
  910. }
  911. }
  912. private void replaceDocUrl(TakaiDocument document) {
  913. if(document == null) {
  914. return;
  915. }
  916. String url = document.getUrl();
  917. url = url.replace("https://10.1.28.14:9000", OSS_URL);
  918. document.setUrl(url);
  919. }
  920. @Override
  921. public TakaiDocument documentDetail(String documentId) {
  922. TakaiDocument doc = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  923. replaceDocUrl(doc);
  924. return doc;
  925. }
  926. @Override
  927. public int delDocument(String documentId) {
  928. TakaiDocument vo = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  929. if(vo != null){
  930. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteDoc() + "/" + documentId + "/" + vo.getKnowledgeId();
  931. Request request = buildDeleteRequest(url);
  932. OkHttpClient client = buildOkHttpClient();
  933. try {
  934. Response response = client.newCall(request).execute();
  935. if (response.isSuccessful()) {
  936. String body = response.body().string();
  937. logger.info("删除知识文件调用python接口返回结果:{}", body);
  938. JSONObject obj = JSON.parseObject(body);
  939. Integer code = obj.getInteger("code");
  940. if (code == 200) {
  941. List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().documentId(documentId).build());
  942. // 删除图片
  943. takaiMediaReplacementMapper.deleteMedia(documentId);
  944. // 删除document文件
  945. int i = takaiDocumentMapper.delDocument(documentId);
  946. if(i > 0){
  947. //更新知识库
  948. updateKnowledgeSize(vo.getKnowledgeId());
  949. // 删除minio文件
  950. try {
  951. logger.info("删除minio文件");
  952. minioUtil.remove("deepseek-doc", "/"+vo.getName());
  953. if(list != null && list.size() > 0){
  954. for (int k=1; k<=list.size(); k++ ) {
  955. logger.info("删除minio图片{}", k);
  956. minioUtil.remove("deepseek-doc" , "/pdf/"+vo.getKnowledgeId()+"/"+documentId+"/【示意图序号_"+documentId+"_"+k+"】.jpg");
  957. }
  958. }
  959. } catch (Exception e) {
  960. logger.error("删除minion文件失败", e.getMessage());
  961. throw new RuntimeException(e);
  962. }
  963. return i;
  964. }
  965. }
  966. }
  967. } catch (IOException e) {
  968. logger.error("删除知识文件调用python接口失败", e.getMessage());
  969. }
  970. }
  971. return 0;
  972. }
  973. @Override
  974. public int delUnfinishedDocument(String documentId) {
  975. TakaiDocument vo = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  976. if(vo != null){
  977. String url = deepseekConfig.getBaseurl() + deepseekConfig.getCancelTask() + "/" + documentId ;
  978. JSONObject json = new JSONObject();
  979. //重新设置knowledgeIds为数组
  980. json.put("documentId",documentId);
  981. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  982. Request request = buildPostRequest(url,requestBody);
  983. OkHttpClient client = buildOkHttpClient();
  984. try {
  985. Response response = client.newCall(request).execute();
  986. if (response.isSuccessful()) {
  987. String body = response.body().string();
  988. logger.info("删除知识文件调用python接口返回结果:{}", body);
  989. JSONObject obj = JSON.parseObject(body);
  990. Integer code = obj.getInteger("code");
  991. if (code == 200) {
  992. List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().documentId(documentId).build());
  993. // 删除图片
  994. takaiMediaReplacementMapper.deleteMedia(documentId);
  995. // 删除document文件
  996. int i = takaiDocumentMapper.delDocument(documentId);
  997. if(i > 0){
  998. //更新知识库
  999. updateKnowledgeSize(vo.getKnowledgeId());
  1000. // 删除minio文件
  1001. try {
  1002. logger.info("删除minio文件");
  1003. minioUtil.remove("deepseek-doc", "/"+vo.getName());
  1004. if(list != null && list.size() > 0){
  1005. for (int k=1; k<=list.size(); k++ ) {
  1006. logger.info("删除minio图片{}", k);
  1007. minioUtil.remove("deepseek-doc" , "/pdf/"+vo.getKnowledgeId()+"/"+documentId+"/【示意图序号_"+documentId+"_"+k+"】.jpg");
  1008. }
  1009. }
  1010. } catch (Exception e) {
  1011. logger.error("删除minion文件失败", e.getMessage());
  1012. throw new RuntimeException(e);
  1013. }
  1014. return i;
  1015. }
  1016. }
  1017. }
  1018. } catch (IOException e) {
  1019. logger.error("删除知识文件调用python接口失败", e.getMessage());
  1020. }
  1021. }
  1022. return 0;
  1023. }
  1024. @Override
  1025. public void uploadUrl(TakaiDocumentObject object) {
  1026. }
  1027. @Override
  1028. public int createApplication(TakaiApplicationParams params, boolean isAdmin) {
  1029. ApprovalNode vo = getFirstApproverNode(); // 获取第一个审批对象
  1030. if(vo != null){
  1031. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  1032. long appId = snowflakeDigitGenerator.nextId();
  1033. TakaiApplication info = TakaiApplication.builder().appId(String.valueOf(appId))
  1034. .name(params.getName())
  1035. .desc(params.getDesc())
  1036. .model(params.getModel())
  1037. .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
  1038. .topP(params.getTop_p())
  1039. .temperature(params.getTemperature())
  1040. .maxToken(params.getMax_token())
  1041. .prompt(base64DecodeUtil.decodeIfNeeded(params.getPrompt()))
  1042. .knowledgeInfo(params.getKnowledge_info())
  1043. .sliceCount(params.getSlice_count())
  1044. .typeId(params.getTypeId())
  1045. .visible(params.getVisible())
  1046. .isDeepThink(params.getIsDeepThink())
  1047. .sort(params.getSort())
  1048. .build();
  1049. //关联项目
  1050. if(params.getAppProId() != null){
  1051. SysProjectApp sysProjectApp = new SysProjectApp();
  1052. sysProjectApp.setProjectId(params.getAppProId());
  1053. sysProjectApp.setAppId(info.getAppId());
  1054. sysProjectAppMapper.insertSysProjectApp(sysProjectApp);
  1055. }
  1056. //管理员,私有,项目级应用不需要审核
  1057. if(isAdmin
  1058. || "1".equals(params.getVisible())
  1059. || AppTypeEnum.PROJECT.getCode().equals(String.valueOf(params.getTypeId()))){ // 1 私有 0 公开
  1060. info.setStatus("3"); // 有直接创建权限无需审核
  1061. }else{
  1062. info.setStatus("2"); // 未开始审核状态
  1063. info.setApprover(String.valueOf(vo.getApprover()));
  1064. info.setNodeOrder(String.valueOf(vo.getNodeOrder()));
  1065. }
  1066. info.setCreateBy(params.getUserId());
  1067. int i = takaiApplicationMapper.insertApplication(info);
  1068. if (i > 0) {
  1069. //添加VIP用户
  1070. if(params.getVipList() != null && params.getVipList().size() > 0){
  1071. for(SysUser sysUser : params.getVipList()){
  1072. VipApplication vipApplication =
  1073. VipApplication.builder()
  1074. .appId(info.getAppId())
  1075. .userId(sysUser.getUserId())
  1076. .build();
  1077. takaiApplicationMapper.insertVipApp(vipApplication);
  1078. }
  1079. }
  1080. TypeApp appType = new TypeApp();
  1081. appType.setTypeId(params.getTypeId() == null ? null : params.getTypeId());
  1082. appType.setAppId(String.valueOf(appId));
  1083. appTypeMapper.insertAppType(appType);
  1084. logger.info("create application success, id:{}, name:{}", appId, params.getName());
  1085. TakaiAppInfo appInfo = new TakaiAppInfo();
  1086. appInfo.setAppId(String.valueOf(appId));
  1087. appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
  1088. takaiAppInfoMapper.insertAppInfo(appInfo);
  1089. List<String> list = params.getQuestionList();
  1090. if (!list.isEmpty() && list.size() > 0) {
  1091. for (String str : list) {
  1092. if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
  1093. String uuid = IdUtils.simpleUUID();
  1094. TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
  1095. takaiQuestionMapper.insertQuestion(question);
  1096. }
  1097. }
  1098. }
  1099. return i;
  1100. }
  1101. }else{
  1102. // 没有审批人
  1103. return 9;
  1104. }
  1105. return 0;
  1106. }
  1107. @Override
  1108. public int updateApplication(TakaiApplicationParams params, String appId, boolean isAdmin) {
  1109. ApprovalNode vo = getFirstApproverNode(); // 获取第一个审批对象
  1110. if(vo != null){
  1111. TakaiApplication info = TakaiApplication.builder().appId(appId)
  1112. .name(params.getName())
  1113. .desc(params.getDesc())
  1114. .model(params.getModel())
  1115. .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
  1116. .topP(params.getTop_p())
  1117. .temperature(params.getTemperature())
  1118. .maxToken(params.getMax_token())
  1119. .prompt(base64DecodeUtil.decodeIfNeeded(params.getPrompt()))
  1120. .knowledgeInfo(params.getKnowledge_info())
  1121. .sliceCount(params.getSlice_count())
  1122. .typeId(params.getTypeId())
  1123. .isDeepThink(params.getIsDeepThink())
  1124. .visible(params.getVisible())
  1125. .sort(params.getSort())
  1126. .build();
  1127. //关联项目
  1128. if(params.getAppProId() != null){
  1129. SysProjectApp sysProjectApp = sysProjectAppMapper.selectSysProjectAppByAppId(appId);
  1130. if(sysProjectApp != null){
  1131. sysProjectAppMapper.deleteSysProjectAppByAppId(appId);
  1132. }
  1133. sysProjectApp = new SysProjectApp();
  1134. sysProjectApp.setProjectId(params.getAppProId());
  1135. sysProjectApp.setAppId(appId);
  1136. sysProjectAppMapper.insertSysProjectApp(sysProjectApp);
  1137. }
  1138. if(isAdmin
  1139. || "1".equals(params.getVisible())
  1140. || AppTypeEnum.PROJECT.getCode().equals(String.valueOf(params.getTypeId()))){
  1141. info.setStatus("3"); // 有直接修改权限无需审核
  1142. info.setApprover(null);
  1143. info.setNodeOrder(null);
  1144. }else{
  1145. info.setStatus("2"); // 未开始审核状态
  1146. info.setApprover(String.valueOf(vo.getApprover()));
  1147. info.setNodeOrder(String.valueOf(vo.getNodeOrder()));
  1148. }
  1149. info.setUpdateBy(params.getUserId());
  1150. int i = takaiApplicationMapper.updateApplication(info);
  1151. if (1 > 0) {
  1152. //添加VIP用户
  1153. takaiApplicationMapper.deleteVipByAppId(info.getAppId());
  1154. if(params.getVipList() != null && params.getVipList().size() > 0){
  1155. for(SysUser sysUser : params.getVipList()){
  1156. VipApplication vipApplication =
  1157. VipApplication.builder()
  1158. .appId(info.getAppId())
  1159. .userId(sysUser.getUserId())
  1160. .build();
  1161. takaiApplicationMapper.insertVipApp(vipApplication);
  1162. }
  1163. }
  1164. TakaiAppInfo appInfo = new TakaiAppInfo();
  1165. appInfo.setAppId(appId);
  1166. appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
  1167. takaiAppInfoMapper.updateAppInfoByAppId(appInfo);
  1168. logger.info("update application success, id:{}, name:{}", appId, params.getName());
  1169. //预设问题写入数据库
  1170. takaiQuestionMapper.delQuestionByAppId(appId);
  1171. List<String> list = params.getQuestionList();
  1172. if (!list.isEmpty() && list.size() > 0) {
  1173. for (String str : list) {
  1174. if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
  1175. String uuid = IdUtils.simpleUUID();
  1176. TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
  1177. takaiQuestionMapper.insertQuestion(question);
  1178. }
  1179. }
  1180. }
  1181. }
  1182. return i;
  1183. } else {
  1184. return 9;
  1185. }
  1186. }
  1187. @Override
  1188. @DataScope(deptAlias = "u", userAlias = "u")
  1189. public List<TakaiApplicationResult> getApplicationList(TakaiApplication params) {
  1190. //管理员 获取所有项目
  1191. Map<String,Object> userParams = getUserParams();
  1192. if(userParams != null){
  1193. params.getParams().putAll(userParams);
  1194. }
  1195. List<TakaiApplicationResult> appList = takaiApplicationMapper.selectApplicationList(params);
  1196. //添加应用VIP用户
  1197. // if(appList != null && appList.size() > 0){
  1198. // for (TakaiApplicationResult appResult : appList) {
  1199. // List<SysUser> vipList = userService.selectAppVipList(appResult.getAppId());
  1200. // appResult.setVipList(vipList);
  1201. // }
  1202. // }
  1203. return appList;
  1204. }
  1205. @Override
  1206. public JSONObject selectApplication(String appId) {
  1207. JSONObject object = new JSONObject();
  1208. TakaiApplication application = TakaiApplication.builder().appId(appId).build();
  1209. TakaiApplication takaiApplication = takaiApplicationMapper.selectTargetApplication(application);
  1210. //项目级应用 返回['项目分类','项目id']
  1211. if(takaiApplication != null) {
  1212. //添加应用VIP用户
  1213. List<SysUser> vipList = userService.selectAppVipList(appId);
  1214. takaiApplication.setVipList(vipList);
  1215. if(AppTypeEnum.PROJECT.getCode().equals(String.valueOf(takaiApplication.getTypeId()))) {
  1216. SysProjectApp sysProjectApp = sysProjectAppMapper.selectSysProjectAppByAppId(application.getAppId());
  1217. if (sysProjectApp != null) {
  1218. SysProject sysProject = sysProjectMapper.selectSysProjectByProjectId(sysProjectApp.getProjectId());
  1219. takaiApplication.setAppProId(
  1220. String.valueOf(sysProject.getProjectId()));
  1221. }
  1222. }
  1223. List<String> idList = Arrays.stream(takaiApplication.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
  1224. .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
  1225. .collect(Collectors.toList());
  1226. JSONObject detailObj = JSONObject.from(takaiApplication); // 转为JSON对象
  1227. detailObj.put("knowledgeIds", idList); // 用数组替换原字符串
  1228. object.put("detail", detailObj);
  1229. } else {
  1230. object.put("detail", takaiApplication);
  1231. }
  1232. List<TakaiQuestionDTO> list = takaiQuestionMapper.getQuestionList(appId);
  1233. object.put("questionlist", list);
  1234. return object;
  1235. }
  1236. @Override
  1237. public int delApplication(String appId) {
  1238. int i = takaiApplicationMapper.delApplication(appId);
  1239. if (i > 0) {
  1240. takaiAppInfoMapper.delAppInfoByAppId(appId);
  1241. takaiQuestionMapper.delQuestionByAppId(appId);
  1242. takaiApplicationMapper.delApplication(appId);
  1243. }
  1244. return i;
  1245. }
  1246. @Override
  1247. public List<TakaiQuestionDTO> selectQuestionByAppId(String appId) {
  1248. List<TakaiQuestionDTO> List = takaiQuestionMapper.getQuestionList(appId);
  1249. return List;
  1250. }
  1251. @Override
  1252. public List<TakaiKnowledge> queryKnowledgeList() {
  1253. //管理员 获取所有项目
  1254. TakaiKnowledge params = getKnowledgeUserParams();
  1255. return takaiKnowledgeMapper.selectKnowledgeList(params);
  1256. }
  1257. private TakaiKnowledge getKnowledgeUserParams() {
  1258. TakaiKnowledge params = null;
  1259. //管理员 获取所有项目
  1260. Map<String,Object> userParams = getUserParams();
  1261. if(userParams != null){
  1262. params = TakaiKnowledge.builder().build();
  1263. params.setParams(userParams);
  1264. }
  1265. return params;
  1266. }
  1267. private Map<String,Object> getUserParams() {
  1268. //管理员 获取所有项目
  1269. LoginUser user = SecurityUtils.getLoginUser();
  1270. Map<String,Object> userParams = null;
  1271. if(user != null){
  1272. userParams = new HashMap<>();
  1273. SysUser loginUser = user.getUser();
  1274. userParams.put("userType",loginUser.getUserType());
  1275. userParams.put("userId",loginUser.getUserId());
  1276. if(loginUser.getRoles().stream().anyMatch(role -> role.getRoleId() == 1)) {
  1277. userParams.put("isAdmin", true);
  1278. } else {
  1279. userParams.put("isAdmin", false);
  1280. }
  1281. }
  1282. return userParams;
  1283. }
  1284. @Override
  1285. public List<TakaiDialogRespDTO> selectDialogListByAppId(String appId, String userId) {
  1286. List<TakaiDialogRespDTO> list = takaiDialogMapper.selectDialog(appId, userId);
  1287. // List<Object> result = setDialogList(list);
  1288. return list;
  1289. }
  1290. @Override
  1291. public TakaiDocumentSettings documentSetting(String documentId) {
  1292. return takaiDocumentSettingsMapper.selectById(documentId);
  1293. }
  1294. @Override
  1295. public int updateDocumentSetting(TakaiDocumentSettings documentSettings, String documentId) {
  1296. TakaiDocumentSettings settings = new TakaiDocumentSettings();
  1297. TakaiDocumentSettings settingsVo = takaiDocumentSettingsMapper.selectById(documentId);
  1298. settings.setKnowledgeId(settingsVo.getKnowledgeId());
  1299. settings.setSetSlice(documentSettings.getSetSlice());
  1300. settings.setSliceValue(documentSettings.getSliceValue());
  1301. settings.setSetAnalyze(documentSettings.getSetAnalyze());
  1302. settings.setSetTable(documentSettings.getSetTable());
  1303. settings.setCreateBy(SecurityUtils.getUserId());
  1304. TakaiDocument document = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
  1305. List<UploadDocumentParams> listParams = new ArrayList<>();
  1306. if (document != null) {
  1307. UploadDocumentParams params = new UploadDocumentParams();
  1308. params.setDocument_id(documentId);
  1309. params.setName(document.getName());
  1310. params.setUrl(document.getUrl());
  1311. listParams.add(params);
  1312. }
  1313. JSONObject jsonObject = analysisFile(listParams, settings, "update");
  1314. if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
  1315. logger.info("update document setting success, id:{}", documentId);
  1316. documentSettings.setDocumentId(documentId);
  1317. return takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
  1318. }
  1319. return 0;
  1320. }
  1321. @Override
  1322. public JSONObject getSliceList(TakaiSliceParams params) {
  1323. // String url = deepseekConfig.getBaseurl() + deepseekConfig.getSlicePage();
  1324. // JSONObject jsonObject = new JSONObject();
  1325. // jsonObject.put("document_id", params.getDocument_id());
  1326. // jsonObject.put("knowledge_id", params.getKnowledge_id());
  1327. // jsonObject.put("text", params.getText());
  1328. // jsonObject.put("pageNum", params.getPageNum());
  1329. // jsonObject.put("pageSize", params.getPageSize());
  1330. //
  1331. // RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
  1332. // Request request = buildPostRequest(url, requestBody);
  1333. //
  1334. // OkHttpClient client = buildOkHttpClient();
  1335. // Response response = null;
  1336. // try {
  1337. // response = client.newCall(request).execute();
  1338. // if (response.isSuccessful()) {
  1339. // String body = response.body().string();
  1340. // JSONObject obj = JSON.parseObject(body);
  1341. // Integer code = obj.getInteger("code");
  1342. // if (code == 200) {
  1343. // return obj;
  1344. // }
  1345. // } else {
  1346. // logger.info("获取切片列表调用python接口失败,返回状态码:{}", response.code());
  1347. // }
  1348. // } catch (IOException e) {
  1349. // logger.error("获取切片列表调用python接口失败", e.getMessage());
  1350. // }
  1351. return null;
  1352. }
  1353. @Override
  1354. public int deleteSlice(String sliceId, String knowledgeId, String documentId) {
  1355. String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteSlice() + "/" + sliceId + "/" + knowledgeId + "/" + documentId;
  1356. Request request = buildDeleteRequest(url);
  1357. OkHttpClient client = buildOkHttpClient();
  1358. Response response = null;
  1359. try {
  1360. response = client.newCall(request).execute();
  1361. if (response.isSuccessful()) {
  1362. String body = response.body().string();
  1363. JSONObject obj = JSON.parseObject(body);
  1364. Integer code = obj.getInteger("code");
  1365. logger.info("删除切片调用python接口成功,返回结果:{}", body);
  1366. if (code == 200) {
  1367. updateDocumentSize(knowledgeId,documentId);
  1368. return 1;
  1369. }
  1370. }
  1371. } catch (IOException e) {
  1372. logger.error("删除切片调用python接口失败", e.getMessage());
  1373. }
  1374. return 0;
  1375. }
  1376. @Override
  1377. public JSONObject getSliceDetail(String sliceId, String knowledgeId) {
  1378. String url = deepseekConfig.getBaseurl() + deepseekConfig.getSliceDetail() + "/" + knowledgeId + "/" + sliceId;
  1379. Request request = buildGetRequest(url);
  1380. OkHttpClient client = buildOkHttpClient();
  1381. try {
  1382. Response response = client.newCall(request).execute();
  1383. if (response.isSuccessful()) {
  1384. String body = response.body().string();
  1385. log.info("查询切片详情返回:" + body);
  1386. JSONObject jsonObject = JSON.parseObject(body);
  1387. JSONObject dataObject = jsonObject.getJSONObject("data");
  1388. String docId = dataObject.getString("document_id");
  1389. String sliceText = dataObject.getString("slice_text");
  1390. TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(docId).build();
  1391. List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
  1392. //替换【示意图序号_XXXXX】为超链接
  1393. List<TakaiSliceImage> sliceImageList = SchematicNumberParser.extractImageUrlMappings(sliceText,imageList);
  1394. // String replaceText = SchematicNumberParser.replaceWithImageLinks(sliceText,imageList);
  1395. // dataObject.put("slice_text",replaceText);
  1396. dataObject.put("imageList",sliceImageList);
  1397. return jsonObject;
  1398. } else {
  1399. logger.info("获取切片详情调用python接口失败,返回状态码:{}", response.code());
  1400. }
  1401. } catch (IOException e) {
  1402. log.error("查询切片详情调用python接口失败", e.getMessage());
  1403. }
  1404. return null;
  1405. }
  1406. @Override
  1407. public List<TakaiSliceImage> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId) {
  1408. List<TakaiSysOss> resultList = null;
  1409. try {
  1410. resultList = minioUtil.uploadSliceImages(files,knowledgeId,documentId);
  1411. } catch (Exception e) {
  1412. logger.error("上传文件失败", e.getMessage());
  1413. }
  1414. //保存图片信息
  1415. List<TakaiSliceImage> originTextList = new ArrayList<>();
  1416. for (TakaiSysOss result : resultList) {
  1417. TakaiMediaReplacement takaiMediaReplacement =
  1418. TakaiMediaReplacement.builder()
  1419. .knowledgeId(knowledgeId)
  1420. .documentId(documentId)
  1421. .originText(result.getOriginText())
  1422. .mediaType("image")
  1423. .mediaUrl(result.getUrl())
  1424. .build();
  1425. Date currentDate = new Date();
  1426. takaiMediaReplacement.setCreateTime(currentDate);
  1427. takaiMediaReplacement.setUpdateTime(currentDate);
  1428. takaiMediaReplacementMapper.insertMedia(takaiMediaReplacement);
  1429. TakaiSliceImage sliceImage = TakaiSliceImage.builder().name(result.getOriginText()).url(result.getUrl()).build();
  1430. originTextList.add(sliceImage);
  1431. }
  1432. return originTextList;
  1433. }
  1434. @Override
  1435. public int updateSliceInfo(TakaiSliceUpdateParams params) {
  1436. String url = deepseekConfig.getBaseurl() + deepseekConfig.getUpdateSlice();
  1437. JSONObject object = new JSONObject();
  1438. object.put("knowledge_id", params.getKnowledgeId());
  1439. object.put("slice_id", params.getSliceId());
  1440. object.put("slice_text", base64DecodeUtil.decodeIfNeeded(params.getSliceText()));
  1441. object.put("document_id", params.getDocumentId());
  1442. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), object.toJSONString());
  1443. Request request = buildPutRequest(url, requestBody);
  1444. OkHttpClient client = buildOkHttpClient();
  1445. try {
  1446. Response response = client.newCall(request).execute();
  1447. if (response.isSuccessful()) {
  1448. String body = response.body().string();
  1449. JSONObject obj = JSON.parseObject(body);
  1450. Integer code = obj.getInteger("code");
  1451. if (code == 200) {
  1452. updateDocumentSize(params.getKnowledgeId(),params.getDocumentId());
  1453. return 1;
  1454. }
  1455. }
  1456. } catch (Exception e) {
  1457. logger.error("更新切片信息调用python接口失败", e.getMessage());
  1458. }
  1459. return 0;
  1460. }
  1461. @Override
  1462. public TakaiMediaReplacement getTakaiMediaReplacement() {
  1463. TakaiMediaReplacement mrParams = TakaiMediaReplacement.builder()
  1464. .documentId("a2912832435041734656")
  1465. .originText("【示意图序号_a2912832435041734656_1】")
  1466. .mediaType("image").build();
  1467. TakaiMediaReplacement mrVo = takaiMediaReplacementMapper.selectTargetMedia(mrParams);
  1468. return mrVo;
  1469. }
  1470. @Override
  1471. public int addSlice(TakaiSliceUpdateParams params) {
  1472. String url = deepseekConfig.getBaseurl() + deepseekConfig.getAddSlice();
  1473. TakaiDocument info = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(params.getDocumentId()).build());
  1474. if(info != null){
  1475. JSONObject json = new JSONObject();
  1476. json.put("knowledge_id", params.getKnowledgeId());
  1477. json.put("document_id", params.getDocumentId());
  1478. json.put("slice_text", base64DecodeUtil.decodeIfNeeded(params.getSliceText()));
  1479. json.put("doc_name", info.getName());
  1480. RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
  1481. Request request = buildPostRequest(url, requestBody);
  1482. OkHttpClient client = buildOkHttpClient();
  1483. try {
  1484. Response response = client.newCall(request).execute();
  1485. if (response.isSuccessful()) {
  1486. String body = response.body().string();
  1487. JSONObject obj = JSON.parseObject(body);
  1488. Integer code = obj.getInteger("code");
  1489. if (code == 200) {
  1490. updateDocumentSize(params.getKnowledgeId(),params.getDocumentId());
  1491. return 1;
  1492. }
  1493. }
  1494. }catch (Exception e) {
  1495. logger.error("新增切片调用python接口失败", e.getMessage());
  1496. }
  1497. }
  1498. return 0;
  1499. }
  1500. @Override
  1501. public List<TakaiSliceInfo> selectByDocumentId(String documentId,String sliceText) {
  1502. return takaiSliceInfoMapper.selectByDocumentId(documentId,sliceText);
  1503. }
  1504. @Override
  1505. public TakaiSliceInfo selectBySliceId(String sliceId) {
  1506. return takaiSliceInfoMapper.selectBySliceId(sliceId);
  1507. }
  1508. @Override
  1509. public List<SliceInfo> slicePageInfoList(List<String> list) {
  1510. return takaiSliceInfoMapper.slicePageInfoList(list);
  1511. }
  1512. @Override
  1513. public JSONObject searchSlice(String id) {
  1514. String url = deepseekConfig.getBaseurl() + deepseekConfig.getSearchSlice() + "/" + id;
  1515. Request request = buildGetRequest(url);
  1516. OkHttpClient client = buildOkHttpClient();
  1517. try {
  1518. Response response = client.newCall(request).execute();
  1519. if (response.isSuccessful()) {
  1520. String body = response.body().string();
  1521. JSONObject obj = JSON.parseObject(body);
  1522. Integer code = obj.getInteger("code");
  1523. if (code == 200) {
  1524. return obj;
  1525. }
  1526. }
  1527. }catch (Exception e) {
  1528. logger.error("切片得分调用python接口失败", e.getMessage());
  1529. }
  1530. return null;
  1531. }
  1532. @Override
  1533. public List<Object> searchAppTypeGroupList(List<SysDictData> dictDataList, String userId) {
  1534. List<Object> result = new ArrayList();
  1535. if (dictDataList!= null && dictDataList.size() > 0) {
  1536. for (SysDictData dictData : dictDataList){
  1537. // PageHelper.startPage(1, 3, "sort is null asc,sort");
  1538. PageHelper.orderBy("sort is null asc, sort");
  1539. Map<String, Object> map = new HashMap();
  1540. TakaiApplication paramsVo = TakaiApplication.builder().approver(userId).flag("0").addOrderBy("0").build();
  1541. //项目应用
  1542. if(dictData.getDictCode() == 41){
  1543. Map<String, Object> l = searchAppProjectGroupList(paramsVo, dictData);
  1544. if(!MapUtils.isEmpty(l)){
  1545. result.add(l);
  1546. }
  1547. //其他分类应用
  1548. }else{
  1549. paramsVo.setTypeId(Long.valueOf(dictData.getDictCode()));
  1550. List<TakaiApplicationResult> list = takaiApplicationMapper.selectApplicationList(paramsVo);
  1551. if(list != null && list.size() > 0){
  1552. List<Object> appInfoList = new ArrayList();
  1553. map.put("title", dictData.getDictLabel());
  1554. for (TakaiApplicationResult application : list){
  1555. Map<String, Object> infoMap = new HashMap();
  1556. infoMap.put("title", application.getName());
  1557. infoMap.put("appId", application.getAppId());
  1558. infoMap.put("showMenu", "false");
  1559. infoMap.put("chatMode", "LOCAL");
  1560. appInfoList.add(infoMap);
  1561. }
  1562. map.put("children", appInfoList);
  1563. result.add(map);
  1564. }
  1565. }
  1566. }
  1567. }
  1568. return result;
  1569. }
  1570. private Map<String, Object> searchAppProjectGroupList(TakaiApplication paramsVo, SysDictData dictData) {
  1571. paramsVo.setTypeId(dictData.getDictCode());
  1572. List<TakaiApplicationResult> list = takaiApplicationMapper.selectApplicationList(paramsVo);
  1573. //项目级应用
  1574. Map<String, Object> projectLevelMap = new HashMap();
  1575. projectLevelMap.put("title", dictData.getDictLabel());
  1576. List<Object> projectAppList = new ArrayList();
  1577. if (list!= null && list.size() > 0) {
  1578. // 按项目分组
  1579. Map<String, List<TakaiApplicationResult>> projectAppMap = list
  1580. .stream().collect(Collectors.groupingBy(TakaiApplicationResult::getProjectName));
  1581. for (Iterator<String> iterator = projectAppMap.keySet().iterator(); iterator.hasNext();) {
  1582. String projectName = iterator.next();
  1583. Map<String,Object> newProjectAppMap = new HashMap();
  1584. List<TakaiApplicationResult> appList = projectAppMap.get(projectName);
  1585. List<Object> newAppList = new ArrayList();
  1586. for (TakaiApplicationResult application : appList) {
  1587. Map<String, Object> appMap = new HashMap();
  1588. appMap.put("appId", application.getAppId());
  1589. appMap.put("showMenu", "false");
  1590. appMap.put("chatMode", "LOCAL");
  1591. appMap.put("title", application.getName());
  1592. newAppList.add(appMap);
  1593. }
  1594. newProjectAppMap.put("title", projectName);
  1595. newProjectAppMap.put("children",newAppList);
  1596. projectAppList.add(newProjectAppMap);
  1597. }
  1598. }
  1599. projectLevelMap.put("children",projectAppList);
  1600. return projectLevelMap;
  1601. };
  1602. private Map<String, Object> searchAppTypeGroupList(TakaiApplication paramsVo, SysDictData dictData) {
  1603. //慧监理
  1604. paramsVo.setTypeId(Long.valueOf(42));
  1605. List<TakaiApplicationResult> list1 = takaiApplicationMapper.selectApplicationList(paramsVo);
  1606. //慧项管
  1607. paramsVo.setTypeId(Long.valueOf(43));
  1608. List<TakaiApplicationResult> list2 = takaiApplicationMapper.selectApplicationList(paramsVo);
  1609. List<TakaiApplicationResult> list3 = new ArrayList();
  1610. list3.addAll(list1);
  1611. list3.addAll(list2);
  1612. Map<String, Object> map = new HashMap();
  1613. if (list3!= null && list3.size() > 0) {
  1614. List<Object> l = new ArrayList<>();
  1615. map.put("title", dictData.getDictLabel());
  1616. // 分组
  1617. Map<String, List<TakaiApplicationResult>> map1 = list3.stream().collect(Collectors.groupingBy(TakaiApplicationResult::getTypeId));
  1618. for (Map.Entry<String, List<TakaiApplicationResult>> entry : map1.entrySet()) {
  1619. List<TakaiApplicationResult> mp = entry.getValue();
  1620. Map<String, Object> infoProjectMap = new HashMap();
  1621. List<Object> projectInfoList = new ArrayList();
  1622. for (TakaiApplicationResult application : mp){
  1623. SysDictData vo = sysDictDataMapper.selectDictDataById(Long.valueOf(application.getTypeId()));
  1624. infoProjectMap.put("title", vo.getDictLabel());
  1625. Map<String, Object> projectMap = new HashMap();
  1626. projectMap.put("appId", application.getAppId());
  1627. projectMap.put("showMenu", "false");
  1628. projectMap.put("chatMode", "LOCAL");
  1629. projectMap.put("title", application.getName());
  1630. projectInfoList.add(projectMap);
  1631. }
  1632. infoProjectMap.put("children", projectInfoList);
  1633. l.add(infoProjectMap);
  1634. }
  1635. map.put("children", l);
  1636. }
  1637. return map;
  1638. }
  1639. @Override
  1640. public List<TakaiApplication> applicationListByApprover(TakaiApplicationParams takaiApplicationParams) {
  1641. TakaiApplication vo = TakaiApplication.builder().approver(takaiApplicationParams.getApprover())
  1642. .build();
  1643. return takaiApplicationMapper.selectAppListByApprover(vo);
  1644. }
  1645. @Override
  1646. public List<TakaiApplication> applicationHistoryListByApprover(TakaiApplicationParams takaiApplicationParams) {
  1647. TakaiApplication vo = TakaiApplication.builder().approver(takaiApplicationParams.getApprover())
  1648. .build();
  1649. return takaiApplicationMapper.selectAppListHistoryByApprover(vo);
  1650. }
  1651. @Override
  1652. public int startAudit(String appId, String userId) {
  1653. List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
  1654. if(list != null && list.size() > 0) {
  1655. ApprovalFlowManager flowManager = new ApprovalFlowManager();
  1656. logger.info("开启审核");
  1657. for (DocumentAuditConfig config : list) {
  1658. // 添加审核节点
  1659. flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
  1660. }
  1661. ApprovalNode vo = flowManager.getFirstApprover();
  1662. TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
  1663. appVo.setApprover(String.valueOf(vo.getApprover()));
  1664. appVo.setNodeOrder(String.valueOf(vo.getNodeOrder()));
  1665. appVo.setStatus("1");
  1666. int i = takaiApplicationMapper.updateApplication(appVo);
  1667. if(i > 0){
  1668. DocumentAuditInfo info = new DocumentAuditInfo();
  1669. info.setAppId(appId);
  1670. info.setApprover(userId);
  1671. info.setStatus("5");
  1672. info.setNodeOrder(Integer.valueOf("0"));
  1673. info.setCreateBy(userId);
  1674. info.setCreateTime(new Date());
  1675. documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
  1676. }
  1677. return i;
  1678. }else{
  1679. return 9;
  1680. }
  1681. }
  1682. @Override
  1683. public int updateAuditApplication(TakaiApplicationParams appParams, String appId) {
  1684. // 获取审核配置信息 (人员,节点)
  1685. List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
  1686. if(list != null && list.size() > 0){
  1687. if(("Y").equals(appParams.getStatus())){
  1688. ApprovalFlowManager flowManager = new ApprovalFlowManager();
  1689. logger.info("审核通过,开始审批流程");
  1690. for (DocumentAuditConfig config: list){
  1691. // 添加审核节点
  1692. flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
  1693. }
  1694. // 根据审核节点获取下一个审核节点
  1695. ApprovalNode nextNode = flowManager.getNextApproverByOrder(Integer.valueOf(appParams.getNodeOrder()));
  1696. if (nextNode == null) {
  1697. // 审核通过,更新文档状态
  1698. logger.info("审核通过,到最后节点");
  1699. return saveAuditInfo(appParams, "3", appId);
  1700. }else{
  1701. // 审核通过,下一个节点
  1702. TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
  1703. appVo.setApprover(String.valueOf(nextNode.getApprover()));
  1704. appVo.setNodeOrder(String.valueOf(nextNode.getNodeOrder()));
  1705. appVo.setStatus("2");
  1706. appVo.setComment(appParams.getComment());
  1707. int successI = takaiApplicationMapper.updateApplication(appVo);
  1708. if(successI > 0){
  1709. DocumentAuditInfo info = new DocumentAuditInfo();
  1710. info.setAppId(appId);
  1711. info.setApprover(appParams.getApprover());
  1712. info.setComment(appParams.getComment());
  1713. info.setStatus("2");
  1714. info.setNodeOrder(Integer.valueOf(appParams.getNodeOrder()));
  1715. info.setCreateBy(appParams.getApprover());
  1716. info.setCreateTime(new Date());
  1717. documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
  1718. }
  1719. return successI;
  1720. }
  1721. }else{
  1722. // 审核拒绝,更新文档状态
  1723. logger.info("审核拒绝,更新状态");
  1724. return saveAuditInfo(appParams, "5", appId);
  1725. }
  1726. }
  1727. return 0;
  1728. }
  1729. private int saveAuditInfo(TakaiApplicationParams appParams, String status, String appId){
  1730. TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
  1731. appVo.setApprover(appParams.getApprover());
  1732. appVo.setNodeOrder(appParams.getNodeOrder());
  1733. appVo.setStatus(status);
  1734. appVo.setComment(appParams.getComment());
  1735. int successI = takaiApplicationMapper.updateApplication(appVo);
  1736. if(successI > 0){
  1737. DocumentAuditInfo info = new DocumentAuditInfo();
  1738. info.setAppId(appId);
  1739. info.setApprover(appParams.getApprover());
  1740. info.setComment(appParams.getComment());
  1741. if("5".equals(status)){
  1742. info.setStatus("4");
  1743. }else{
  1744. info.setStatus(status);
  1745. }
  1746. info.setNodeOrder(Integer.valueOf(appParams.getNodeOrder()));
  1747. info.setCreateBy(appParams.getApprover());
  1748. info.setCreateTime(new Date());
  1749. documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
  1750. }
  1751. return successI;
  1752. }
  1753. @Override
  1754. public List<TakaiApplicationResult> selectAppByUserId(String userId) {
  1755. return takaiApplicationMapper.selectAppByUserId(userId);
  1756. }
  1757. @Override
  1758. public List<String> selectAppCollectList(String userId) {
  1759. return appCollectMapper.selectAppCollectList(userId);
  1760. }
  1761. @Override
  1762. public int insertAppCollect(AppCollect appCollect) {
  1763. AppCollect collect = appCollectMapper.selectAppCollectDetail(appCollect.getAppId(), appCollect.getUserId());
  1764. if (collect == null) {
  1765. return appCollectMapper.insertAppCollect(appCollect);
  1766. }
  1767. return 0;
  1768. }
  1769. @Override
  1770. public int deleteAppCollect(String userId, String appId) {
  1771. return appCollectMapper.delAppCollect(userId, appId);
  1772. }
  1773. @Override
  1774. public List<TakaiApplicationResult> selectRoleApp() {
  1775. return takaiApplicationMapper.selectRoleApp();
  1776. }
  1777. @Override
  1778. public List<TakaiApplicationResult> getChatAppList(List<TakaiApplicationResult> params, String userId) {
  1779. List<TakaiApplicationResult> list = new ArrayList();
  1780. for (TakaiApplicationResult app : params) {
  1781. AppCollect appCollect = appCollectMapper.selectAppCollectDetail(app.getAppId(), userId);
  1782. SysDictData dictData = null;
  1783. if(app.getTypeId() != null && !"".equals(app.getTypeId())){
  1784. dictData = sysDictDataMapper.selectDictDataById(Long.valueOf(app.getTypeId()));
  1785. }
  1786. TakaiApplicationResult appResult = new TakaiApplicationResult();
  1787. appResult.setAppId(app.getAppId());
  1788. appResult.setName(app.getName());
  1789. appResult.setDesc(app.getDesc());
  1790. appResult.setTypeId(app.getTypeId());
  1791. appResult.setCreateTime(app.getCreateTime());
  1792. appResult.setChatMode("LOCAL");
  1793. appResult.setIsCollect(appCollect != null ? true : false);
  1794. appResult.setTypeName(dictData != null ? dictData.getDictLabel() : "");
  1795. list.add(appResult);
  1796. }
  1797. return list;
  1798. }
  1799. private ApprovalNode getFirstApproverNode() {
  1800. List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
  1801. if(list != null && list.size() > 0) {
  1802. ApprovalFlowManager flowManager = new ApprovalFlowManager();
  1803. logger.info("开启审核");
  1804. for (DocumentAuditConfig config : list) {
  1805. // 添加审核节点
  1806. flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
  1807. }
  1808. return flowManager.getFirstApprover();
  1809. }
  1810. return null;
  1811. }
  1812. private JSONObject analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
  1813. String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
  1814. JSONObject json = new JSONObject();
  1815. json.put("knowledge_id", settings.getKnowledgeId());
  1816. json.put("docs", result);
  1817. json.put("userId",settings.getCreateBy());
  1818. if ("upload".equals(flag)) {
  1819. json.put("set_slice", "0");
  1820. json.put("slice_value", null);
  1821. json.put("set_analyze", "1");
  1822. json.put("set_table", "0");
  1823. json.put("flag", "upload");
  1824. } else {
  1825. json.put("set_slice", settings.getSetSlice());
  1826. json.put("slice_value", settings.getSliceValue());
  1827. json.put("set_analyze", settings.getSetAnalyze());
  1828. json.put("set_table", settings.getSetTable());
  1829. json.put("flag", "update");
  1830. }
  1831. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json.toJSONString());
  1832. Request request = buildPostRequest(url, requestBody);
  1833. OkHttpClient client = buildOkHttpClient();
  1834. Response response = null;
  1835. try {
  1836. response = client.newCall(request).execute();
  1837. if (response.isSuccessful()) {
  1838. String body = response.body().string();
  1839. JSONObject obj = JSON.parseObject(body);
  1840. Integer code = obj.getInteger("code");
  1841. if (code == 200) {
  1842. logger.info("上传文档调用python接口成功,返回内容:{}", body);
  1843. } else {
  1844. logger.info("上传文档调用python接口失败,返回内容:{}", body);
  1845. }
  1846. return obj;
  1847. } else {
  1848. logger.error("上传文档调用python接口失败返回code:{}", response.code());
  1849. return null;
  1850. }
  1851. } catch (IOException e) {
  1852. logger.error("上传文档调用python接口失败", e.getMessage());
  1853. return null;
  1854. }
  1855. }
  1856. @Override
  1857. public List<Object> setDialogList(List<TakaiDialogRespDTO> list) {
  1858. //根据时间分组降序排序
  1859. NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = list.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
  1860. List<Object> obj = new ArrayList();
  1861. if (!groupList.isEmpty()) {
  1862. for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
  1863. List<TakaiDialogRespDTO> aList = entry.getValue();
  1864. List<TakaiDialogRespDTO> detailList = takaiDialogMapper.selectDialogExport(aList.get(0).getId());
  1865. Map<String, Object> map = new HashMap();
  1866. map.put("dialog_name", aList.get(0).getDialog_name());
  1867. map.put("length", detailList.size());
  1868. map.put("create_time", aList.get(0).getCreate_time());
  1869. map.put("did", aList.get(0).getDid());
  1870. map.put("id", aList.get(0).getId());
  1871. obj.add(map);
  1872. }
  1873. }
  1874. return obj;
  1875. }
  1876. private List<Map<String, Object>> setValue(List<TakaiDialogRespDTO> list, String appId) {
  1877. List<Map<String, Object>> l = new ArrayList();
  1878. for (TakaiDialogRespDTO vo : list) {
  1879. Map<String, Object> map = new HashMap();
  1880. map.put("key", vo.getId());
  1881. map.put("label", vo.getDialog_name());
  1882. map.put("appId", appId);
  1883. map.put("showMenu", "false");
  1884. map.put("chatMode", "LOCAL");
  1885. l.add(map);
  1886. }
  1887. return l;
  1888. }
  1889. private OkHttpClient buildOkHttpClient() {
  1890. return new OkHttpClient.Builder()
  1891. .connectTimeout(10, TimeUnit.SECONDS)
  1892. .writeTimeout(50, TimeUnit.SECONDS)
  1893. .readTimeout(20, TimeUnit.MINUTES)
  1894. .build();
  1895. }
  1896. private Request buildGetRequest(String url) {
  1897. return new Request.Builder()
  1898. .addHeader("User-Agent", "insomnia/10.3.1")
  1899. .url(url).get().build();
  1900. }
  1901. private Request buildPostRequest(String url, RequestBody requestBody) {
  1902. return new Request.Builder()
  1903. .addHeader("User-Agent", "insomnia/10.3.1")
  1904. .addHeader("Content-Type", "application/json")
  1905. .url(url).post(requestBody).build();
  1906. }
  1907. private Request buildPutRequest(String url, RequestBody requestBody) {
  1908. return new Request.Builder()
  1909. .addHeader("User-Agent", "insomnia/10.3.1")
  1910. .url(url).put(requestBody).build();
  1911. }
  1912. private Request buildDeleteRequest(String url) {
  1913. return new Request.Builder()
  1914. .addHeader("Content-Type", "multipart/form-data")
  1915. .addHeader("User-Agent", "insomnia/10.3.1")
  1916. .url(url).delete().build();
  1917. }
  1918. private Request buildUploadPostRequest(String url, RequestBody requestBody) {
  1919. return new Request.Builder()
  1920. .addHeader("User-Agent", "insomnia/10.3.1")
  1921. .addHeader("Content-Type", "application/json")
  1922. .url(url).post(requestBody).build();
  1923. }
  1924. private boolean isJsonObject(String data) {
  1925. try {
  1926. JSON.parseObject(data);
  1927. return true;
  1928. } catch (Exception e) {
  1929. return false;
  1930. }
  1931. }
  1932. }