TakaiAiController.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  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. * @return
  786. */
  787. @PutMapping(value = "/audit/{appId}/{userId}")
  788. public AjaxResult startAudit(@PathVariable String appId, @PathVariable String userId){
  789. return success(takaiAisService.startAudit(appId, userId));
  790. }
  791. /**
  792. * 审核
  793. * @param params
  794. * @param appId
  795. * @return
  796. */
  797. @PutMapping("/updateDocumentAudit/{appId}")
  798. public AjaxResult updateAuditApplication(@RequestBody TakaiApplicationParams params, @PathVariable String appId) {
  799. int i = takaiAisService.updateAuditApplication(params, appId);
  800. return success(i);
  801. }
  802. /**
  803. * 根据登录用户获取项目下的应用列表
  804. * @return
  805. */
  806. @GetMapping("/project/app")//@RequestBody TakaiPageParams params
  807. public AjaxResult appFlag() {
  808. // TakaiApplication vo = setFlagParams(params.getUserId());
  809. // vo.setApprover(params.getUserId());
  810. LoginUser loginUser = SecurityUtils.getLoginUser();
  811. if(loginUser != null){
  812. TakaiApplication vo = setFlagParams(loginUser.getUserId(), null, null, 1);
  813. List<TakaiApplicationResult> s = takaiAisService.getApplicationList(vo);
  814. return success(takaiAisService.getChatAppList(s, loginUser.getUserId()));
  815. }else{
  816. return success(null);
  817. }
  818. }
  819. /**
  820. * 收藏列表
  821. * @param userId
  822. * @return
  823. */
  824. @GetMapping("/app/collect/list/{userId}")
  825. public AjaxResult appCollectList(@PathVariable String userId) {
  826. List<String> list = takaiAisService.selectAppCollectList(userId);
  827. return success(list);
  828. }
  829. /**
  830. * 收藏
  831. * @param appCollect
  832. * @return
  833. */
  834. @PostMapping("/app/collect")
  835. public AjaxResult appCollect(@RequestBody AppCollect appCollect) {
  836. LoginUser loginUser = SecurityUtils.getLoginUser();
  837. if(loginUser != null){
  838. appCollect.setUserId(loginUser.getUserId());
  839. return success(takaiAisService.insertAppCollect(appCollect));
  840. }else {
  841. return success(null);
  842. }
  843. }
  844. /**
  845. * 取消收藏
  846. * @param appId
  847. * @return
  848. */
  849. @DeleteMapping("/app/collect/{appId}")
  850. public AjaxResult appCollectDel(@PathVariable String appId) {
  851. LoginUser loginUser = SecurityUtils.getLoginUser();
  852. if(loginUser != null){
  853. return success(takaiAisService.deleteAppCollect(loginUser.getUserId(), appId));
  854. }else{
  855. return success(null);
  856. }
  857. }
  858. private TakaiApplication setFlagParams(String userId, String typeId, String projectId, int i) {
  859. if(i == 3){
  860. return returnParams(userId, typeId, projectId, "0");
  861. }else{
  862. // 角色集合
  863. SysUser user = new SysUser();
  864. user.setUserId(userId);
  865. Set<String> permissions = permissionService.getMenuPermission(user);
  866. if (permissions.contains("deepseek:application:create") || permissions.contains("deepseek:application:update")) {
  867. return returnParams(userId, typeId, projectId, "1");
  868. }else{
  869. return returnParams(userId, typeId, projectId, "0");
  870. }
  871. }
  872. }
  873. private TakaiApplication returnParams(String userId, String typeId, String projectId, String flag) {
  874. return TakaiApplication.builder().approver(userId == null ? null : userId)
  875. .typeId(typeId == null ? null : Long.valueOf(typeId))
  876. .projectId(projectId == null ? null : projectId)
  877. .flag(flag).build();
  878. }
  879. @GetMapping("/test")
  880. public AjaxResult test() {
  881. TakaiMediaReplacement vo = takaiAisService.getTakaiMediaReplacement();
  882. return success(vo);
  883. }
  884. @GetMapping("/download/{fileName}")
  885. public void downloadFile(@PathVariable String fileName) {
  886. try {
  887. // InputStream stream = minioUtil.download(bucketName, fileName);
  888. // 这里简化处理,实际应该设置正确的Content-Type和Content-Disposition
  889. // return ResponseEntity.ok()
  890. // .header("Content-Type", "application/octet-stream")
  891. // .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"")
  892. // .body(stream);
  893. } catch (Exception e) {
  894. logger.error("文件下载失败: " + e.getMessage());
  895. }
  896. }
  897. @DeleteMapping("/delete/{fileName}")
  898. public void deleteFile(@PathVariable String fileName) {
  899. try {
  900. // minioUtil.remove(bucketName, fileName);
  901. } catch (Exception e) {
  902. logger.error("文件删除失败: " + e.getMessage());
  903. }
  904. }
  905. }