TakaiAiController.java 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. package com.takai.web.controller.takaiai;
  2. import com.alibaba.fastjson2.JSONObject;
  3. import com.github.pagehelper.Page;
  4. import com.github.pagehelper.PageHelper;
  5. import com.takai.ai.domain.TakaiSysOss;
  6. import com.takai.ai.domain.dto.*;
  7. import com.takai.ai.domain.entity.*;
  8. import com.takai.ai.service.ITakaiAiService;
  9. import com.takai.ai.utils.MinioUtil;
  10. import com.takai.bigmodel.domain.entity.PageParams;
  11. import com.takai.common.annotation.Log;
  12. import com.takai.common.constant.HttpStatus;
  13. import com.takai.common.core.controller.BaseController;
  14. import com.takai.common.core.domain.AjaxResult;
  15. import com.takai.common.core.domain.R;
  16. import com.takai.common.core.domain.TreeStruct;
  17. import com.takai.common.core.domain.entity.SysDictData;
  18. import com.takai.common.core.domain.entity.SysUser;
  19. import com.takai.common.core.domain.model.LoginUser;
  20. import com.takai.common.core.page.TableDataInfo;
  21. import com.takai.common.enums.BusinessType;
  22. import com.takai.common.enums.ProjectTypeEnum;
  23. import com.takai.common.exception.ServiceException;
  24. import com.takai.common.utils.SecurityUtils;
  25. import com.takai.common.utils.poi.ExcelUtil;
  26. import com.takai.framework.web.service.SysPermissionService;
  27. import com.takai.system.domain.SysProject;
  28. import com.takai.system.domain.SysProjectTree;
  29. import com.takai.system.service.ISysDictDataService;
  30. import com.takai.system.service.ISysProjectService;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.apache.commons.lang3.StringUtils;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.http.MediaType;
  35. import org.springframework.web.bind.annotation.*;
  36. import org.springframework.web.multipart.MultipartFile;
  37. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  38. import javax.servlet.http.HttpServletRequest;
  39. import javax.servlet.http.HttpServletResponse;
  40. import java.util.*;
  41. import java.util.concurrent.CompletableFuture;
  42. import java.util.stream.Collectors;
  43. @Slf4j
  44. @RestController
  45. @RequestMapping("/deepseek/api")
  46. public class TakaiAiController extends BaseController {
  47. @Autowired
  48. private ITakaiAiService takaiAisService;
  49. @Autowired
  50. private ISysDictDataService dictDataService;
  51. @Autowired
  52. private SysPermissionService permissionService;
  53. @Autowired
  54. private ISysProjectService sysProjectService;
  55. @Autowired
  56. private MinioUtil minioUtil;
  57. /**
  58. * 对话聊天
  59. *
  60. * @param response
  61. * @param request
  62. * @param sseParams
  63. * @return
  64. */
  65. @PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  66. public SseEmitter chat(HttpServletResponse response, HttpServletRequest request, @RequestBody TakaiSseInfoParams sseParams)
  67. throws Exception {
  68. return takaiAisService.sseInvoke(sseParams);
  69. }
  70. @PostMapping("/async/completions")
  71. public AjaxResult asyncCompletions(@RequestBody TakaiCompletionsParams params) {
  72. return success(takaiAisService.asyncCompletions(params));
  73. }
  74. @PostMapping("/free/async/completions")
  75. public AjaxResult freeAsyncCompletions(@RequestBody TakaiCompletionsParams params) {
  76. return asyncCompletions(params);
  77. }
  78. /**
  79. * 应用列表
  80. *
  81. * @param params
  82. * @return
  83. */
  84. @PostMapping("/getApplicationList")
  85. public TableDataInfo getApplicationList(@RequestBody TakaiPageParams params) {
  86. TakaiApplication vo = setFlagParams(params.getUserId(), params.getTypeId(), params.getProjectId(), 1);
  87. PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
  88. vo.setName(params.getName());
  89. List<TakaiApplicationResult> list = takaiAisService.getApplicationList(vo);
  90. Page<TakaiApplicationResult> page = (Page<TakaiApplicationResult>) list;
  91. return getDataTableResultTotal(list, page.getTotal());
  92. }
  93. /**
  94. * 创建应用
  95. *
  96. * @param params
  97. * @return
  98. */
  99. @PostMapping("/createApplication")
  100. public AjaxResult addApplication(@RequestBody TakaiApplicationParams params) {
  101. SysUser user = new SysUser();
  102. user.setUserId(params.getUserId());
  103. Set<String> permissions = permissionService.getMenuPermission(user);
  104. int i = 0;
  105. if (permissions != null && permissions.size() > 0 && (permissions.contains("deepseek:application:role") || permissions.contains("*:*:*"))) {
  106. i = takaiAisService.createApplication(params, true);
  107. }else{
  108. i = takaiAisService.createApplication(params, false);
  109. }
  110. return AjaxResult.success(i);
  111. }
  112. /**
  113. * 查询应用详情
  114. *
  115. * @param appId
  116. * @return
  117. */
  118. @GetMapping("/selectApplication/{appId}")
  119. public AjaxResult selectApplication(@PathVariable String appId) {
  120. JSONObject application = takaiAisService.selectApplication(appId);
  121. return AjaxResult.success(application);
  122. }
  123. /**
  124. * 修改应用
  125. *
  126. * @param params
  127. * @param appId
  128. * @return
  129. */
  130. @PutMapping("/updateApplication/{appId}")
  131. public AjaxResult updateApplication(@RequestBody TakaiApplicationParams params, @PathVariable String appId) {
  132. SysUser user = new SysUser();
  133. user.setUserId(params.getUserId());
  134. Set<String> permissions = permissionService.getMenuPermission(user);
  135. int application = 0;
  136. if (permissions != null && permissions.size() > 0 && (permissions.contains("deepseek:application:role") || permissions.contains("*:*:*"))) {
  137. application = takaiAisService.updateApplication(params, appId, true);
  138. }else{
  139. application = takaiAisService.updateApplication(params, appId, false);
  140. }
  141. return AjaxResult.success(application);
  142. }
  143. /**
  144. * 删除应用
  145. *
  146. * @param appId
  147. * @return
  148. */
  149. @DeleteMapping("/delApplication/{appId}")
  150. public AjaxResult delApplication(@PathVariable String appId) {
  151. int application = takaiAisService.delApplication(appId);
  152. return AjaxResult.success(application);
  153. }
  154. /**
  155. * 首页
  156. *
  157. * @param params
  158. * @return
  159. */
  160. @PostMapping("/index")
  161. public AjaxResult index(@RequestBody PageParams params) {
  162. TakaiApplication vo = setFlagParams(params.getUserId(), params.getTypeId(), params.getProjectId(), 2);
  163. // 问答应用总数
  164. List<TakaiApplicationResult> appList = takaiAisService.getApplicationList(vo);
  165. // 知识库总数
  166. List<TakaiKnowledge> knowledgeList = takaiAisService.queryKnowledgeList();
  167. Map<String, Object> map = new HashMap();
  168. map.put("applicationCount", appList.size());
  169. map.put("knowledgeCount", knowledgeList.size());
  170. return success(map);
  171. }
  172. /**
  173. * 获取知识库下拉列表
  174. *
  175. * @return
  176. */
  177. @GetMapping("/knowledgeList")
  178. public AjaxResult getKnowledgeList() {
  179. return success(takaiAisService.queryKnowledgeList());
  180. }
  181. /**
  182. * 知识库列表
  183. *
  184. * @param params
  185. * @return
  186. */
  187. @PostMapping("/getKnowledgeList")
  188. public TableDataInfo getKnowledgeList(@RequestBody TakaiPageParams params) {
  189. PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
  190. List<TakaiKnowledge> list = takaiAisService.queryKnowledgeList();
  191. Page<TakaiKnowledge> page = (Page<TakaiKnowledge>) list;
  192. return getDataTableResultTotal(list, page.getTotal());
  193. }
  194. /**
  195. * 创建知识库
  196. *
  197. * @param knowledge
  198. * @return
  199. */
  200. @PostMapping("/createKnowledge")
  201. public AjaxResult createKnowledge(@RequestBody TakaiKnowledgeParams knowledge) {
  202. int i = takaiAisService.createKnowledge(knowledge);
  203. return success(i);
  204. }
  205. /**
  206. * 知识库详情
  207. *
  208. * @param knowledgeId
  209. * @return
  210. */
  211. @GetMapping("/detailKnowledge/{knowledgeId}")
  212. public AjaxResult detailKnowledge(@PathVariable String knowledgeId) {
  213. TakaiKnowledge result = takaiAisService.detailKnowledge(knowledgeId);
  214. return success(result);
  215. }
  216. /**
  217. * 修改知识库
  218. *
  219. * @param knowledge
  220. * @param knowledgeId
  221. * @return
  222. */
  223. @PutMapping("/updateKnowledge/{knowledgeId}")
  224. public AjaxResult updateKnowledge(@RequestBody TakaiKnowledgeParams knowledge, @PathVariable String knowledgeId) {
  225. int i = takaiAisService.updateKnowledge(knowledge, knowledgeId);
  226. return success(i);
  227. }
  228. /**
  229. * 删除知识库
  230. *
  231. * @param knowledgeId
  232. * @return
  233. */
  234. @DeleteMapping("/delKnowledge/{knowledgeId}")
  235. public AjaxResult delKnowledge(@PathVariable String knowledgeId) {
  236. int i = takaiAisService.delKnowledge(knowledgeId);
  237. return success(i);
  238. }
  239. /**
  240. * 知识列表
  241. *
  242. * @param params
  243. * @return
  244. */
  245. @PostMapping("/documentList")
  246. public TableDataInfo documentList(@RequestBody TakaiDocumentParams params) {
  247. PageHelper.startPage(params.getPage(), params.getSize(), "").setReasonable(true);
  248. List<TakaiDocument> list = takaiAisService.documentList(params);
  249. Page<TakaiDocument> page = (Page<TakaiDocument>) list;
  250. return getDataTableResultTotal(list, page.getTotal());
  251. // SysUser user = new SysUser();
  252. // user.setUserId(Long.valueOf(params.getUserId()));
  253. // // 角色集合
  254. // Set<String> permissions = permissionService.getMenuPermission(user);
  255. // // admin 所有文件
  256. // if (permissions.contains("document:public") && permissions.contains("document:internal") && permissions.contains("document:confidential") && permissions.contains("document:topsecret")) {
  257. // params.setFileLevel("4");
  258. // }
  259. // // 项目经理 机密文件 + 所有项目下的内部文件 + 公开文件
  260. // else if (permissions.contains("public") && permissions.contains("internal") && permissions.contains("confidential")) {
  261. // params.setFileLevel("3");
  262. // }
  263. // // 普通用户 所属项目下的内部文件 + 公开文件
  264. // else if (permissions.contains("public") && permissions.contains("internal")) {
  265. // params.setFileLevel("2");
  266. // }
  267. // // 游客 只能浏览公开文件
  268. // else if (permissions.contains("public")){
  269. // params.setFileLevel("1");
  270. // }else{
  271. // params.setFileLevel("0"); // 没有权限
  272. // }
  273. // List<TakaiDocument> sTotal = takaiAisService.documentList(params);
  274. // PageHelper.startPage(params.getPage(), params.getSize(), "").setReasonable(true);
  275. // List<TakaiDocument> list = takaiAisService.documentList(params);
  276. // return getDataTableResultTotal(list, Long.valueOf(sTotal.size()));
  277. }
  278. /**
  279. * 知识详情
  280. *
  281. * @param documentId
  282. * @return
  283. */
  284. @GetMapping("/documentDetail/{documentId}")
  285. public AjaxResult documentDetail(@PathVariable String documentId) {
  286. return success(takaiAisService.documentDetail(documentId));
  287. }
  288. /**
  289. * 更新知识
  290. *
  291. * @param params
  292. * @param documentId
  293. * @return
  294. */
  295. @PutMapping("/updateDocument/{documentId}")
  296. public AjaxResult updateDocument(@RequestBody TakaiDocumentParams params, @PathVariable String documentId) {
  297. int i = takaiAisService.updateDocument(params, documentId);
  298. return success(i);
  299. }
  300. /**
  301. * 删除知识
  302. *
  303. * @param documentId
  304. * @return
  305. */
  306. @DeleteMapping("/delDocument/{documentId}")
  307. public AjaxResult delDocument(@PathVariable String documentId) {
  308. int i = takaiAisService.delDocument(documentId);
  309. return success(i);
  310. }
  311. /**
  312. * 删除知识
  313. *
  314. * @param documentId
  315. * @return
  316. */
  317. @DeleteMapping("/delUnfinishedDocument/{documentId}")
  318. public R<Integer> delUnfinishedDocument(@PathVariable String documentId) {
  319. int i = takaiAisService.delUnfinishedDocument(documentId);
  320. return R.ok(i);
  321. }
  322. /**
  323. * 上传知识文件
  324. *
  325. * @param files
  326. * @param knowledgeId
  327. * @return
  328. * @throws Exception
  329. */
  330. @PostMapping("/uploadDocument/{knowledgeId}") //@RequestPart DocumentParams documentParams,
  331. public AjaxResult uploadDocument(@RequestParam("files") MultipartFile[] files,
  332. @PathVariable String knowledgeId) throws Exception {
  333. try {
  334. // 1. 先同步上传文件到MinIO(IO操作,建议后续也异步,这里先保留)
  335. List<TakaiSysOss> ossList;
  336. try {
  337. ossList = minioUtil.uploadMultiple(files);
  338. if (ossList == null || ossList.isEmpty()) {
  339. log.error("MinIO上传文件为空,直接返回");
  340. return error("MinIO上传文件为空");
  341. }
  342. } catch (Exception e) {
  343. log.error("MinIO上传文件失败", e);
  344. return error("MinIO上传文件失败");
  345. }
  346. String updateBy = SecurityUtils.getLoginUser() == null ? "" : SecurityUtils.getLoginUser().getUserId();
  347. // 调用异步方法
  348. CompletableFuture<Integer> future = takaiAisService.uploadDocument(files, knowledgeId,ossList,updateBy);
  349. // 处理结果(非阻塞)
  350. future.whenComplete((successCount, ex) -> {
  351. if (ex != null) {
  352. log.error("上传文档异步任务失败", ex);
  353. } else {
  354. log.info("上传文档完成,成功处理{}个文件", successCount);
  355. // 可触发后续逻辑,比如通知前端
  356. }
  357. });
  358. return success(1);
  359. } catch (Exception e) {
  360. return error("上传文档失败");
  361. }
  362. }
  363. /**
  364. * python文档解析回调接口
  365. *
  366. * @param params
  367. * @return
  368. * @throws Exception
  369. */
  370. @PostMapping("/updateDocumentByPython") //@RequestPart DocumentParams documentParams,
  371. public R<Void> updateDocumentByPython(@RequestBody JkDocumentPythonParams params){
  372. takaiAisService.updateDocumentByPython(params);
  373. return R.ok();
  374. }
  375. /**
  376. * 上传切片图片
  377. *
  378. * @param files
  379. * @param knowledgeId
  380. * @return
  381. * @throws Exception
  382. */
  383. @PostMapping("/uploadSliceImage/{knowledgeId}/{documentId}")
  384. public AjaxResult uploadSliceImage(@RequestParam("files") MultipartFile[] files,
  385. @PathVariable String knowledgeId,
  386. @PathVariable String documentId) throws Exception {
  387. try {
  388. List<TakaiSliceImage> originTextList = takaiAisService.uploadSliceImage(files, knowledgeId, documentId);
  389. return success(originTextList);
  390. } catch (Exception e) {
  391. return error(e.getMessage());
  392. }
  393. }
  394. /**
  395. * 获取知识配置信息
  396. *
  397. * @param documentId
  398. * @return
  399. */
  400. @GetMapping("/documentSetting/{documentId}")
  401. public AjaxResult documentSetting(@PathVariable String documentId) {
  402. TakaiDocumentSettings json = takaiAisService.documentSetting(documentId);
  403. return success(json);
  404. }
  405. /**
  406. * 更新知识配置详情
  407. *
  408. * @param documentSetting
  409. * @param documentId
  410. * @return
  411. */
  412. @PutMapping("/updateDocumentSetting/{documentId}")
  413. public AjaxResult updateDocumentSetting(@RequestBody TakaiDocumentSettings documentSetting, @PathVariable String documentId) {
  414. int i = takaiAisService.updateDocumentSetting(documentSetting, documentId); // 更新知识配置信息
  415. return success(i);
  416. }
  417. /**
  418. * 获取切片列表
  419. *
  420. * @param params
  421. * @return
  422. */
  423. @PostMapping("/getSliceList")
  424. public TableDataInfo getDialogDetail(@RequestBody TakaiSliceParams params) {
  425. PageHelper.startPage(params.getPageNum(), params.getPageSize(), "").setReasonable(true);
  426. List<TakaiSliceInfo> sliceList = takaiAisService.selectByDocumentId(params.getDocument_id(), params.getText());
  427. Page<TakaiSliceInfo> page = (Page<TakaiSliceInfo>) sliceList;
  428. return getDataTableResultTotal(sliceList, page.getTotal());
  429. }
  430. /**
  431. * 删除切片
  432. *
  433. * @param sliceId
  434. * @param knowledgeId
  435. */
  436. @DeleteMapping("/deleteSlice/{sliceId}/{knowledgeId}/{documentId}")
  437. public AjaxResult deleteSlice(@PathVariable String sliceId, @PathVariable String knowledgeId, @PathVariable String documentId) {
  438. return success(takaiAisService.deleteSlice(sliceId, knowledgeId, documentId));
  439. }
  440. /**
  441. * 切片详情
  442. *
  443. * @param sliceId
  444. * @param knowledgeId
  445. * @return
  446. */
  447. @GetMapping("/getSliceDetail/{sliceId}/{knowledgeId}")
  448. public AjaxResult test(@PathVariable String sliceId, @PathVariable String knowledgeId) {
  449. JSONObject json = takaiAisService.getSliceDetail(sliceId, knowledgeId);
  450. return success(json);
  451. }
  452. /**
  453. * 更新切片信息
  454. *
  455. * @param params
  456. * @return
  457. */
  458. @PutMapping("/updateSliceInfo")
  459. public AjaxResult updateSliceInfo(@RequestBody TakaiSliceUpdateParams params) {
  460. return success(takaiAisService.updateSliceInfo(params));
  461. }
  462. /**
  463. * 获取聊天列表
  464. *
  465. * @param params
  466. * @return
  467. */
  468. @PostMapping("/chatHistory/list")
  469. public TableDataInfo dataExportList(@RequestBody TakaiPageParams params) {
  470. LoginUser loginUser = SecurityUtils.getLoginUser();
  471. String userId = null;
  472. boolean isAdmin = false;
  473. if (loginUser != null) {
  474. userId = loginUser.getUserId();
  475. isAdmin = SecurityUtils.isAdmin(Long.valueOf(userId));
  476. }
  477. if(isAdmin) {
  478. userId = null;
  479. } else {
  480. userId = params.getUserId() == null ? userId : params.getUserId();
  481. }
  482. if (StringUtils.isNotBlank(params.getAppId())) {
  483. //获取应用聊天列表
  484. PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
  485. List<TakaiDialogRespDTO> list = takaiAisService.selectDialogListByAppId(params.getAppId(), userId);
  486. List<Object> result = takaiAisService.setDialogList(list);
  487. Page<TakaiDialogRespDTO> page = (Page<TakaiDialogRespDTO>) list;
  488. return getDataTableResultTotal(result, page.getTotal());
  489. } else {
  490. //获取所有列表
  491. PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
  492. List<TakaiDialogRespDTO> list = takaiAisService.selectDialogListByAppId(null, userId);
  493. List<Object> result = takaiAisService.setDialogList(list);
  494. Page<TakaiDialogRespDTO> page = (Page<TakaiDialogRespDTO>) list;
  495. return getDataTableResultTotal(result, page.getTotal());
  496. }
  497. }
  498. /**
  499. * 导出聊天记录
  500. *
  501. * @param response
  502. * @param id
  503. */
  504. @Log(title = "聊天详情", businessType = BusinessType.EXPORT)
  505. @PostMapping("/dialog/export/{id}")
  506. public void export(HttpServletResponse response, @PathVariable String id) {
  507. List<TakaiDialogRespDTO> dialogs = takaiAisService.exportExcel(id);
  508. ExcelUtil<TakaiDialogRespDTO> util = new ExcelUtil(TakaiDialogRespDTO.class);
  509. util.exportExcel(response, dialogs, "聊天记录");
  510. }
  511. /**
  512. * 应用列表
  513. *
  514. * @return
  515. */
  516. @GetMapping("/application/list")
  517. public AjaxResult applicationList() {
  518. LoginUser loginUser = SecurityUtils.getLoginUser();
  519. if(loginUser != null){
  520. TakaiApplication vo = setFlagParams(loginUser.getUserId(), null, null, 3);
  521. List<TakaiApplicationResult> appList = takaiAisService.getApplicationList(vo);
  522. return success(appList);
  523. }else{
  524. TakaiApplication vo = setFlagParams(null, null, null, 3);
  525. List<TakaiApplicationResult> appList = takaiAisService.getApplicationList(vo);
  526. return success(appList);
  527. }
  528. }
  529. /**
  530. * 管理后台应用列表
  531. * @return
  532. */
  533. @GetMapping("/application/list/{userId}")
  534. public AjaxResult adminApp(@PathVariable String userId) {
  535. TakaiApplication vo = setFlagParams(userId, null, null, 3);
  536. List<TakaiApplicationResult> appList = takaiAisService.getApplicationList(vo);
  537. return success(appList);
  538. }
  539. @GetMapping("/role/list")
  540. public AjaxResult roleApp() {
  541. List<TakaiApplicationResult> appList = takaiAisService.selectRoleApp();
  542. return success(appList);
  543. }
  544. /**
  545. * 保存聊天记录
  546. *
  547. * @param dialogReqDTO
  548. * @return
  549. */
  550. @PostMapping("/dialog/save")
  551. public AjaxResult saveDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO) {
  552. LoginUser loginUser = SecurityUtils.getLoginUser();
  553. if (loginUser != null) {
  554. dialogReqDTO.setUserId(loginUser.getUserId());
  555. }
  556. takaiAisService.saveDialog(dialogReqDTO);
  557. return success();
  558. }
  559. /**
  560. * 聊天集合
  561. *
  562. * @return
  563. */
  564. @GetMapping("/dialog/list/{appId}")
  565. public AjaxResult dialogList(@PathVariable String appId) {
  566. LoginUser loginUser = SecurityUtils.getLoginUser();
  567. String userId = null;
  568. if (loginUser != null) {
  569. userId = loginUser.getUserId();
  570. }
  571. List<Object> dialogs = takaiAisService.getDialogList(appId, userId);
  572. return success(dialogs);
  573. }
  574. /**
  575. * 聊天详情
  576. *
  577. * @param dialogId
  578. * @return
  579. */
  580. @GetMapping("/dialog/detail/{dialogId}")
  581. public AjaxResult dialogDetail(@PathVariable String dialogId) {
  582. List<TakaiDialogRespDTO> detail = takaiAisService.getDialogDetail(dialogId);
  583. return success(detail);
  584. }
  585. /**
  586. * 删除聊天记录
  587. *
  588. * @param id
  589. * @return
  590. */
  591. @DeleteMapping("/dialog/del/{id}")
  592. public AjaxResult delDialog(@PathVariable String id) {
  593. takaiAisService.DelDialogDetail(id);
  594. return success();
  595. }
  596. /**
  597. * 聊天标题重命名
  598. *
  599. * @param dialogReqDTO
  600. * @return
  601. */
  602. @PutMapping("/dialog/update")
  603. public AjaxResult updateDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO) {
  604. takaiAisService.updateDialog(dialogReqDTO);
  605. return success();
  606. }
  607. /**
  608. * 预设问题
  609. *
  610. * @param appId
  611. * @return
  612. */
  613. @GetMapping("/presets/{appId}")
  614. public AjaxResult presets(@PathVariable String appId) {
  615. List<TakaiQuestionDTO> list = takaiAisService.selectQuestionByAppId(appId);
  616. List<String> strList = new ArrayList();
  617. for (TakaiQuestionDTO vo : list) {
  618. strList.add(vo.getQuestion());
  619. }
  620. return success(strList);
  621. }
  622. /**
  623. * 预设问题
  624. *
  625. * @param appId
  626. * @return
  627. */
  628. @GetMapping("/free/presets/{appId}")
  629. public AjaxResult freePresets(@PathVariable String appId) {
  630. return presets(appId);
  631. }
  632. /**
  633. * 新增切片
  634. *
  635. * @param params
  636. * @return
  637. */
  638. @PostMapping("/add/slice")
  639. public AjaxResult addSlice(@RequestBody TakaiSliceUpdateParams params) {
  640. return success(takaiAisService.addSlice(params));
  641. }
  642. /**
  643. * 获取聊天切片列表
  644. *
  645. * @param params
  646. * @return
  647. */
  648. @PostMapping("/slicePage")
  649. public TableDataInfo dataExportList(@RequestBody SlicePageInfo params) {
  650. DocumentInfo chunkInfo = params.getChunk_info();
  651. List<ChunkList> chunkList = chunkInfo.getChunk_list();
  652. // 1. 先按 rerank_score 降序排序所有chunk
  653. List<ChunkList> sortedChunks = chunkList.stream()
  654. .sorted(Comparator.comparingDouble(
  655. (ChunkList s) -> Double.parseDouble(s.getRerank_score())
  656. ).reversed())
  657. .collect(Collectors.toList());
  658. // 2. 提取排序后的chunk_ids(此时已按分数排序)
  659. List<String> sortedChunkIds = sortedChunks.stream()
  660. .map(ChunkList::getChunk_id)
  661. .collect(Collectors.toList());
  662. int fromIndex = (params.getPageNum() - 1) * params.getPageSize();
  663. int toIndex = Math.min(fromIndex + params.getPageSize(), chunkList.size());
  664. List<String> ids = sortedChunkIds.subList(fromIndex, toIndex);
  665. PageHelper.startPage(params.getPageNum(), params.getPageSize(), "").setReasonable(true);
  666. List<SliceInfo> list = takaiAisService.slicePageInfoList(ids);
  667. list.forEach(sliceInfo -> {
  668. chunkList.forEach(chunk -> {
  669. if (sliceInfo.getSliceId().equals(chunk.getChunk_id())) {
  670. sliceInfo.setRerankScore(chunk.getRerank_score());
  671. sliceInfo.setChunkLength(chunk.getChunk_len());
  672. }
  673. });
  674. });
  675. List<SliceInfo> sliceList = list.stream()
  676. .sorted(Comparator.comparingDouble((SliceInfo s) -> Double.parseDouble(s.getRerankScore())).reversed())
  677. .collect(Collectors.toList());
  678. return getDataTableResultTotal(sliceList, sortedChunkIds.size());
  679. }
  680. /**
  681. * 获取聊天切片列表
  682. *
  683. * @param params
  684. * @return
  685. */
  686. @PostMapping("/free/slicePage")
  687. public TableDataInfo freeDataExportList(@RequestBody SlicePageInfo params) {
  688. return dataExportList(params);
  689. }
  690. @GetMapping("/slice/search/{id}")
  691. public AjaxResult searchSlice(@PathVariable String id) {
  692. return success(takaiAisService.searchSlice(id));
  693. }
  694. @GetMapping("/free/slice/search/{id}")
  695. public AjaxResult freeSearchSlice(@PathVariable String id) {
  696. return searchSlice(id);
  697. }
  698. /**
  699. *
  700. * 类型列表
  701. * @param dictType
  702. * @return
  703. */
  704. @GetMapping(value = "/{dictType}")
  705. public AjaxResult geDictInfo(@PathVariable String dictType) {
  706. SysDictData dictData = new SysDictData();
  707. dictData.setDictType(dictType);
  708. List<SysDictData> dictDataList = dictDataService.selectDictDataList(dictData);
  709. return success(dictDataList);
  710. }
  711. /**
  712. *
  713. * 类型列表
  714. * @param
  715. * @return
  716. */
  717. @GetMapping(value = "/projectTree")
  718. public AjaxResult getPorjectTree() {
  719. SysDictData dictData = new SysDictData();
  720. dictData.setDictType("project_type");
  721. List<SysDictData> dictDataList = dictDataService.selectDictDataList(dictData);
  722. List<SysProject> projectList = sysProjectService.selectSysProjectList(null);
  723. logger.info("getPorjectTree:projectList:"+projectList.size());
  724. List<TreeStruct> projectTreeList = new ArrayList<>();
  725. for(SysDictData dict : dictDataList) {
  726. logger.info("getPorjectTree:dict:"+dict);
  727. String clientId;
  728. if(ProjectTypeEnum.HJL.getCode().equals(String.valueOf(dict.getDictValue()))) {
  729. clientId = ProjectTypeEnum.HJL.getClientId();
  730. } else if (ProjectTypeEnum.HXG.getCode().equals(String.valueOf(dict.getDictValue()))) {
  731. clientId = ProjectTypeEnum.HXG.getClientId();
  732. } else {
  733. clientId = "";
  734. }
  735. logger.info("getPorjectTree:clientId:"+clientId);
  736. TreeStruct projectType = new TreeStruct();
  737. projectType.setValue(clientId);
  738. projectType.setLabel(dict.getDictLabel());
  739. List<SysProject> filteredProjects = projectList.stream()
  740. .filter(project -> clientId.equals(project.getSourceFrom()))
  741. .collect(Collectors.toList());
  742. List<TreeStruct> children = new ArrayList<>();
  743. for(SysProject project : filteredProjects) {
  744. TreeStruct child = new TreeStruct();
  745. child.setValue(String.valueOf(project.getProjectId()));
  746. child.setLabel(project.getProjectName());
  747. children.add(child);
  748. }
  749. projectType.setChildren(children);
  750. projectTreeList.add(projectType);
  751. }
  752. return success(projectTreeList);
  753. }
  754. /**
  755. * 应用类型列表
  756. * @return
  757. */
  758. @GetMapping("/appType")
  759. public AjaxResult appType() {
  760. LoginUser loginUser = SecurityUtils.getLoginUser();
  761. if (loginUser != null) {
  762. SysDictData dictData = new SysDictData();
  763. dictData.setDictType("app_type");
  764. List<SysDictData> dictDataList = dictDataService.selectDictDataList(dictData);
  765. List<Object> list = takaiAisService.searchAppTypeGroupList(dictDataList, loginUser.getUserId());
  766. return success(list);
  767. } else {
  768. throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
  769. }
  770. // return null;
  771. }
  772. /**
  773. * 审核列表
  774. * @param params
  775. * @return
  776. */
  777. @PostMapping("/app/audit/list")
  778. public TableDataInfo documentAuditList(@RequestBody TakaiApplicationParams params) {
  779. startPage();
  780. List<TakaiApplication> list = takaiAisService.applicationListByApprover(params);
  781. return getDataTable(list);
  782. }
  783. /**
  784. * 审核历史列表
  785. * @param params
  786. * @return
  787. */
  788. @PostMapping("/app/auditHistory/list")
  789. public TableDataInfo documentAuditHistoryList(@RequestBody TakaiApplicationParams params) {
  790. startPage();
  791. List<TakaiApplication> list = takaiAisService.applicationHistoryListByApprover(params);
  792. return getDataTable(list);
  793. }
  794. /**
  795. * 开始审核
  796. * @return
  797. */
  798. @PutMapping(value = "/audit/{appId}/{userId}")
  799. public AjaxResult startAudit(@PathVariable String appId, @PathVariable String userId){
  800. return success(takaiAisService.startAudit(appId, userId));
  801. }
  802. /**
  803. * 审核
  804. * @param params
  805. * @param appId
  806. * @return
  807. */
  808. @PutMapping("/updateDocumentAudit/{appId}")
  809. public AjaxResult updateAuditApplication(@RequestBody TakaiApplicationParams params, @PathVariable String appId) {
  810. int i = takaiAisService.updateAuditApplication(params, appId);
  811. return success(i);
  812. }
  813. /**
  814. * 根据登录用户获取项目下的应用列表
  815. * @return
  816. */
  817. @GetMapping("/project/app")//@RequestBody TakaiPageParams params
  818. public AjaxResult appFlag() {
  819. // TakaiApplication vo = setFlagParams(params.getUserId());
  820. // vo.setApprover(params.getUserId());
  821. LoginUser loginUser = SecurityUtils.getLoginUser();
  822. if(loginUser != null){
  823. TakaiApplication vo = setFlagParams(loginUser.getUserId(), null, null, 1);
  824. List<TakaiApplicationResult> s = takaiAisService.getApplicationList(vo);
  825. return success(takaiAisService.getChatAppList(s, loginUser.getUserId()));
  826. }else{
  827. return success(null);
  828. }
  829. }
  830. /**
  831. * 收藏列表
  832. * @param userId
  833. * @return
  834. */
  835. @GetMapping("/app/collect/list/{userId}")
  836. public AjaxResult appCollectList(@PathVariable String userId) {
  837. List<String> list = takaiAisService.selectAppCollectList(userId);
  838. return success(list);
  839. }
  840. /**
  841. * 收藏
  842. * @param appCollect
  843. * @return
  844. */
  845. @PostMapping("/app/collect")
  846. public AjaxResult appCollect(@RequestBody AppCollect appCollect) {
  847. LoginUser loginUser = SecurityUtils.getLoginUser();
  848. if(loginUser != null){
  849. appCollect.setUserId(loginUser.getUserId());
  850. return success(takaiAisService.insertAppCollect(appCollect));
  851. }else {
  852. return success(null);
  853. }
  854. }
  855. /**
  856. * 取消收藏
  857. * @param appId
  858. * @return
  859. */
  860. @DeleteMapping("/app/collect/{appId}")
  861. public AjaxResult appCollectDel(@PathVariable String appId) {
  862. LoginUser loginUser = SecurityUtils.getLoginUser();
  863. if(loginUser != null){
  864. return success(takaiAisService.deleteAppCollect(loginUser.getUserId(), appId));
  865. }else{
  866. return success(null);
  867. }
  868. }
  869. private TakaiApplication setFlagParams(String userId, String typeId, String projectId, int i) {
  870. if(i == 3){
  871. return returnParams(userId, typeId, projectId, "0");
  872. }else{
  873. // 角色集合
  874. SysUser user = new SysUser();
  875. user.setUserId(userId);
  876. Set<String> permissions = permissionService.getMenuPermission(user);
  877. if (permissions.contains("deepseek:application:create") || permissions.contains("deepseek:application:update")) {
  878. return returnParams(userId, typeId, projectId, "1");
  879. }else{
  880. return returnParams(userId, typeId, projectId, "0");
  881. }
  882. }
  883. }
  884. private TakaiApplication returnParams(String userId, String typeId, String projectId, String flag) {
  885. return TakaiApplication.builder().approver(userId == null ? null : userId)
  886. .typeId(typeId == null ? null : Long.valueOf(typeId))
  887. .projectId(projectId == null ? null : projectId)
  888. .flag(flag).build();
  889. }
  890. @GetMapping("/test")
  891. public AjaxResult test() {
  892. TakaiMediaReplacement vo = takaiAisService.getTakaiMediaReplacement();
  893. return success(vo);
  894. }
  895. @GetMapping("/download/{fileName}")
  896. public void downloadFile(@PathVariable String fileName) {
  897. try {
  898. // InputStream stream = minioUtil.download(bucketName, fileName);
  899. // 这里简化处理,实际应该设置正确的Content-Type和Content-Disposition
  900. // return ResponseEntity.ok()
  901. // .header("Content-Type", "application/octet-stream")
  902. // .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"")
  903. // .body(stream);
  904. } catch (Exception e) {
  905. logger.error("文件下载失败: " + e.getMessage());
  906. }
  907. }
  908. @DeleteMapping("/delete/{fileName}")
  909. public void deleteFile(@PathVariable String fileName) {
  910. try {
  911. // minioUtil.remove(bucketName, fileName);
  912. } catch (Exception e) {
  913. logger.error("文件删除失败: " + e.getMessage());
  914. }
  915. }
  916. }