| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115 |
- package com.takai.ai.service.impl;
- import cn.hutool.crypto.digest.DigestUtil;
- import com.alibaba.fastjson2.JSON;
- import com.alibaba.fastjson2.JSONArray;
- import com.alibaba.fastjson2.JSONObject;
- import com.github.pagehelper.PageHelper;
- import com.takai.ai.domain.TakaiSysOss;
- import com.takai.ai.domain.dto.*;
- import com.takai.ai.domain.dto.drone.ProjectDetectionParam;
- import com.takai.ai.domain.entity.*;
- import com.takai.ai.mapper.*;
- import com.takai.ai.service.IMinioConfigService;
- import com.takai.ai.service.ITakaiAiService;
- import com.takai.ai.utils.*;
- import com.takai.common.annotation.DataScope;
- import com.takai.common.annotation.DataSource;
- import com.takai.common.config.DeepseekConfig;
- import com.takai.common.constant.UserConstants;
- import com.takai.common.core.domain.entity.SysDictData;
- import com.takai.common.core.domain.entity.SysUser;
- import com.takai.common.core.domain.model.LoginUser;
- import com.takai.common.core.redis.RedisCache;
- import com.takai.common.enums.AppTypeEnum;
- import com.takai.common.enums.DataSourceType;
- import com.takai.common.utils.SecurityUtils;
- import com.takai.common.utils.StringUtils;
- import com.takai.common.utils.uuid.IdUtils;
- import com.takai.framework.web.service.SysPermissionService;
- import com.takai.system.domain.*;
- import com.takai.system.mapper.*;
- import com.takai.system.service.ISysUserService;
- import lombok.extern.slf4j.Slf4j;
- import okhttp3.*;
- import okhttp3.sse.EventSource;
- import okhttp3.sse.EventSourceListener;
- import okhttp3.sse.EventSources;
- import org.apache.commons.collections4.MapUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Service;
- import org.springframework.web.multipart.MultipartFile;
- import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
- import javax.validation.constraints.NotNull;
- import java.io.IOException;
- import java.nio.charset.StandardCharsets;
- import java.time.LocalDate;
- import java.time.LocalDateTime;
- import java.time.format.DateTimeFormatter;
- import java.time.temporal.ChronoUnit;
- import java.util.*;
- import java.util.concurrent.CompletableFuture;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.stream.Collectors;
- /**
- * 高井 业务层处理
- *
- * @author takai
- */
- @Slf4j
- @Service
- @DataSource(DataSourceType.MASTER)
- public class TakaiAiServiceImpl implements ITakaiAiService {
- private static final Logger logger = LoggerFactory.getLogger(TakaiAiServiceImpl.class);
- @Autowired
- private TakaiDialogMapper takaiDialogMapper;
- @Autowired
- private TakaiApplicationMapper takaiApplicationMapper;
- @Autowired
- private TakaiQuestionMapper takaiQuestionMapper;
- @Autowired
- private TakaiKnowledgeMapper takaiKnowledgeMapper;
- @Autowired
- private TakaiDocumentMapper takaiDocumentMapper;
- @Autowired
- private TakaiSysOssConfigMapper takaiSysOssConfigMapper;
- @Autowired
- private TakaiSysOssMapper takaiSysOssMapper;
- @Autowired
- private MinioUtil minioUtil;
- @Autowired
- private TakaiDocumentSettingsMapper takaiDocumentSettingsMapper;
- @Autowired
- private DeepseekConfig deepseekConfig;
- @Autowired
- private TakaiAppInfoMapper takaiAppInfoMapper;
- @Autowired
- private TakaiMediaReplacementMapper takaiMediaReplacementMapper;
- @Autowired
- private RedisCache redisCache;
- @Autowired
- public RedisTemplate redisTemplate;
- @Autowired
- private TakaiSliceInfoMapper takaiSliceInfoMapper;
- @Autowired
- private DocumentAuditConfigMapper documentAuditConfigMapper;
- @Autowired
- private DocumentAuditInfoMapper documentAuditInfoMapper;
- @Autowired
- private SysPermissionService permissionService;
- @Autowired
- private TypeAppMapper appTypeMapper;
- @Autowired
- private TakaiAppCollectMapper appCollectMapper;
- @Autowired
- private SysDictDataMapper sysDictDataMapper;
- @Autowired
- private SysProjectAppMapper sysProjectAppMapper;
- @Autowired
- private TakaiFileInfoMapper fileInfoMapper;
- @Autowired
- private Base64DecodeUtil base64DecodeUtil;
- // 注入步骤1配置的线程池
- private final ExecutorService analysisFileExecutor;
- public static final String START_SIGN = "【";
- public static final String END_SIGN = "】";
- public static final String SYMBOL = "【示意图序号";
- public static final String USER_STR = "user";
- public static final String TODAY = "今日";
- public static final String BEFOR = "日前";
- private final String OSS_URL= "https://minio.jkec.info:9000";
- @Autowired
- private SysProjectMapper sysProjectMapper;
- @Autowired
- private ISysUserService userService;
- public TakaiAiServiceImpl(ExecutorService analysisFileExecutor) {
- this.analysisFileExecutor = analysisFileExecutor;
- }
- @Override
- public void initDeepseekInfo() {
- //获取应用列表
- // List<TakaiApplication> appList = takaiApplicationMapper.selectApplicationList(null);
- setRedisCache(null);
- }
- private void setRedisCache(String knowledgeId) {
- //获取知识库列表
- List<TakaiKnowledge> knowledgeList = null;
- if (StringUtils.isEmpty(knowledgeId)) {
- knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(null);
- } else {
- knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
- }
- //获取知识列表
- if (!knowledgeList.isEmpty()) {
- for (TakaiKnowledge bmKnowledge : knowledgeList) {
- TakaiDocument conditon = TakaiDocument.builder().knowledgeId(bmKnowledge.getKnowledgeId()).build();
- List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(conditon);
- if (!documentList.isEmpty()) {
- for (TakaiDocument bmDocument : documentList) {
- //获取知识图片列表
- TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(bmDocument.getDocumentId()).build();
- List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
- if (!imageList.isEmpty()) {
- for (TakaiMediaReplacement image : imageList) {
- redisCache.setCacheObject(image.getOriginText(), image.getMediaUrl());
- }
- }
- }
- }
- }
- }
- }
- @Override
- public SseEmitter sseInvoke(TakaiSseInfoParams sseParams) {
- TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
- if (appInfo != null) {
- List<String> idList = Arrays.stream(appInfo.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
- .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
- .collect(Collectors.toList());
- TakaiKnowledge knowledgeParam = TakaiKnowledge.builder().knowledgeIds(idList).build();
- List<TakaiKnowledge> knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(knowledgeParam);
- if (knowledgeList != null && !knowledgeList.isEmpty()) {
- SseEmitter sseEmitter = new SseEmitter(0L);
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getChat();
- TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
- JSONObject json = JSONObject.parseObject(info.getAppInfo());
- //重新设置knowledgeIds为数组
- json.put("knowledgeIds",idList);
- String query = null;
- decodeMessage(sseParams.getMessages());
- decodeMessage(sseParams.getPrompt());
- if(sseParams.getMessages() != null && !sseParams.getMessages().isEmpty() ) {
- query = sseParams.getMessages().get(sseParams.getMessages().size() - 1).getContent();
- } else {
- query = sseParams.getPrompt().get(sseParams.getPrompt().size() - 1).getContent();
- }
- log.info("deepseek聊天请求参数:" + query);
- json.put("query", query);
- json.put("embeddingId", knowledgeList.get(0).getEmbeddingId());
- if(UserConstants.YES.equals(json.getString("isDeepThink"))) {
- json.put("enable_think", true);
- } else {
- json.put("enable_think", false);
- }
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
- Request request = buildPostRequest(url, requestBody);
- // 使用EventSourceListener处理来自服务器的SSE事件
- EventSourceListener listener = new EventSourceListener() {
- private String preData = "";
- //图片识别
- private String symbolData = "";
- @Override
- public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
- log.info("deepseek Connection opened. Headers: {}", response.headers());
- log.info("deepseek Request URL: {}", response.request().url());
- }
- @Override
- public void onClosed(@NotNull EventSource eventSource) {
- log.info("deepseek Connection closed.");
- sseEmitter.complete();
- }
- @Override
- public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
- if (!StringUtils.isEmpty(data)) {
- String newData = data.substring(preData.length());
- logger.info("deepseek聊天返回消息:" + data);
- preData = data;
- if (newData.indexOf(START_SIGN) > -1 || symbolData.length() > 0) {
- symbolData = symbolData + newData;
- //接收到了完整的图片标识
- int endSignPos = symbolData.indexOf(END_SIGN);
- if (endSignPos > -1) {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("event", "add");
- //是图片
- if (symbolData.indexOf(SYMBOL) > -1) {
- //获取完整Key
- int startPos = symbolData.indexOf(START_SIGN);
- int endPos = symbolData.indexOf(END_SIGN) + 1;
- String key = symbolData.substring(startPos, endPos);
- String url = redisCache.getCacheObject(key);
- if (org.springframework.util.StringUtils.hasText(url)) {
- if(url.contains("https://10.1.28.14:9000")){
- //url = url.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
- url = url.replace("https://10.1.28.14:9000", OSS_URL);
- }
- //匹配markdown图片格式
- // symbolData = symbolData.replace(key, "");
- } else {
- logger.error("图片标识符"+key+"没有获取到对应的URL{}: " + symbolData);
- }
- //检查是否当前token包含其他图片的开始符号”【“
- int lastPos = symbolData.lastIndexOf(START_SIGN);
- if(lastPos > endSignPos){
- // 从'【' 开始截取
- newData = symbolData.substring(0, lastPos);
- symbolData = symbolData.substring(lastPos);
- logger.info("截取结果{}: " + symbolData);
- } else {
- newData = symbolData;
- symbolData = "";
- }
- if(!StringUtils.isEmpty(url)) {
- newData = newData.replace(key, " ");
- }
- } else {
- newData = symbolData;
- symbolData = "";
- }
- json.put("data", newData);
- log.info("获取到图片替换结束符号,返回前端信息:" + json);
- send(sseEmitter, json);
- //如果超过长度200还没收到】符号,直接返回。
- } else if (symbolData.length() > 200) {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("event", "add");
- json.put("data", symbolData);
- }
- } else {
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("event", type);
- json.put("data", newData);
- log.info("deepseek返回信息:" + json);
- send(sseEmitter, json);
- }
- }
- if (com.takai.common.utils.StringUtils.isNotEmpty(type) && "finish".equals(type)) {
- log.info("deepseek聊天结束");
- JSONObject json = new JSONObject();
- json.put("id", id);
- json.put("event", type);
- json.put("data", data);
- log.info("deepseek返回信息:" + json);
- send(sseEmitter, json);
- }
- }
- @Override
- public void onFailure(@NotNull EventSource eventSource, Throwable t, Response response) {
- if (response != null) {
- log.error("deepseek Connection failed. Response code: {}, message: {}, body: {}",
- response.code(), response.message(), response.body() != null ? response.body().toString() : "null");
- } else {
- log.error("deepseek Connection failed with no response", t);
- }
- sseEmitter.completeWithError(t);
- }
- private void send(SseEmitter sseEmitter, Object obj) {
- try {
- sseEmitter.send(obj);
- } catch (IOException e) {
- log.error("deepseek 推送数据失败", e);
- }
- }
- };
- OkHttpClient client = buildOkHttpClient();
- EventSource.Factory factory = EventSources.createFactory(client);
- final EventSource eventSources = factory.newEventSource(request, listener);
- // 客户端主动关闭连接
- sseEmitter.onCompletion(() -> {
- logger.info("deepseek客户端主动关闭连接 -- SSE 连接关闭");
- });
- // 超时回调
- sseEmitter.onTimeout(() -> {
- logger.info("deepseek客户端连接超时 -- SSE 连接关闭");
- if(eventSources != null) {
- logger.info("deepseek超时回调 -- 成功关闭SSE连接 ");
- eventSources.cancel();
- }
- });
- // 错误回调
- sseEmitter.onError(e -> {
- logger.info("deepseek客户端回调失败 -- SSE 连接关闭");
- if(eventSources != null) {
- logger.info("deepseek错误回调 -- 成功关闭SSE连接 ");
- eventSources.cancel();
- }
- });
- return sseEmitter;
- }
- }
- return null;
- }
- @Override
- public String syncInvoke(TakaiSseInfoParams sseParams) {
- TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
- if (appInfo != null) {
- List<String> idList = Arrays.stream(appInfo.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
- .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
- .collect(Collectors.toList());
- TakaiKnowledge knowledgeParam = TakaiKnowledge.builder().knowledgeIds(idList).build();
- List<TakaiKnowledge> knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(knowledgeParam);
- if (knowledgeList != null && !knowledgeList.isEmpty()) {
- SseEmitter sseEmitter = new SseEmitter(0L);
- String url = deepseekConfig.getPictureCheckUrl();
- TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
- JSONObject json = JSONObject.parseObject(info.getAppInfo());
- //重新设置knowledgeIds为数组
- json.put("knowledgeIds",idList);
- String query = null;
- // decodeMessage(sseParams.getMessages());
- // decodeMessage(sseParams.getPrompt());
- if(sseParams.getMessages() != null && !sseParams.getMessages().isEmpty() ) {
- query = sseParams.getMessages().get(sseParams.getMessages().size() - 1).getContent();
- } else {
- return null;
- }
- log.info("图片检测结果聊天请求参数:" + query);
- json.put("query", query);
- json.put("embeddingId", knowledgeList.get(0).getEmbeddingId());
- if(UserConstants.YES.equals(json.getString("isDeepThink"))) {
- json.put("enable_think", true);
- } else {
- json.put("enable_think", false);
- }
- // RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
- // Request request = buildPostRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- Request request = createOkHttpRequest(url,json);
- Response response = null;
- try {
- response = client.newCall(request).execute();
- //{"code":200,"data":
- // {"answer":"你好!欢迎来到企业级知识库问答系统。我可以根据您提供的知识片段为您进行归纳总结并生成对话式回答。请您提出具体问题,以便我为您提供准确的信息。","
- // chat_id":"chatcmpl-c5fedbec954a4966a92c5c01857987a7"}
- // }
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- logger.info("图片检测结果调用python接口成功,返回内容:{}", body);
- return obj.getJSONObject("data").getString("answer");
- } else {
- logger.info("图片检测结果调用python接口失败,返回内容:{}", body);
- return null;
- }
- } else {
- logger.error("图片检测结果调用python接口失败返回code:{}", response.code());
- return null;
- }
- } catch (IOException e) {
- logger.error("上传文档调用python接口失败", e.getMessage());
- return null;
- }
- }
- }
- return null;
- }
- private Request createOkHttpRequest(String url, JSONObject requestJson) {
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), requestJson.toJSONString());
- return buildPostRequest(url, requestBody);
- }
- @Override
- public boolean reportToApp(ProjectDetectionParam requestBody, String reportStr) {
- JSONObject requestJson = getRequestJson(requestBody, reportStr);
- OkHttpClient client = buildOkHttpClient();
- Request request = createOkHttpRequest(deepseekConfig.getPictureAppUrl(),requestJson);
- Response response = null;
- try {
- response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- logger.info("图片检测结果调用App接口成功,返回内容:{}", body);
- return true;
- } else {
- logger.info("图片检测结果调用App接口失败,返回内容:{}", body);
- }
- } else {
- logger.error("图片检测结果调用App接口失败返回code:{}", response.code());
- }
- } catch (IOException e) {
- logger.error("上传文档调用App接口失败", e.getMessage());
- }
- return false;
- }
- private JSONObject getRequestJson(ProjectDetectionParam requestBody, String reportStr) {
- // ============ 1. 定义所有字段的【动态变量值】,可以从接口/数据库/配置文件等任意地方取值 ============
- // client子对象的动态值
- String clientId = deepseekConfig.getPictureAppclientId();
- long timestamp = new Date().getTime(); // 时间戳建议用long类型
- // 一级对象的动态值
- String deviceId = requestBody.getDeviceId();
- String projectId = requestBody.getProjectId();
- String phaseId = requestBody.getPhaseId();
- String type = requestBody.getType();
- String time = requestBody.getTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
- String resImageId = requestBody.getResImageId();
- //签名
- String dataInput = clientId+timestamp+type+resImageId;
- String signature = DigestUtil.sha256Hex(dataInput.toUpperCase()+deepseekConfig.getPictureAppSecretKey());
- // ============ 2. 动态构建嵌套的client子JSON对象 ============
- JSONObject clientJson = new JSONObject();
- clientJson.put("clientId", clientId); // 动态赋值
- clientJson.put("timestamp", timestamp); // 动态赋值
- clientJson.put("signature", signature); // 动态赋值
- // ============ 3. 动态构建最外层的主JSON对象 ============
- JSONObject mainJson = new JSONObject();
- mainJson.put("client", clientJson); // 放入嵌套的子对象
- mainJson.put("deviceId", deviceId);
- mainJson.put("projectId", projectId);
- mainJson.put("phaseId", phaseId);
- mainJson.put("type", type);
- mainJson.put("time", time);
- mainJson.put("resImageId", resImageId);
- mainJson.put("ragRes", reportStr);
- return mainJson;
- }
- private void decodeMessage(List<TakaiPromptInfo> messages) {
- if(messages == null || messages.isEmpty()) {
- return;
- }
- for (TakaiPromptInfo message : messages) {
- message.setContent(base64DecodeUtil.decodeIfNeeded(message.getContent()));
- }
- }
- @Override
- public List<String> asyncCompletions(TakaiCompletionsParams params) {
- List<String> list = new ArrayList<>();
- TakaiApplication vo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(params.getAppId()).build());
- if (vo != null) {
- TakaiPromptInfo info = new TakaiPromptInfo();
- info.setContent(deepseekConfig.getPrompt());
- info.setRole("user");
- decodeMessage(params.getMessages());
- params.getMessages().add(info);
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("model", vo.getModel());
- jsonObject.put("messages", params.getMessages());
- jsonObject.put("chat_id", params.getChat_id());
- JSONObject result = getasyncCompletions(jsonObject);
- if (result != null && result.getInteger("code") == 200) {
- JSONArray array = result.getJSONArray("data");
- if(array != null){
- list.addAll(array.toJavaList(String.class));
- }
- }
- }
- return list;
- }
- private JSONObject getasyncCompletions(JSONObject jsonObject) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getAsyncCompletions();
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
- Request request = buildPostRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- if (isJsonObject(body)) {
- return JSON.parseObject(body);
- }
- }
- } catch (IOException e) {
- log.info("deepseek Request URL: {}", e.getMessage());
- }
- return null;
- }
- @Override
- public List<TakaiDialogRespDTO> getDialogDetail(String dialogId) {
- List<TakaiDialogRespDTO> detail = takaiDialogMapper.selectDialogDetail(dialogId);
- if(detail != null && detail.size() != 0){
- for(TakaiDialogRespDTO dto : detail){
- if(StringUtils.isNotEmpty(dto.getSliceJson())){
- dto.setSliceInfo(JSON.parseObject(dto.getSliceJson(), TakaiSliceInfoDTO.class));
- }
- if("user".equals(dto.getType())){
- List<TakaiFileInfo> fileInfoList = fileInfoMapper.getFileInfoById(null, dto.getDialog_id(), dto.getDid());
- if(fileInfoList != null && !fileInfoList.isEmpty()){
- List<TakaiDocumentDTO> documentDTOS = new ArrayList<>();
- for(TakaiFileInfo fileInfo : fileInfoList){
- TakaiDocumentDTO documentDTO = new TakaiDocumentDTO();
- BeanUtils.copyProperties(fileInfo, documentDTO);
- documentDTOS.add(documentDTO);
- }
- dto.setDocuments(documentDTOS);
- }
- }
- }
- }
- return detail;
- }
- @Override
- public void saveDialog(TakaiDialogReqDTO dialogReqDTO) {
- String dialogId = null;
- TakaiDialogRespDTO dialogVo = null;
- if (com.takai.common.utils.StringUtils.isNotEmpty(dialogReqDTO.getId())) {
- dialogVo = takaiDialogMapper.selectDialogById(dialogReqDTO.getId());
- }
- if (dialogVo == null) {
- takaiDialogMapper.insertDialog(dialogReqDTO);
- dialogId = dialogReqDTO.getId();
- } else {
- dialogId = dialogReqDTO.getId();
- }
- for (TakaiDialogDetailReqDTO dto : dialogReqDTO.getMessages()) {
- dto.setDialogId(dialogId);
- dto.setContent(base64DecodeUtil.decodeIfNeeded(dto.getContent()));
- TakaiDialogRespDTO detail = takaiDialogMapper.selectDialogDetailById(dto.getId());
- if (detail == null) {
- if (dto.getSliceInfo() != null) dto.setSliceJson(JSON.toJSONString(dto.getSliceInfo()));
- takaiDialogMapper.insertDialogDetail(dto);
- }
- if(dto.getDocuments() != null && !dto.getDocuments().isEmpty()){
- for(TakaiDocumentDTO documentVo : dto.getDocuments()){
- if(!"".equals(documentVo.getId())) {
- List<TakaiFileInfo> fileInfo = fileInfoMapper.getFileInfoById(documentVo.getId(), null, null);
- if((fileInfo == null || fileInfo.isEmpty()) && "user".equals(dto.getRole())) {
- TakaiFileInfo params = new TakaiFileInfo();
- params.setId(documentVo.getId());
- params.setName(documentVo.getName());
- params.setUrl(documentVo.getUrl());
- params.setDialogId(dialogId);
- params.setDialogDid(dto.getId());
- fileInfoMapper.insertFileInfo(params);
- }
- }
- }
- }
- }
- }
- @Override
- public List<Object> getDialogList(String appId, String userId) {
- List<TakaiDialogRespDTO> dialogRespDTOS = takaiDialogMapper.selectDialogList(appId, userId);
- //当前日期
- LocalDate today = LocalDate.now();
- //根据时间分组降序排序
- NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = dialogRespDTOS.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
- List<Object> obj = new ArrayList();
- if (!groupList.isEmpty()) {
- for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
- // 对比两个时间相差多少天
- long daysBetween = ChronoUnit.DAYS.between(today, entry.getKey());
- Map<String, Object> m = new HashMap();
- m.put("key", System.nanoTime());
- m.put("type", "group");
- if (daysBetween == 0l) {
- m.put("label", TODAY);
- m.put("children", setValue(entry.getValue(), appId));
- obj.add(m);
- } else {
- m.put("label", -daysBetween + BEFOR);
- m.put("children", setValue(entry.getValue(), appId));
- obj.add(m);
- }
- }
- }
- return obj;
- }
- @Override
- public void DelDialogDetail(String id) {
- int result = takaiDialogMapper.delDialog(id);
- if (result > 0) {
- takaiDialogMapper.delDialogDetail(id);
- }
- }
- @Override
- public void updateDialog(TakaiDialogReqDTO dialogReqDTO) {
- takaiDialogMapper.updateDialog(dialogReqDTO);
- }
- @Override
- public List<TakaiDialogRespDTO> exportExcel(String dialogId) {
- return takaiDialogMapper.selectDialogExport(dialogId);
- }
- @Override
- public int createKnowledge(TakaiKnowledgeParams knowledge) {
- SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
- long knowledgeId = snowflakeDigitGenerator.nextId();
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getCreateKnowledge();
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("knowledge_id", "a" + knowledgeId);
- jsonObject.put("embedding_id", knowledge.getEmbeddingId());
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
- Request request = buildPostRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- String createdBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- TakaiKnowledge params = TakaiKnowledge.builder()
- .knowledgeId("a" + knowledgeId)
- .name(knowledge.getName())
- .embeddingId(knowledge.getEmbeddingId())
- .description(knowledge.getDescription())
- .visible(knowledge.getVisible())
- .build();
- params.setCreateBy(createdBy);
- return takaiKnowledgeMapper.insertKnowledge(params);
- }
- } else {
- logger.error("创建知识库调用python接口失败,返回状态码:{}", response.code());
- }
- } catch (IOException e) {
- logger.error("创建知识库调用python接口失败", e.getMessage());
- }
- return 0;
- }
- @Override
- public int updateKnowledge(TakaiKnowledgeParams knowledge, String knowledgeId) {
- TakaiKnowledge params = TakaiKnowledge.builder().knowledgeId(knowledgeId)
- .name(knowledge.getName())
- .description(knowledge.getDescription())
- .embeddingId(knowledge.getEmbeddingId())
- .visible(knowledge.getVisible())
- .build();
- String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
- params.setUpdateBy(updateBy);
- params.setUpdateTime(new Date());
- return takaiKnowledgeMapper.updateKnowledge(params);
- }
- @Override
- public TakaiKnowledge detailKnowledge(String knowledgeId) {
- TakaiKnowledge vo = TakaiKnowledge.builder().knowledgeId(knowledgeId).build();
- return takaiKnowledgeMapper.selectTargetKnowledge(vo);
- }
- @Override
- public int delKnowledge(String knowledgeId) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteKnowledge() + "/" + knowledgeId;
- Request request = buildDeleteRequest(url);
- OkHttpClient client = buildOkHttpClient();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- // TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
- List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().knowledgeId(knowledgeId).build());
- List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
- int knowledgeInt = takaiKnowledgeMapper.delKnowledge(knowledgeId);
- if (knowledgeInt > 0) {
- takaiDocumentMapper.delDocumentByKnowledgeId(knowledgeId);
- takaiDocumentSettingsMapper.deleteDocumentSettingsByKnowledgeId(knowledgeId);
- if(list != null && list.size() > 0){
- try {
- for(TakaiDocument document: documentList){
- logger.info("删除知识库->删除minio文件");
- minioUtil.remove("deepseek-doc", "/"+document.getName());
- }
- for (int k = 0; k < list.size(); k++ ) {
- logger.info("删除知识库->删除minio图片{}", k);
- String key = "/pdf/"+knowledgeId+"/"+list.get(k).getDocumentId()+"/【示意图序号_"+list.get(k).getDocumentId()+"_"+k+1+"】.jpg";
- logger.info("删除知识库->删除minio图片key{}", key);
- minioUtil.remove("deepseek-doc" , key);
- }
- } catch (Exception e) {
- logger.error("删除知识库->删除minion文件失败", e.getMessage());
- throw new RuntimeException(e);
- }
- }
- }
- return knowledgeInt;
- }
- }
- } catch (IOException e) {
- logger.error("删除知识库调用python接口失败", e.getMessage());
- }
- return 0;
- }
- /**
- * 异步上传文档,analysisFile最大并发5个
- * @return 成功处理的文件数量
- */
- @Override
- public CompletableFuture<Integer> uploadDocument(MultipartFile[] files, String knowledgeId,List<TakaiSysOss> ossList,String updateBy) {
- // 2. 循环处理每个文件
- List<TakaiDocument> takaiDocuments = new ArrayList<>();
- for (int i = 0; i < ossList.size(); i++) {
- TakaiSysOss oss = ossList.get(i);
- // 生成文档ID
- SnowflakeDigitGenerator documentIdGenerator = new SnowflakeDigitGenerator(i, i);
- long documentId = documentIdGenerator.nextId();
- String docId = "a" + documentId;
- // 构建上传参数
- UploadDocumentParams param = new UploadDocumentParams();
- param.setDocument_id(docId);
- param.setName(oss.getOriginalName());
- param.setUrl(oss.getUrl());
- List<UploadDocumentParams> params = new ArrayList<>();
- params.add(param);
- // 3. 同步保存OSS到数据库
- takaiSysOssMapper.insertSysOss(oss);
- // 4. 保存文档信息到数据库
- TakaiDocument document = TakaiDocument.builder()
- .documentId(docId)
- .knowledgeId(knowledgeId)
- .customSeparator(String.format("[\"%s\"", "\\n") + "]")
- .sentenceSize("300")
- .name(oss.getOriginalName())
- .url(oss.getUrl())
- .status("0")
- .build();
- document.setCreateBy(updateBy);
- int insertResult = takaiDocumentMapper.insertDocument(document);
- takaiDocuments.add(document);
- // 5. 保存文档设置
- if (insertResult > 0) {
- SnowflakeDigitGenerator settingsIdGenerator = new SnowflakeDigitGenerator(1, 1);
- long settingsId = settingsIdGenerator.nextId();
- TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
- dSettings.setId(String.valueOf(settingsId));
- dSettings.setKnowledgeId(knowledgeId);
- dSettings.setDocumentId(docId);
- dSettings.setSetSlice("0"); // 默认 按标题段落切片
- dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
- dSettings.setSetTable("0"); // 默认 table转图片
- takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
- }
- }
- // 整体逻辑异步执行(默认使用ForkJoinPool,也可指定自定义线程池)
- return CompletableFuture.supplyAsync(() -> {
- // 记录成功处理的文件数
- AtomicInteger successCount = new AtomicInteger(0);
- // 收集analysisFile的异步任务,用于等待全部完成
- List<CompletableFuture<Void>> analysisTasks = new ArrayList<>();
- // 2. 循环处理每个文件
- for (int i = 0; i < takaiDocuments.size(); i++) {
- TakaiDocument document = takaiDocuments.get(i);
- try {
- // 构建上传参数
- UploadDocumentParams param = new UploadDocumentParams();
- param.setDocument_id(document.getDocumentId());
- param.setName(document.getName());
- param.setUrl(document.getUrl());
- List<UploadDocumentParams> params = new ArrayList<>();
- params.add(param);
- // 6. 异步调用analysisFile(限制5个并发)
- TakaiDocumentSettings settings = new TakaiDocumentSettings();
- settings.setKnowledgeId(knowledgeId);
- settings.setCreateBy(updateBy);
- // 注意:捕获循环变量,避免闭包陷阱
- List<UploadDocumentParams> finalParams = new ArrayList<>(params);
- CompletableFuture<Void> analysisTask = CompletableFuture.runAsync(() -> {
- try {
- // 执行文件解析逻辑
- analysisFile(finalParams, settings, "upload");
- } catch (Exception e) {
- log.error("文件解析失败:{}", e);
- }
- }, analysisFileExecutor); // 使用5线程池执行
- // 添加到任务列表
- analysisTasks.add(analysisTask);
- successCount.incrementAndGet();
- } catch (Exception e) {
- log.error("处理文件失败:{}", e);
- // 单个文件失败不影响其他文件,继续处理
- continue;
- }
- }
- // 7. 等待所有analysisFile异步任务完成(不阻塞主线程,仅等待任务结束)
- try {
- CompletableFuture.allOf(analysisTasks.toArray(new CompletableFuture[0])).join();
- log.info("所有文件解析任务已完成,成功处理文件数:{}", successCount.get());
- } catch (Exception e) {
- log.error("等待解析任务完成失败", e);
- }
- // 返回成功处理的文件数
- return successCount.get();
- });
- }
- @Override
- public void updateDocumentByPython(JkDocumentPythonParams parms) {
- TakaiDocument document = TakaiDocument.builder()
- .documentId(parms.getDocumentId())
- .knowledgeId(parms.getKnowledgeId())
- .status(parms.getStatus())
- .sliceTotal(parms.getSliceTotal())
- .length(parms.getLength())
- .wordNum(parms.getWordNum())
- .build();
- takaiDocumentMapper.updateDocument(document);
- updateKnowledgeSize(parms.getKnowledgeId());
- setRedisCache(parms.getKnowledgeId());
- }
- private void updateKnowledgeSize(String knowledgeId) {
- TakaiKnowledge info = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
- List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(knowledgeId).build());
- int totalLen = documentList.stream()
- .mapToInt(doc -> doc.getLength() != null ? doc.getLength() : 0)
- .sum();
- int totalWordNum = documentList.stream()
- .mapToInt(doc -> doc.getWordNum() != null ? doc.getWordNum() : 0)
- .sum();
- int docSize = documentList == null || documentList.size() == 0 ? 0 : documentList.size();
- String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
- TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(knowledgeId)
- .length(totalLen) // 文件大小
- .wordNum(totalWordNum) // 总字符数
- .documentSize(docSize) // 文件总数
- .build();
- paramInfo.setUpdateBy(updateBy);
- paramInfo.setUpdateTime(new Date());
- takaiKnowledgeMapper.updateKnowledge(paramInfo);
- }
- private void updateDocumentSize(String knowledgeId,String documentId) {
- List<TakaiSliceInfo> sliceList = selectByDocumentId(documentId,null);
- //字符数
- int totalLen = sliceList.stream()
- .mapToInt(slice -> slice.getSliceText() != null ? slice.getSliceText().length() : 0)
- .sum();
- //文件大小
- int totalSize = sliceList.stream()
- .mapToInt(slice -> slice.getSliceText() != null ? slice.getSliceText().getBytes(StandardCharsets.UTF_8).length : 0)
- .sum();
- TakaiDocument doc = TakaiDocument.builder()
- .documentId(documentId)
- .length(totalSize)
- .wordNum(totalLen)
- .sliceTotal(sliceList.size())
- .build();
- String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
- doc.setUpdateBy(updateBy);
- doc.setUpdateTime(new Date());
- takaiDocumentMapper.updateDocument(doc);
- updateKnowledgeSize(knowledgeId);
- }
- @Override
- public int updateDocument(TakaiDocumentParams documentParams, String documentId) {
- int i = takaiDocumentMapper.updateDocument(TakaiDocument.builder()
- .documentId(documentId)
- .name(documentParams.getName())
- .build());
- return i;
- }
- @Override
- public List<TakaiDocument> documentList(TakaiDocumentParams documentParams) {
- List<String> statusList = new ArrayList<>();
- if(null != documentParams.getStatus()) {
- statusList.add(documentParams.getStatus());
- if(documentParams.getStatus().equals("0")) {
- statusList.add("2");
- }
- }
- List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(TakaiDocument.builder().knowledgeId(documentParams.getKnowledge_id()).status(documentParams.getStatus()).build());
- replaceOssUrl(documentList);
- return documentList;
- }
- private void replaceOssUrl(List<TakaiDocument> documentList) {
- if(documentList == null || documentList.isEmpty()) {
- return;
- }
- for(TakaiDocument document : documentList) {
- replaceDocUrl(document);
- }
- }
- private void replaceDocUrl(TakaiDocument document) {
- if(document == null) {
- return;
- }
- String url = document.getUrl();
- url = url.replace("https://10.1.28.14:9000", OSS_URL);
- document.setUrl(url);
- }
- @Override
- public TakaiDocument documentDetail(String documentId) {
- TakaiDocument doc = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
- replaceDocUrl(doc);
- return doc;
- }
- @Override
- public int delDocument(String documentId) {
- TakaiDocument vo = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
- if(vo != null){
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteDoc() + "/" + documentId + "/" + vo.getKnowledgeId();
- Request request = buildDeleteRequest(url);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- logger.info("删除知识文件调用python接口返回结果:{}", body);
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().documentId(documentId).build());
- // 删除图片
- takaiMediaReplacementMapper.deleteMedia(documentId);
- // 删除document文件
- int i = takaiDocumentMapper.delDocument(documentId);
- if(i > 0){
- //更新知识库
- updateKnowledgeSize(vo.getKnowledgeId());
- // 删除minio文件
- try {
- logger.info("删除minio文件");
- minioUtil.remove("deepseek-doc", "/"+vo.getName());
- if(list != null && list.size() > 0){
- for (int k=1; k<=list.size(); k++ ) {
- logger.info("删除minio图片{}", k);
- minioUtil.remove("deepseek-doc" , "/pdf/"+vo.getKnowledgeId()+"/"+documentId+"/【示意图序号_"+documentId+"_"+k+"】.jpg");
- }
- }
- } catch (Exception e) {
- logger.error("删除minion文件失败", e.getMessage());
- throw new RuntimeException(e);
- }
- return i;
- }
- }
- }
- } catch (IOException e) {
- logger.error("删除知识文件调用python接口失败", e.getMessage());
- }
- }
- return 0;
- }
- @Override
- public int delUnfinishedDocument(String documentId) {
- TakaiDocument vo = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
- if(vo != null){
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getCancelTask() + "/" + documentId ;
- JSONObject json = new JSONObject();
- //重新设置knowledgeIds为数组
- json.put("documentId",documentId);
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
- Request request = buildPostRequest(url,requestBody);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- logger.info("删除知识文件调用python接口返回结果:{}", body);
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- List<TakaiMediaReplacement> list = takaiMediaReplacementMapper.selectMediaList(TakaiMediaReplacement.builder().documentId(documentId).build());
- // 删除图片
- takaiMediaReplacementMapper.deleteMedia(documentId);
- // 删除document文件
- int i = takaiDocumentMapper.delDocument(documentId);
- if(i > 0){
- //更新知识库
- updateKnowledgeSize(vo.getKnowledgeId());
- // 删除minio文件
- try {
- logger.info("删除minio文件");
- minioUtil.remove("deepseek-doc", "/"+vo.getName());
- if(list != null && list.size() > 0){
- for (int k=1; k<=list.size(); k++ ) {
- logger.info("删除minio图片{}", k);
- minioUtil.remove("deepseek-doc" , "/pdf/"+vo.getKnowledgeId()+"/"+documentId+"/【示意图序号_"+documentId+"_"+k+"】.jpg");
- }
- }
- } catch (Exception e) {
- logger.error("删除minion文件失败", e.getMessage());
- throw new RuntimeException(e);
- }
- return i;
- }
- }
- }
- } catch (IOException e) {
- logger.error("删除知识文件调用python接口失败", e.getMessage());
- }
- }
- return 0;
- }
- @Override
- public void uploadUrl(TakaiDocumentObject object) {
- }
- @Override
- public int createApplication(TakaiApplicationParams params, boolean isAdmin) {
- ApprovalNode vo = getFirstApproverNode(); // 获取第一个审批对象
- if(vo != null){
- SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
- long appId = snowflakeDigitGenerator.nextId();
- TakaiApplication info = TakaiApplication.builder().appId(String.valueOf(appId))
- .name(params.getName())
- .desc(params.getDesc())
- .model(params.getModel())
- .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
- .topP(params.getTop_p())
- .temperature(params.getTemperature())
- .maxToken(params.getMax_token())
- .prompt(base64DecodeUtil.decodeIfNeeded(params.getPrompt()))
- .knowledgeInfo(params.getKnowledge_info())
- .sliceCount(params.getSlice_count())
- .typeId(params.getTypeId())
- .visible(params.getVisible())
- .isDeepThink(params.getIsDeepThink())
- .sort(params.getSort())
- .build();
- //关联项目
- if(params.getAppProId() != null){
- SysProjectApp sysProjectApp = new SysProjectApp();
- sysProjectApp.setProjectId(params.getAppProId());
- sysProjectApp.setAppId(info.getAppId());
- sysProjectAppMapper.insertSysProjectApp(sysProjectApp);
- }
- //管理员,私有,项目级应用不需要审核
- if(isAdmin
- || "1".equals(params.getVisible())
- || AppTypeEnum.PROJECT.getCode().equals(String.valueOf(params.getTypeId()))){ // 1 私有 0 公开
- info.setStatus("3"); // 有直接创建权限无需审核
- }else{
- info.setStatus("2"); // 未开始审核状态
- info.setApprover(String.valueOf(vo.getApprover()));
- info.setNodeOrder(String.valueOf(vo.getNodeOrder()));
- }
- info.setCreateBy(params.getUserId());
- int i = takaiApplicationMapper.insertApplication(info);
- if (i > 0) {
- //添加VIP用户
- if(params.getVipList() != null && params.getVipList().size() > 0){
- for(SysUser sysUser : params.getVipList()){
- VipApplication vipApplication =
- VipApplication.builder()
- .appId(info.getAppId())
- .userId(sysUser.getUserId())
- .build();
- takaiApplicationMapper.insertVipApp(vipApplication);
- }
- }
- TypeApp appType = new TypeApp();
- appType.setTypeId(params.getTypeId() == null ? null : params.getTypeId());
- appType.setAppId(String.valueOf(appId));
- appTypeMapper.insertAppType(appType);
- logger.info("create application success, id:{}, name:{}", appId, params.getName());
- TakaiAppInfo appInfo = new TakaiAppInfo();
- appInfo.setAppId(String.valueOf(appId));
- appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
- takaiAppInfoMapper.insertAppInfo(appInfo);
- List<String> list = params.getQuestionList();
- if (!list.isEmpty() && list.size() > 0) {
- for (String str : list) {
- if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
- String uuid = IdUtils.simpleUUID();
- TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
- takaiQuestionMapper.insertQuestion(question);
- }
- }
- }
- return i;
- }
- }else{
- // 没有审批人
- return 9;
- }
- return 0;
- }
- @Override
- public int updateApplication(TakaiApplicationParams params, String appId, boolean isAdmin) {
- ApprovalNode vo = getFirstApproverNode(); // 获取第一个审批对象
- if(vo != null){
- TakaiApplication info = TakaiApplication.builder().appId(appId)
- .name(params.getName())
- .desc(params.getDesc())
- .model(params.getModel())
- .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
- .topP(params.getTop_p())
- .temperature(params.getTemperature())
- .maxToken(params.getMax_token())
- .prompt(base64DecodeUtil.decodeIfNeeded(params.getPrompt()))
- .knowledgeInfo(params.getKnowledge_info())
- .sliceCount(params.getSlice_count())
- .typeId(params.getTypeId())
- .isDeepThink(params.getIsDeepThink())
- .visible(params.getVisible())
- .sort(params.getSort())
- .build();
- //关联项目
- if(params.getAppProId() != null){
- SysProjectApp sysProjectApp = sysProjectAppMapper.selectSysProjectAppByAppId(appId);
- if(sysProjectApp != null){
- sysProjectAppMapper.deleteSysProjectAppByAppId(appId);
- }
- sysProjectApp = new SysProjectApp();
- sysProjectApp.setProjectId(params.getAppProId());
- sysProjectApp.setAppId(appId);
- sysProjectAppMapper.insertSysProjectApp(sysProjectApp);
- }
- if(isAdmin
- || "1".equals(params.getVisible())
- || AppTypeEnum.PROJECT.getCode().equals(String.valueOf(params.getTypeId()))){
- info.setStatus("3"); // 有直接修改权限无需审核
- info.setApprover(null);
- info.setNodeOrder(null);
- }else{
- info.setStatus("2"); // 未开始审核状态
- info.setApprover(String.valueOf(vo.getApprover()));
- info.setNodeOrder(String.valueOf(vo.getNodeOrder()));
- }
- info.setUpdateBy(params.getUserId());
- int i = takaiApplicationMapper.updateApplication(info);
- if (1 > 0) {
- //添加VIP用户
- takaiApplicationMapper.deleteVipByAppId(info.getAppId());
- if(params.getVipList() != null && params.getVipList().size() > 0){
- for(SysUser sysUser : params.getVipList()){
- VipApplication vipApplication =
- VipApplication.builder()
- .appId(info.getAppId())
- .userId(sysUser.getUserId())
- .build();
- takaiApplicationMapper.insertVipApp(vipApplication);
- }
- }
- TakaiAppInfo appInfo = new TakaiAppInfo();
- appInfo.setAppId(appId);
- appInfo.setAppInfo(String.valueOf(JSONObject.from(info).toJSONString()));
- takaiAppInfoMapper.updateAppInfoByAppId(appInfo);
- logger.info("update application success, id:{}, name:{}", appId, params.getName());
- //预设问题写入数据库
- takaiQuestionMapper.delQuestionByAppId(appId);
- List<String> list = params.getQuestionList();
- if (!list.isEmpty() && list.size() > 0) {
- for (String str : list) {
- if (org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
- String uuid = IdUtils.simpleUUID();
- TakaiQuestion question = TakaiQuestion.builder().id(uuid).question(str).appId(String.valueOf(appId)).build();
- takaiQuestionMapper.insertQuestion(question);
- }
- }
- }
- }
- return i;
- } else {
- return 9;
- }
- }
- @Override
- @DataScope(deptAlias = "u", userAlias = "u")
- public List<TakaiApplicationResult> getApplicationList(TakaiApplication params) {
- //管理员 获取所有项目
- Map<String,Object> userParams = getUserParams();
- if(userParams != null){
- params.getParams().putAll(userParams);
- }
- List<TakaiApplicationResult> appList = takaiApplicationMapper.selectApplicationList(params);
- //添加应用VIP用户
- // if(appList != null && appList.size() > 0){
- // for (TakaiApplicationResult appResult : appList) {
- // List<SysUser> vipList = userService.selectAppVipList(appResult.getAppId());
- // appResult.setVipList(vipList);
- // }
- // }
- return appList;
- }
- @Override
- public JSONObject selectApplication(String appId) {
- JSONObject object = new JSONObject();
- TakaiApplication application = TakaiApplication.builder().appId(appId).build();
- TakaiApplication takaiApplication = takaiApplicationMapper.selectTargetApplication(application);
- //项目级应用 返回['项目分类','项目id']
- if(takaiApplication != null) {
- //添加应用VIP用户
- List<SysUser> vipList = userService.selectAppVipList(appId);
- takaiApplication.setVipList(vipList);
- if(AppTypeEnum.PROJECT.getCode().equals(String.valueOf(takaiApplication.getTypeId()))) {
- SysProjectApp sysProjectApp = sysProjectAppMapper.selectSysProjectAppByAppId(application.getAppId());
- if (sysProjectApp != null) {
- SysProject sysProject = sysProjectMapper.selectSysProjectByProjectId(sysProjectApp.getProjectId());
- takaiApplication.setAppProId(
- String.valueOf(sysProject.getProjectId()));
- }
- }
- List<String> idList = Arrays.stream(takaiApplication.getKnowledgeIds().split(",")) // 按「逗号+空格」拆分字符串为数组
- .filter(str -> str != null && !str.trim().isEmpty()) // 过滤 null 和空字符串(防异常)
- .collect(Collectors.toList());
- JSONObject detailObj = JSONObject.from(takaiApplication); // 转为JSON对象
- detailObj.put("knowledgeIds", idList); // 用数组替换原字符串
- object.put("detail", detailObj);
- } else {
- object.put("detail", takaiApplication);
- }
- List<TakaiQuestionDTO> list = takaiQuestionMapper.getQuestionList(appId);
- object.put("questionlist", list);
- return object;
- }
- @Override
- public int delApplication(String appId) {
- int i = takaiApplicationMapper.delApplication(appId);
- if (i > 0) {
- takaiAppInfoMapper.delAppInfoByAppId(appId);
- takaiQuestionMapper.delQuestionByAppId(appId);
- takaiApplicationMapper.delApplication(appId);
- }
- return i;
- }
- @Override
- public List<TakaiQuestionDTO> selectQuestionByAppId(String appId) {
- List<TakaiQuestionDTO> List = takaiQuestionMapper.getQuestionList(appId);
- return List;
- }
- @Override
- public List<TakaiKnowledge> queryKnowledgeList() {
- //管理员 获取所有项目
- TakaiKnowledge params = getKnowledgeUserParams();
- return takaiKnowledgeMapper.selectKnowledgeList(params);
- }
- private TakaiKnowledge getKnowledgeUserParams() {
- TakaiKnowledge params = null;
- //管理员 获取所有项目
- Map<String,Object> userParams = getUserParams();
- if(userParams != null){
- params = TakaiKnowledge.builder().build();
- params.setParams(userParams);
- }
- return params;
- }
- private Map<String,Object> getUserParams() {
- //管理员 获取所有项目
- LoginUser user = SecurityUtils.getLoginUser();
- Map<String,Object> userParams = null;
- if(user != null){
- userParams = new HashMap<>();
- SysUser loginUser = user.getUser();
- userParams.put("userType",loginUser.getUserType());
- userParams.put("userId",loginUser.getUserId());
- if(loginUser.getRoles().stream().anyMatch(role -> role.getRoleId() == 1)) {
- userParams.put("isAdmin", true);
- } else {
- userParams.put("isAdmin", false);
- }
- }
- return userParams;
- }
- @Override
- public List<TakaiDialogRespDTO> selectDialogListByAppId(String appId, String userId) {
- List<TakaiDialogRespDTO> list = takaiDialogMapper.selectDialog(appId, userId);
- // List<Object> result = setDialogList(list);
- return list;
- }
- @Override
- public TakaiDocumentSettings documentSetting(String documentId) {
- return takaiDocumentSettingsMapper.selectById(documentId);
- }
- @Override
- public int updateDocumentSetting(TakaiDocumentSettings documentSettings, String documentId) {
- TakaiDocumentSettings settings = new TakaiDocumentSettings();
- TakaiDocumentSettings settingsVo = takaiDocumentSettingsMapper.selectById(documentId);
- settings.setKnowledgeId(settingsVo.getKnowledgeId());
- settings.setSetSlice(documentSettings.getSetSlice());
- settings.setSliceValue(documentSettings.getSliceValue());
- settings.setSetAnalyze(documentSettings.getSetAnalyze());
- settings.setSetTable(documentSettings.getSetTable());
- settings.setCreateBy(SecurityUtils.getUserId());
- TakaiDocument document = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
- List<UploadDocumentParams> listParams = new ArrayList<>();
- if (document != null) {
- UploadDocumentParams params = new UploadDocumentParams();
- params.setDocument_id(documentId);
- params.setName(document.getName());
- params.setUrl(document.getUrl());
- listParams.add(params);
- }
- JSONObject jsonObject = analysisFile(listParams, settings, "update");
- if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
- logger.info("update document setting success, id:{}", documentId);
- documentSettings.setDocumentId(documentId);
- return takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
- }
- return 0;
- }
- @Override
- public JSONObject getSliceList(TakaiSliceParams params) {
- // String url = deepseekConfig.getBaseurl() + deepseekConfig.getSlicePage();
- // JSONObject jsonObject = new JSONObject();
- // jsonObject.put("document_id", params.getDocument_id());
- // jsonObject.put("knowledge_id", params.getKnowledge_id());
- // jsonObject.put("text", params.getText());
- // jsonObject.put("pageNum", params.getPageNum());
- // jsonObject.put("pageSize", params.getPageSize());
- //
- // RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), jsonObject.toJSONString());
- // Request request = buildPostRequest(url, requestBody);
- //
- // OkHttpClient client = buildOkHttpClient();
- // Response response = null;
- // try {
- // response = client.newCall(request).execute();
- // if (response.isSuccessful()) {
- // String body = response.body().string();
- // JSONObject obj = JSON.parseObject(body);
- // Integer code = obj.getInteger("code");
- // if (code == 200) {
- // return obj;
- // }
- // } else {
- // logger.info("获取切片列表调用python接口失败,返回状态码:{}", response.code());
- // }
- // } catch (IOException e) {
- // logger.error("获取切片列表调用python接口失败", e.getMessage());
- // }
- return null;
- }
- @Override
- public int deleteSlice(String sliceId, String knowledgeId, String documentId) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteSlice() + "/" + sliceId + "/" + knowledgeId + "/" + documentId;
- Request request = buildDeleteRequest(url);
- OkHttpClient client = buildOkHttpClient();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- logger.info("删除切片调用python接口成功,返回结果:{}", body);
- if (code == 200) {
- updateDocumentSize(knowledgeId,documentId);
- return 1;
- }
- }
- } catch (IOException e) {
- logger.error("删除切片调用python接口失败", e.getMessage());
- }
- return 0;
- }
- @Override
- public JSONObject getSliceDetail(String sliceId, String knowledgeId) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getSliceDetail() + "/" + knowledgeId + "/" + sliceId;
- Request request = buildGetRequest(url);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- log.info("查询切片详情返回:" + body);
- JSONObject jsonObject = JSON.parseObject(body);
- JSONObject dataObject = jsonObject.getJSONObject("data");
- String docId = dataObject.getString("document_id");
- String sliceText = dataObject.getString("slice_text");
- TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(docId).build();
- List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
- //替换【示意图序号_XXXXX】为超链接
- List<TakaiSliceImage> sliceImageList = SchematicNumberParser.extractImageUrlMappings(sliceText,imageList);
- // String replaceText = SchematicNumberParser.replaceWithImageLinks(sliceText,imageList);
- // dataObject.put("slice_text",replaceText);
- dataObject.put("imageList",sliceImageList);
- return jsonObject;
- } else {
- logger.info("获取切片详情调用python接口失败,返回状态码:{}", response.code());
- }
- } catch (IOException e) {
- log.error("查询切片详情调用python接口失败", e.getMessage());
- }
- return null;
- }
- @Override
- public List<TakaiSliceImage> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId) {
- List<TakaiSysOss> resultList = null;
- try {
- resultList = minioUtil.uploadSliceImages(files,knowledgeId,documentId);
- } catch (Exception e) {
- logger.error("上传文件失败", e.getMessage());
- }
- //保存图片信息
- List<TakaiSliceImage> originTextList = new ArrayList<>();
- for (TakaiSysOss result : resultList) {
- TakaiMediaReplacement takaiMediaReplacement =
- TakaiMediaReplacement.builder()
- .knowledgeId(knowledgeId)
- .documentId(documentId)
- .originText(result.getOriginText())
- .mediaType("image")
- .mediaUrl(result.getUrl())
- .build();
- Date currentDate = new Date();
- takaiMediaReplacement.setCreateTime(currentDate);
- takaiMediaReplacement.setUpdateTime(currentDate);
- takaiMediaReplacementMapper.insertMedia(takaiMediaReplacement);
- TakaiSliceImage sliceImage = TakaiSliceImage.builder().name(result.getOriginText()).url(result.getUrl()).build();
- originTextList.add(sliceImage);
- }
- return originTextList;
- }
- @Override
- public int updateSliceInfo(TakaiSliceUpdateParams params) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getUpdateSlice();
- JSONObject object = new JSONObject();
- object.put("knowledge_id", params.getKnowledgeId());
- object.put("slice_id", params.getSliceId());
- object.put("slice_text", base64DecodeUtil.decodeIfNeeded(params.getSliceText()));
- object.put("document_id", params.getDocumentId());
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), object.toJSONString());
- Request request = buildPutRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- updateDocumentSize(params.getKnowledgeId(),params.getDocumentId());
- return 1;
- }
- }
- } catch (Exception e) {
- logger.error("更新切片信息调用python接口失败", e.getMessage());
- }
- return 0;
- }
- @Override
- public TakaiMediaReplacement getTakaiMediaReplacement() {
- TakaiMediaReplacement mrParams = TakaiMediaReplacement.builder()
- .documentId("a2912832435041734656")
- .originText("【示意图序号_a2912832435041734656_1】")
- .mediaType("image").build();
- TakaiMediaReplacement mrVo = takaiMediaReplacementMapper.selectTargetMedia(mrParams);
- return mrVo;
- }
- @Override
- public int addSlice(TakaiSliceUpdateParams params) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getAddSlice();
- TakaiDocument info = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(params.getDocumentId()).build());
- if(info != null){
- JSONObject json = new JSONObject();
- json.put("knowledge_id", params.getKnowledgeId());
- json.put("document_id", params.getDocumentId());
- json.put("slice_text", base64DecodeUtil.decodeIfNeeded(params.getSliceText()));
- json.put("doc_name", info.getName());
- RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json.toJSONString());
- Request request = buildPostRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- updateDocumentSize(params.getKnowledgeId(),params.getDocumentId());
- return 1;
- }
- }
- }catch (Exception e) {
- logger.error("新增切片调用python接口失败", e.getMessage());
- }
- }
- return 0;
- }
- @Override
- public List<TakaiSliceInfo> selectByDocumentId(String documentId,String sliceText) {
- return takaiSliceInfoMapper.selectByDocumentId(documentId,sliceText);
- }
- @Override
- public TakaiSliceInfo selectBySliceId(String sliceId) {
- return takaiSliceInfoMapper.selectBySliceId(sliceId);
- }
- @Override
- public List<SliceInfo> slicePageInfoList(List<String> list) {
- return takaiSliceInfoMapper.slicePageInfoList(list);
- }
- @Override
- public JSONObject searchSlice(String id) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getSearchSlice() + "/" + id;
- Request request = buildGetRequest(url);
- OkHttpClient client = buildOkHttpClient();
- try {
- Response response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- return obj;
- }
- }
- }catch (Exception e) {
- logger.error("切片得分调用python接口失败", e.getMessage());
- }
- return null;
- }
- @Override
- public List<Object> searchAppTypeGroupList(List<SysDictData> dictDataList, String userId) {
- List<Object> result = new ArrayList();
- if (dictDataList!= null && dictDataList.size() > 0) {
- for (SysDictData dictData : dictDataList){
- // PageHelper.startPage(1, 3, "sort is null asc,sort");
- PageHelper.orderBy("sort is null asc, sort");
- Map<String, Object> map = new HashMap();
- TakaiApplication paramsVo = TakaiApplication.builder().approver(userId).flag("0").addOrderBy("0").build();
- //项目应用
- if(dictData.getDictCode() == 41){
- Map<String, Object> l = searchAppProjectGroupList(paramsVo, dictData);
- if(!MapUtils.isEmpty(l)){
- result.add(l);
- }
- //其他分类应用
- }else{
- paramsVo.setTypeId(Long.valueOf(dictData.getDictCode()));
- List<TakaiApplicationResult> list = takaiApplicationMapper.selectApplicationList(paramsVo);
- if(list != null && list.size() > 0){
- List<Object> appInfoList = new ArrayList();
- map.put("title", dictData.getDictLabel());
- for (TakaiApplicationResult application : list){
- Map<String, Object> infoMap = new HashMap();
- infoMap.put("title", application.getName());
- infoMap.put("appId", application.getAppId());
- infoMap.put("showMenu", "false");
- infoMap.put("chatMode", "LOCAL");
- appInfoList.add(infoMap);
- }
- map.put("children", appInfoList);
- result.add(map);
- }
- }
- }
- }
- return result;
- }
- private Map<String, Object> searchAppProjectGroupList(TakaiApplication paramsVo, SysDictData dictData) {
- paramsVo.setTypeId(dictData.getDictCode());
- List<TakaiApplicationResult> list = takaiApplicationMapper.selectApplicationList(paramsVo);
- //项目级应用
- Map<String, Object> projectLevelMap = new HashMap();
- projectLevelMap.put("title", dictData.getDictLabel());
- List<Object> projectAppList = new ArrayList();
- if (list!= null && list.size() > 0) {
- // 按项目分组
- Map<String, List<TakaiApplicationResult>> projectAppMap = list
- .stream().collect(Collectors.groupingBy(TakaiApplicationResult::getProjectName));
- for (Iterator<String> iterator = projectAppMap.keySet().iterator(); iterator.hasNext();) {
- String projectName = iterator.next();
- Map<String,Object> newProjectAppMap = new HashMap();
- List<TakaiApplicationResult> appList = projectAppMap.get(projectName);
- List<Object> newAppList = new ArrayList();
- for (TakaiApplicationResult application : appList) {
- Map<String, Object> appMap = new HashMap();
- appMap.put("appId", application.getAppId());
- appMap.put("showMenu", "false");
- appMap.put("chatMode", "LOCAL");
- appMap.put("title", application.getName());
- newAppList.add(appMap);
- }
- newProjectAppMap.put("title", projectName);
- newProjectAppMap.put("children",newAppList);
- projectAppList.add(newProjectAppMap);
- }
- }
- projectLevelMap.put("children",projectAppList);
- return projectLevelMap;
- };
- private Map<String, Object> searchAppTypeGroupList(TakaiApplication paramsVo, SysDictData dictData) {
- //慧监理
- paramsVo.setTypeId(Long.valueOf(42));
- List<TakaiApplicationResult> list1 = takaiApplicationMapper.selectApplicationList(paramsVo);
- //慧项管
- paramsVo.setTypeId(Long.valueOf(43));
- List<TakaiApplicationResult> list2 = takaiApplicationMapper.selectApplicationList(paramsVo);
- List<TakaiApplicationResult> list3 = new ArrayList();
- list3.addAll(list1);
- list3.addAll(list2);
- Map<String, Object> map = new HashMap();
- if (list3!= null && list3.size() > 0) {
- List<Object> l = new ArrayList<>();
- map.put("title", dictData.getDictLabel());
- // 分组
- Map<String, List<TakaiApplicationResult>> map1 = list3.stream().collect(Collectors.groupingBy(TakaiApplicationResult::getTypeId));
- for (Map.Entry<String, List<TakaiApplicationResult>> entry : map1.entrySet()) {
- List<TakaiApplicationResult> mp = entry.getValue();
- Map<String, Object> infoProjectMap = new HashMap();
- List<Object> projectInfoList = new ArrayList();
- for (TakaiApplicationResult application : mp){
- SysDictData vo = sysDictDataMapper.selectDictDataById(Long.valueOf(application.getTypeId()));
- infoProjectMap.put("title", vo.getDictLabel());
- Map<String, Object> projectMap = new HashMap();
- projectMap.put("appId", application.getAppId());
- projectMap.put("showMenu", "false");
- projectMap.put("chatMode", "LOCAL");
- projectMap.put("title", application.getName());
- projectInfoList.add(projectMap);
- }
- infoProjectMap.put("children", projectInfoList);
- l.add(infoProjectMap);
- }
- map.put("children", l);
- }
- return map;
- }
- @Override
- public List<TakaiApplication> applicationListByApprover(TakaiApplicationParams takaiApplicationParams) {
- TakaiApplication vo = TakaiApplication.builder().approver(takaiApplicationParams.getApprover())
- .build();
- return takaiApplicationMapper.selectAppListByApprover(vo);
- }
- @Override
- public List<TakaiApplication> applicationHistoryListByApprover(TakaiApplicationParams takaiApplicationParams) {
- TakaiApplication vo = TakaiApplication.builder().approver(takaiApplicationParams.getApprover())
- .build();
- return takaiApplicationMapper.selectAppListHistoryByApprover(vo);
- }
- @Override
- public int startAudit(String appId, String userId) {
- List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
- if(list != null && list.size() > 0) {
- ApprovalFlowManager flowManager = new ApprovalFlowManager();
- logger.info("开启审核");
- for (DocumentAuditConfig config : list) {
- // 添加审核节点
- flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
- }
- ApprovalNode vo = flowManager.getFirstApprover();
- TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
- appVo.setApprover(String.valueOf(vo.getApprover()));
- appVo.setNodeOrder(String.valueOf(vo.getNodeOrder()));
- appVo.setStatus("1");
- int i = takaiApplicationMapper.updateApplication(appVo);
- if(i > 0){
- DocumentAuditInfo info = new DocumentAuditInfo();
- info.setAppId(appId);
- info.setApprover(userId);
- info.setStatus("5");
- info.setNodeOrder(Integer.valueOf("0"));
- info.setCreateBy(userId);
- info.setCreateTime(new Date());
- documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
- }
- return i;
- }else{
- return 9;
- }
- }
- @Override
- public int updateAuditApplication(TakaiApplicationParams appParams, String appId) {
- // 获取审核配置信息 (人员,节点)
- List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
- if(list != null && list.size() > 0){
- if(("Y").equals(appParams.getStatus())){
- ApprovalFlowManager flowManager = new ApprovalFlowManager();
- logger.info("审核通过,开始审批流程");
- for (DocumentAuditConfig config: list){
- // 添加审核节点
- flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
- }
- // 根据审核节点获取下一个审核节点
- ApprovalNode nextNode = flowManager.getNextApproverByOrder(Integer.valueOf(appParams.getNodeOrder()));
- if (nextNode == null) {
- // 审核通过,更新文档状态
- logger.info("审核通过,到最后节点");
- return saveAuditInfo(appParams, "3", appId);
- }else{
- // 审核通过,下一个节点
- TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
- appVo.setApprover(String.valueOf(nextNode.getApprover()));
- appVo.setNodeOrder(String.valueOf(nextNode.getNodeOrder()));
- appVo.setStatus("2");
- appVo.setComment(appParams.getComment());
- int successI = takaiApplicationMapper.updateApplication(appVo);
- if(successI > 0){
- DocumentAuditInfo info = new DocumentAuditInfo();
- info.setAppId(appId);
- info.setApprover(appParams.getApprover());
- info.setComment(appParams.getComment());
- info.setStatus("2");
- info.setNodeOrder(Integer.valueOf(appParams.getNodeOrder()));
- info.setCreateBy(appParams.getApprover());
- info.setCreateTime(new Date());
- documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
- }
- return successI;
- }
- }else{
- // 审核拒绝,更新文档状态
- logger.info("审核拒绝,更新状态");
- return saveAuditInfo(appParams, "5", appId);
- }
- }
- return 0;
- }
- private int saveAuditInfo(TakaiApplicationParams appParams, String status, String appId){
- TakaiApplication appVo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(appId).build());
- appVo.setApprover(appParams.getApprover());
- appVo.setNodeOrder(appParams.getNodeOrder());
- appVo.setStatus(status);
- appVo.setComment(appParams.getComment());
- int successI = takaiApplicationMapper.updateApplication(appVo);
- if(successI > 0){
- DocumentAuditInfo info = new DocumentAuditInfo();
- info.setAppId(appId);
- info.setApprover(appParams.getApprover());
- info.setComment(appParams.getComment());
- if("5".equals(status)){
- info.setStatus("4");
- }else{
- info.setStatus(status);
- }
- info.setNodeOrder(Integer.valueOf(appParams.getNodeOrder()));
- info.setCreateBy(appParams.getApprover());
- info.setCreateTime(new Date());
- documentAuditInfoMapper.insertDocumentAuditInfo(info); // 审核记录
- }
- return successI;
- }
- @Override
- public List<TakaiApplicationResult> selectAppByUserId(String userId) {
- return takaiApplicationMapper.selectAppByUserId(userId);
- }
- @Override
- public List<String> selectAppCollectList(String userId) {
- return appCollectMapper.selectAppCollectList(userId);
- }
- @Override
- public int insertAppCollect(AppCollect appCollect) {
- AppCollect collect = appCollectMapper.selectAppCollectDetail(appCollect.getAppId(), appCollect.getUserId());
- if (collect == null) {
- return appCollectMapper.insertAppCollect(appCollect);
- }
- return 0;
- }
- @Override
- public int deleteAppCollect(String userId, String appId) {
- return appCollectMapper.delAppCollect(userId, appId);
- }
- @Override
- public List<TakaiApplicationResult> selectRoleApp() {
- return takaiApplicationMapper.selectRoleApp();
- }
- @Override
- public List<TakaiApplicationResult> getChatAppList(List<TakaiApplicationResult> params, String userId) {
- List<TakaiApplicationResult> list = new ArrayList();
- for (TakaiApplicationResult app : params) {
- AppCollect appCollect = appCollectMapper.selectAppCollectDetail(app.getAppId(), userId);
- SysDictData dictData = null;
- if(app.getTypeId() != null && !"".equals(app.getTypeId())){
- dictData = sysDictDataMapper.selectDictDataById(Long.valueOf(app.getTypeId()));
- }
- TakaiApplicationResult appResult = new TakaiApplicationResult();
- appResult.setAppId(app.getAppId());
- appResult.setName(app.getName());
- appResult.setDesc(app.getDesc());
- appResult.setTypeId(app.getTypeId());
- appResult.setCreateTime(app.getCreateTime());
- appResult.setChatMode("LOCAL");
- appResult.setIsCollect(appCollect != null ? true : false);
- appResult.setTypeName(dictData != null ? dictData.getDictLabel() : "");
- list.add(appResult);
- }
- return list;
- }
- private ApprovalNode getFirstApproverNode() {
- List<DocumentAuditConfig> list = documentAuditConfigMapper.selectDocumentAuditConfigListByBo(null);
- if(list != null && list.size() > 0) {
- ApprovalFlowManager flowManager = new ApprovalFlowManager();
- logger.info("开启审核");
- for (DocumentAuditConfig config : list) {
- // 添加审核节点
- flowManager.addNode(new ApprovalNode(config.getId(), config.getNodeOrder(), config.getApprover(), config.getChain()));
- }
- return flowManager.getFirstApprover();
- }
- return null;
- }
- private JSONObject analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
- String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
- JSONObject json = new JSONObject();
- json.put("knowledge_id", settings.getKnowledgeId());
- json.put("docs", result);
- json.put("userId",settings.getCreateBy());
- if ("upload".equals(flag)) {
- json.put("set_slice", "0");
- json.put("slice_value", null);
- json.put("set_analyze", "1");
- json.put("set_table", "0");
- json.put("flag", "upload");
- } else {
- json.put("set_slice", settings.getSetSlice());
- json.put("slice_value", settings.getSliceValue());
- json.put("set_analyze", settings.getSetAnalyze());
- json.put("set_table", settings.getSetTable());
- json.put("flag", "update");
- }
- RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json.toJSONString());
- Request request = buildPostRequest(url, requestBody);
- OkHttpClient client = buildOkHttpClient();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- if (response.isSuccessful()) {
- String body = response.body().string();
- JSONObject obj = JSON.parseObject(body);
- Integer code = obj.getInteger("code");
- if (code == 200) {
- logger.info("上传文档调用python接口成功,返回内容:{}", body);
- } else {
- logger.info("上传文档调用python接口失败,返回内容:{}", body);
- }
- return obj;
- } else {
- logger.error("上传文档调用python接口失败返回code:{}", response.code());
- return null;
- }
- } catch (IOException e) {
- logger.error("上传文档调用python接口失败", e.getMessage());
- return null;
- }
- }
- @Override
- public List<Object> setDialogList(List<TakaiDialogRespDTO> list) {
- //根据时间分组降序排序
- NavigableMap<LocalDateTime, List<TakaiDialogRespDTO>> groupList = list.stream().collect(Collectors.groupingBy(TakaiDialogRespDTO::getCreate_time, TreeMap::new, Collectors.toList())).descendingMap();
- List<Object> obj = new ArrayList();
- if (!groupList.isEmpty()) {
- for (Map.Entry<LocalDateTime, List<TakaiDialogRespDTO>> entry : groupList.entrySet()) {
- List<TakaiDialogRespDTO> aList = entry.getValue();
- List<TakaiDialogRespDTO> detailList = takaiDialogMapper.selectDialogExport(aList.get(0).getId());
- Map<String, Object> map = new HashMap();
- map.put("dialog_name", aList.get(0).getDialog_name());
- map.put("length", detailList.size());
- map.put("create_time", aList.get(0).getCreate_time());
- map.put("did", aList.get(0).getDid());
- map.put("id", aList.get(0).getId());
- obj.add(map);
- }
- }
- return obj;
- }
- private List<Map<String, Object>> setValue(List<TakaiDialogRespDTO> list, String appId) {
- List<Map<String, Object>> l = new ArrayList();
- for (TakaiDialogRespDTO vo : list) {
- Map<String, Object> map = new HashMap();
- map.put("key", vo.getId());
- map.put("label", vo.getDialog_name());
- map.put("appId", appId);
- map.put("showMenu", "false");
- map.put("chatMode", "LOCAL");
- l.add(map);
- }
- return l;
- }
- private OkHttpClient buildOkHttpClient() {
- return new OkHttpClient.Builder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .writeTimeout(50, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.MINUTES)
- .build();
- }
- private Request buildGetRequest(String url) {
- return new Request.Builder()
- .addHeader("User-Agent", "insomnia/10.3.1")
- .url(url).get().build();
- }
- private Request buildPostRequest(String url, RequestBody requestBody) {
- return new Request.Builder()
- .addHeader("User-Agent", "insomnia/10.3.1")
- .addHeader("Content-Type", "application/json")
- .url(url).post(requestBody).build();
- }
- private Request buildPutRequest(String url, RequestBody requestBody) {
- return new Request.Builder()
- .addHeader("User-Agent", "insomnia/10.3.1")
- .url(url).put(requestBody).build();
- }
- private Request buildDeleteRequest(String url) {
- return new Request.Builder()
- .addHeader("Content-Type", "multipart/form-data")
- .addHeader("User-Agent", "insomnia/10.3.1")
- .url(url).delete().build();
- }
- private Request buildUploadPostRequest(String url, RequestBody requestBody) {
- return new Request.Builder()
- .addHeader("User-Agent", "insomnia/10.3.1")
- .addHeader("Content-Type", "application/json")
- .url(url).post(requestBody).build();
- }
- private boolean isJsonObject(String data) {
- try {
- JSON.parseObject(data);
- return true;
- } catch (Exception e) {
- return false;
- }
- }
- }
|