huiqi 1 месяц назад
Родитель
Сommit
a6e2339b14
80 измененных файлов с 2844 добавлено и 1135 удалено
  1. 4 4
      pom.xml
  2. 8 8
      takai-admin/src/main/java/com/takai/init/InitDataLoader.java
  3. 5 5
      takai-admin/src/main/java/com/takai/web/controller/system/SysDeptController.java
  4. 146 23
      takai-admin/src/main/java/com/takai/web/controller/system/SysLoginController.java
  5. 19 1
      takai-admin/src/main/java/com/takai/web/controller/system/SysUserController.java
  6. 117 13
      takai-admin/src/main/java/com/takai/web/controller/takaiai/TakaiAiController.java
  7. 58 25
      takai-admin/src/main/resources/application-dev.yml
  8. 129 0
      takai-admin/src/main/resources/application-takaitest.yml
  9. 129 0
      takai-admin/src/main/resources/application-test.yml
  10. 3 3
      takai-admin/src/main/resources/application.yml
  11. 5 0
      takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDialogDetailReqDTO.java
  12. 5 0
      takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDialogRespDTO.java
  13. 14 0
      takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDocumentDTO.java
  14. 16 0
      takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiSliceImage.java
  15. 17 170
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplication.java
  16. 9 158
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationParams.java
  17. 8 0
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationResult.java
  18. 18 0
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiFileInfo.java
  19. 20 69
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiKnowledge.java
  20. 10 46
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiKnowledgeParams.java
  21. 5 64
      takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiSseInfoParams.java
  22. 25 0
      takai-ai/src/main/java/com/takai/ai/domain/entity/VipApplication.java
  23. 25 0
      takai-ai/src/main/java/com/takai/ai/domain/entity/VipKnowledge.java
  24. 8 3
      takai-ai/src/main/java/com/takai/ai/mapper/TakaiApplicationMapper.java
  25. 14 0
      takai-ai/src/main/java/com/takai/ai/mapper/TakaiFileInfoMapper.java
  26. 10 3
      takai-ai/src/main/java/com/takai/ai/mapper/TakaiKnowledgeMapper.java
  27. 6 4
      takai-ai/src/main/java/com/takai/ai/service/ITakaiAiService.java
  28. 297 59
      takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java
  29. 180 0
      takai-ai/src/main/java/com/takai/ai/utils/SchematicNumberParser.java
  30. 121 15
      takai-ai/src/main/resources/mapper/takaiai/TakaiApplicationMapper.xml
  31. 7 3
      takai-ai/src/main/resources/mapper/takaiai/TakaiDialogMapper.xml
  32. 1 0
      takai-ai/src/main/resources/mapper/takaiai/TakaiDocumentMapper.xml
  33. 48 0
      takai-ai/src/main/resources/mapper/takaiai/TakaiFileInfoMapper.xml
  34. 65 7
      takai-ai/src/main/resources/mapper/takaiai/TakaiKnowledgeMapper.xml
  35. 4 104
      takai-bigmodel/src/main/java/com/takai/bigmodel/domain/entity/BmApplication.java
  36. 11 0
      takai-bigmodel/src/main/java/com/takai/bigmodel/domain/entity/BmMediaReplacement.java
  37. 7 6
      takai-bigmodel/src/main/resources/mapper/bm/BmApplicationMapper.xml
  38. 2 2
      takai-common/src/main/java/com/takai/common/constant/Constants.java
  39. 5 5
      takai-common/src/main/java/com/takai/common/core/domain/TreeSelect.java
  40. 24 0
      takai-common/src/main/java/com/takai/common/core/domain/TreeStruct.java
  41. 8 8
      takai-common/src/main/java/com/takai/common/core/domain/entity/SysDept.java
  42. 21 1
      takai-common/src/main/java/com/takai/common/core/domain/entity/SysUser.java
  43. 49 0
      takai-common/src/main/java/com/takai/common/core/domain/model/FrameLoginBody.java
  44. 30 0
      takai-common/src/main/java/com/takai/common/enums/AppTypeEnum.java
  45. 37 0
      takai-common/src/main/java/com/takai/common/enums/ProjectTypeEnum.java
  46. 15 2
      takai-common/src/main/java/com/takai/common/enums/UserTypeEnum.java
  47. 7 3
      takai-common/src/main/java/com/takai/common/utils/SecurityUtils.java
  48. 34 2
      takai-common/src/main/java/com/takai/common/utils/SnowflakeDigitGenerator.java
  49. 6 6
      takai-framework/src/main/java/com/takai/framework/config/SecurityConfig.java
  50. 229 0
      takai-framework/src/main/java/com/takai/framework/web/service/FrameLoginService.java
  51. 10 4
      takai-framework/src/main/java/com/takai/framework/web/service/JkLoginService.java
  52. 22 9
      takai-framework/src/main/java/com/takai/framework/web/service/SysLoginService.java
  53. 27 2
      takai-framework/src/main/java/com/takai/framework/web/service/TokenService.java
  54. 6 0
      takai-system/pom.xml
  55. 71 0
      takai-system/src/main/java/com/takai/system/domain/SysClient.java
  56. 5 50
      takai-system/src/main/java/com/takai/system/domain/SysProject.java
  57. 29 0
      takai-system/src/main/java/com/takai/system/domain/SysProjectTree.java
  58. 22 0
      takai-system/src/main/java/com/takai/system/mapper/SysClientMapper.java
  59. 23 23
      takai-system/src/main/java/com/takai/system/mapper/SysDeptMapper.java
  60. 9 2
      takai-system/src/main/java/com/takai/system/mapper/SysProjectAppMapper.java
  61. 8 0
      takai-system/src/main/java/com/takai/system/mapper/SysProjectMapper.java
  62. 17 8
      takai-system/src/main/java/com/takai/system/mapper/SysProjectStaffMapper.java
  63. 37 13
      takai-system/src/main/java/com/takai/system/mapper/SysUserMapper.java
  64. 25 0
      takai-system/src/main/java/com/takai/system/service/ISysClientService.java
  65. 21 21
      takai-system/src/main/java/com/takai/system/service/ISysDeptService.java
  66. 2 0
      takai-system/src/main/java/com/takai/system/service/ISysProjectService.java
  67. 15 8
      takai-system/src/main/java/com/takai/system/service/ISysProjectStaffService.java
  68. 32 23
      takai-system/src/main/java/com/takai/system/service/ISysUserService.java
  69. 2 2
      takai-system/src/main/java/com/takai/system/service/impl/JkApiServiceImpl.java
  70. 35 0
      takai-system/src/main/java/com/takai/system/service/impl/SysClientServiceImpl.java
  71. 29 29
      takai-system/src/main/java/com/takai/system/service/impl/SysDeptServiceImpl.java
  72. 66 13
      takai-system/src/main/java/com/takai/system/service/impl/SysProjectServiceImpl.java
  73. 21 8
      takai-system/src/main/java/com/takai/system/service/impl/SysProjectStaffServiceImpl.java
  74. 65 29
      takai-system/src/main/java/com/takai/system/service/impl/SysUserServiceImpl.java
  75. 28 0
      takai-system/src/main/resources/mapper/system/SysClientMapper.xml
  76. 25 25
      takai-system/src/main/resources/mapper/system/SysDeptMapper.xml
  77. 7 3
      takai-system/src/main/resources/mapper/system/SysProjectAppMapper.xml
  78. 32 13
      takai-system/src/main/resources/mapper/system/SysProjectMapper.xml
  79. 30 6
      takai-system/src/main/resources/mapper/system/SysProjectStaffMapper.xml
  80. 82 22
      takai-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 4 - 4
pom.xml

@@ -3,14 +3,14 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
-	
+
     <groupId>com.takai</groupId>
     <artifactId>takai</artifactId>
     <version>1.0.0</version>
 
     <name>takai</name>
     <description>TK管理系统</description>
-    
+
     <properties>
         <takai.version>1.0.0</takai.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -30,7 +30,7 @@
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
     </properties>
-	
+
     <!-- 依赖声明 -->
     <dependencyManagement>
         <dependencies>
@@ -249,4 +249,4 @@
         </pluginRepository>
     </pluginRepositories>
 
-</project>
+</project>

+ 8 - 8
takai-admin/src/main/java/com/takai/init/InitDataLoader.java

@@ -33,16 +33,16 @@ public class InitDataLoader implements CommandLineRunner {
     }
 
     private void loadData() {
-        System.out.println("========================初始化智谱信息()");
-        bigModelService.initZhiPuInfo();
-        System.out.println("========================初始化智谱信息结束()");
-
-        System.out.println("========================初始化DeepSeek信息()");
-        takaiService.initDeepseekInfo();
-        System.out.println("========================初始化DeepSeek信息结束()");
+//        System.out.println("========================初始化智谱信息()");
+//        bigModelService.initZhiPuInfo();
+//        System.out.println("========================初始化智谱信息结束()");
+//
+//        System.out.println("========================初始化DeepSeek信息()");
+//        takaiService.initDeepseekInfo();
+//        System.out.println("========================初始化DeepSeek信息结束()");
 
         log.info("===================获取建科统一用户平台信息Job开始执行==============");
-        threadPoolTaskExecutor.execute(() -> syncJkData());
+//        threadPoolTaskExecutor.execute(() -> syncJkData());
 
         log.info("===================获取建科统一用户平台信息Job执行结束==============");
     }

+ 5 - 5
takai-admin/src/main/java/com/takai/web/controller/system/SysDeptController.java

@@ -24,7 +24,7 @@ import com.takai.system.service.ISysDeptService;
 
 /**
  * 部门信息
- * 
+ *
  * @author takai
  */
 @RestController
@@ -53,7 +53,7 @@ public class SysDeptController extends BaseController
     public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
     {
         List<SysDept> depts = deptService.selectDeptList(new SysDept());
-        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
+        depts.removeIf(d -> d.getDeptId().equals(deptId) || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
         return success(depts);
     }
 
@@ -62,7 +62,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:query')")
     @GetMapping(value = "/{deptId}")
-    public AjaxResult getInfo(@PathVariable Long deptId)
+    public AjaxResult getInfo(@PathVariable String deptId)
     {
         deptService.checkDeptDataScope(deptId);
         return success(deptService.selectDeptById(deptId));
@@ -92,7 +92,7 @@ public class SysDeptController extends BaseController
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysDept dept)
     {
-        Long deptId = dept.getDeptId();
+        String deptId = dept.getDeptId();
         deptService.checkDeptDataScope(deptId);
         if (!deptService.checkDeptNameUnique(dept))
         {
@@ -116,7 +116,7 @@ public class SysDeptController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")
     @Log(title = "部门管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{deptId}")
-    public AjaxResult remove(@PathVariable Long deptId)
+    public AjaxResult remove(@PathVariable String deptId)
     {
         if (deptService.hasChildByDeptId(deptId))
         {

+ 146 - 23
takai-admin/src/main/java/com/takai/web/controller/system/SysLoginController.java

@@ -5,9 +5,19 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.takai.common.utils.StringUtils;
-import com.takai.framework.web.service.JkLoginService;
+import com.takai.common.core.domain.entity.SysRole;
+import com.takai.common.core.domain.model.FrameLoginBody;
+import com.takai.common.core.domain.model.LoginUser;
+import com.takai.common.enums.UserTypeEnum;
+import com.takai.framework.web.service.*;
+import com.takai.system.domain.SysClient;
+import com.takai.system.service.ISysClientService;
+import com.takai.system.service.ISysRoleService;
+import com.takai.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import com.takai.common.constant.Constants;
 import com.takai.common.core.domain.AjaxResult;
@@ -15,17 +25,20 @@ import com.takai.common.core.domain.entity.SysMenu;
 import com.takai.common.core.domain.entity.SysUser;
 import com.takai.common.core.domain.model.LoginBody;
 import com.takai.common.utils.SecurityUtils;
-import com.takai.framework.web.service.SysLoginService;
-import com.takai.framework.web.service.SysPermissionService;
 import com.takai.system.service.ISysMenuService;
 
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+
 import javax.servlet.http.HttpServletRequest;
 
 /**
  * 登录验证
- * 
+ *
  * @author takai
  */
+@Slf4j
 @RestController
 public class SysLoginController
 {
@@ -41,9 +54,25 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysClientService clientService;
+
+    @Autowired
+    private FrameLoginService frameLoginService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
+
     /**
      * 登录方法
-     * 
+     *
      * @param loginBody 登录信息
      * @return 结果
      */
@@ -52,10 +81,11 @@ public class SysLoginController
     {
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
-//        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+//        String token = loginService.login(loginBody.getUserName(), loginBody.getPassword(), loginBody.getCode(),
 //                loginBody.getUuid());
 //        ajax.put(Constants.TOKEN, token);
-        Map<String, Object> map  = loginService.login(loginBody.getUserName(), loginBody.getPassword());
+        Map<String, Object> map  = loginService.loginInfo(loginBody.getUserName(), loginBody.getPassword(), loginBody.getCode(),
+                loginBody.getUuid());
         ajax.put("data", map);
         return ajax;
     }
@@ -75,6 +105,70 @@ public class SysLoginController
         return ajax;
     }
 
+    /**
+     * 建科Frame登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @PostMapping("/frame_login")
+    public AjaxResult frameLogin(@RequestBody FrameLoginBody loginBody)
+    {
+        log.info("登录请求参数:{}", loginBody.toString());
+        AjaxResult ajax = AjaxResult.success();
+        String username = loginBody.getUserName();
+        String sign = loginBody.getSignature();
+        String workSpaceId = loginBody.getWorkspaceId();
+        String workSpaceName = loginBody.getWorkspaceName();
+        String clientId = loginBody.getClientId();
+        String timestamp = loginBody.getTimestamp();
+        if(!org.springframework.util.StringUtils.hasText(username)
+                || !org.springframework.util.StringUtils.hasText(sign)
+                || !org.springframework.util.StringUtils.hasText(workSpaceId)
+                || !org.springframework.util.StringUtils.hasText(workSpaceName)
+                || !StringUtils.hasText(clientId)
+                || timestamp == null) {
+            return AjaxResult.error(HttpStatus.BAD_REQUEST.value(),"无效的参数");
+        }
+
+        //检查ClientId是否存在
+        SysClient client = clientService.selectSysClientById(loginBody.getClientId());
+        if(client == null) {
+            return AjaxResult.error(HttpStatus.BAD_REQUEST.value(),"无效的client_id");
+        }
+
+        long btwTime = System.currentTimeMillis() - Long.valueOf(timestamp);
+
+        // Step 3: Check if the difference is greater than 5 minutes
+        boolean isMoreThanFiveMinutes = btwTime > 5 * 1000 * 60;
+        if (isMoreThanFiveMinutes) {
+            return AjaxResult.error(HttpStatus.BAD_REQUEST.value(),"请求已过期,请重新发起请求");
+        }
+        if (sign != null) {
+            String dataInput  = clientId+timestamp+username+workSpaceId+workSpaceName;
+            String generatedHash = DigestUtil.sha256Hex(dataInput.toUpperCase()+client.getClientSecret());
+            if(!StrUtil.equals(generatedHash, sign)) {
+                return AjaxResult.error(HttpStatus.UNAUTHORIZED.value(),"签名验证失败");
+            }
+        } else {
+            return AjaxResult.error(HttpStatus.UNAUTHORIZED.value(),"无效的签名");
+        }
+        Map<String, Object> map  = frameLoginService.login(loginBody);
+        ajax.put("data", map);
+        return ajax;
+    }
+
+    public static void main(String[] args) {
+        //String dataInput  = clientId+timestamp+username+workSpaceId+workSpaceName;
+        String timestamp = String.valueOf(System.currentTimeMillis());
+        System.out.println(timestamp);
+        String dataInput = "a34851c530ee0d07d1154beb47bb93dd" + timestamp + "admin" + "123456" + "测试项目";
+        String generatedHash = DigestUtil.sha256Hex(dataInput.toUpperCase()+"ac0cbba971ab11f089870250f2000002");
+        System.out.println(generatedHash);
+    }
+
+
+
     /**
      * 登录方法
      *
@@ -93,27 +187,30 @@ public class SysLoginController
 
     /**
      * 获取用户信息
-     * 
+     *
      * @return 用户信息
      */
     @GetMapping("/getInfo")
-    public AjaxResult getInfo()
-    {
-        SysUser user = SecurityUtils.getLoginUser().getUser();
-        // 角色集合
-        Set<String> roles = permissionService.getRolePermission(user);
-        // 权限集合
-        Set<String> permissions = permissionService.getMenuPermission(user);
+    public AjaxResult getInfo() {
         AjaxResult ajax = AjaxResult.success();
-        ajax.put("user", user);
-        ajax.put("roles", roles);
-        ajax.put("permissions", permissions);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (loginUser != null) {
+        SysUser user = loginUser.getUser();
+            // 角色集合
+            Set<String> roles = permissionService.getRolePermission(user);
+            // 权限集合
+            Set<String> permissions = permissionService.getMenuPermission(user);
+
+            ajax.put("user", user);
+            ajax.put("roles", roles);
+            ajax.put("permissions", permissions);
+        }
         return ajax;
     }
 
     /**
      * 获取路由信息
-     * 
+     *
      * @return 路由信息
      */
     @GetMapping("/getRouters")
@@ -129,17 +226,43 @@ public class SysLoginController
      * @param token
      * @return
      */
-    @GetMapping("/checkToken")
-    public AjaxResult checkToken(@RequestHeader String token){
+    @GetMapping("/checkToken/{token}")
+    public AjaxResult checkToken(@PathVariable("token")  String token){
         boolean status = loginService.checkToken(token);
+        log.info("checkToken:status:" + status);
         if(status){
+            LoginUser loginUser = tokenService.getLoginUser(token);
+            log.info("checkToken:loginUser"+loginUser);
+            SysUser user = loginUser.getUser();
+            // 角色集合
+            Set<String> roles = permissionService.getRolePermission(user);
+            //非系统用户,没有分配角色的,默认分配普通用户角色
+            if(roles.isEmpty() && !UserTypeEnum.SYS_USER.getCode().equals(user.getUserType())) {
+                userService.insertUserAuth(user.getUserId(),new Long[]{2L});
+                List<SysRole> userRoles = roleService.selectRolesByUserId(user.getUserId());
+                user.setRoles(userRoles);
+            }
+            // 权限集合
+            Set<String> permissions = permissionService.getMenuPermission(user);
+            //临时策略,建科用户默认所有权限
+//            if(UserTypeEnum.JK_USER.getCode().equals(user.getUserType())) {
+//                if(roles.isEmpty()) {
+//                    roles.add("admin");
+//                }
+//                if(permissions.isEmpty()) {
+//                    permissions.add("*:*:*");
+//                }
+//            }
             AjaxResult ajax = AjaxResult.success();
             Map<String, Object> map = new HashMap();
             map.put("status", status);
             ajax.put("data", map);
+            ajax.put("user", user);
+            ajax.put("roles", roles);
+            ajax.put("permissions", permissions);
             return ajax;
         }else{
-            AjaxResult ajax = AjaxResult.errors("请求访问:/checkToken,认证失败,无法访问系统资源", null);
+            AjaxResult ajax = AjaxResult.errors("Token,认证失败", null);
             return ajax;
         }
     }

+ 19 - 1
takai-admin/src/main/java/com/takai/web/controller/system/SysUserController.java

@@ -3,6 +3,9 @@ package com.takai.web.controller.system;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+import com.takai.common.enums.UserTypeEnum;
+import com.takai.common.exception.ServiceException;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -34,7 +37,7 @@ import com.takai.system.service.ISysUserService;
 
 /**
  * 用户信息
- * 
+ *
  * @author takai
  */
 @RestController
@@ -65,6 +68,14 @@ public class SysUserController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/appVipList")
+    public TableDataInfo selectAppVipList(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUserForAppVipList(user);
+        return getDataTable(list);
+    }
+
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")
@@ -191,6 +202,13 @@ public class SysUserController extends BaseController
     public AjaxResult resetPwd(@RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
+
+        if(StringUtils.isEmpty(user.getUserType())) {
+            SysUser tempUser = userService.selectUserById(user.getUserId());
+            if(!UserTypeEnum.SYS_USER.getCode().equals(tempUser.getUserType())) {
+                throw new ServiceException("非系统用户不能重置密码!");
+            }
+        }
         userService.checkUserDataScope(user.getUserId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         user.setUpdateBy(getUsername());

+ 117 - 13
takai-admin/src/main/java/com/takai/web/controller/takaiai/TakaiAiController.java

@@ -5,6 +5,7 @@ import com.github.pagehelper.Page;
 import com.github.pagehelper.PageHelper;
 import com.takai.ai.domain.dto.TakaiDialogReqDTO;
 import com.takai.ai.domain.dto.TakaiQuestionDTO;
+import com.takai.ai.domain.dto.TakaiSliceImage;
 import com.takai.ai.domain.entity.*;
 import com.takai.ai.service.ITakaiAiService;
 import com.takai.bigmodel.domain.entity.PageParams;
@@ -12,17 +13,22 @@ import com.takai.common.annotation.Log;
 import com.takai.common.constant.HttpStatus;
 import com.takai.common.core.controller.BaseController;
 import com.takai.common.core.domain.AjaxResult;
+import com.takai.common.core.domain.TreeStruct;
 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.page.TableDataInfo;
 import com.takai.ai.domain.dto.TakaiDialogRespDTO;
 import com.takai.common.enums.BusinessType;
+import com.takai.common.enums.ProjectTypeEnum;
 import com.takai.common.exception.ServiceException;
 import com.takai.common.utils.SecurityUtils;
 import com.takai.common.utils.poi.ExcelUtil;
 import com.takai.framework.web.service.SysPermissionService;
+import com.takai.system.domain.SysProject;
+import com.takai.system.domain.SysProjectTree;
 import com.takai.system.service.ISysDictDataService;
+import com.takai.system.service.ISysProjectService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +56,9 @@ public class TakaiAiController extends BaseController {
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysProjectService sysProjectService;
+
     /**
      * 对话聊天
      *
@@ -69,6 +78,11 @@ public class TakaiAiController extends BaseController {
         return success(takaiAisService.asyncCompletions(params));
     }
 
+    @PostMapping("/free/async/completions")
+    public AjaxResult freeAsyncCompletions(@RequestBody TakaiCompletionsParams params) {
+        return asyncCompletions(params);
+    }
+
     /**
      * 应用列表
      *
@@ -78,10 +92,10 @@ public class TakaiAiController extends BaseController {
     @PostMapping("/getApplicationList")
     public TableDataInfo getApplicationList(@RequestBody TakaiPageParams params) {
         TakaiApplication vo = setFlagParams(params.getUserId(), params.getTypeId(), params.getProjectId(), 1);
-        List<TakaiApplicationResult> s = takaiAisService.getApplicationList(vo);
         PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
         List<TakaiApplicationResult> list = takaiAisService.getApplicationList(vo);
-        return getDataTableResultTotal(list, Long.valueOf(s.size()));
+        Page<TakaiApplicationResult> page = (Page<TakaiApplicationResult>) list;
+        return getDataTableResultTotal(list, page.getTotal());
     }
 
     /**
@@ -351,7 +365,7 @@ public class TakaiAiController extends BaseController {
                                      @PathVariable String knowledgeId,
                                      @PathVariable String documentId) throws Exception {
         try {
-            List<String> originTextList = takaiAisService.uploadSliceImage(files, knowledgeId, documentId);
+            List<TakaiSliceImage> originTextList = takaiAisService.uploadSliceImage(files, knowledgeId, documentId);
             return success(originTextList);
         } catch (Exception e) {
             return error(e.getMessage());
@@ -440,18 +454,32 @@ public class TakaiAiController extends BaseController {
      */
     @PostMapping("/chatHistory/list")
     public TableDataInfo dataExportList(@RequestBody TakaiPageParams params) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String userId = null;
+        boolean isAdmin = false;
+        if (loginUser != null) {
+            userId = loginUser.getUserId();
+            isAdmin = SecurityUtils.isAdmin(Long.valueOf(userId));
+        }
+        if(isAdmin) {
+            userId = null;
+        } else {
+            userId = params.getUserId() == null ? userId : params.getUserId();
+        }
         if (StringUtils.isNotBlank(params.getAppId())) {
             //获取应用聊天列表
-            List<Object> s = takaiAisService.selectDialogListByAppId(params.getAppId(), params.getUserId());
             PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
-            List<Object> list = takaiAisService.selectDialogListByAppId(params.getAppId(), params.getUserId());
-            return getDataTableResultTotal(list, Long.valueOf(s.size()));
+            List<TakaiDialogRespDTO> list = takaiAisService.selectDialogListByAppId(params.getAppId(), userId);
+            List<Object> result = takaiAisService.setDialogList(list);
+            Page<TakaiDialogRespDTO> page = (Page<TakaiDialogRespDTO>) list;
+            return getDataTableResultTotal(result, page.getTotal());
         } else {
             //获取所有列表
-            List<Object> s = takaiAisService.selectDialogListByAppId(null, null);
             PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
-            List<Object> list = takaiAisService.selectDialogListByAppId(null, null);
-            return getDataTableResultTotal(list, Long.valueOf(s.size()));
+            List<TakaiDialogRespDTO> list = takaiAisService.selectDialogListByAppId(null, userId);
+            List<Object> result = takaiAisService.setDialogList(list);
+            Page<TakaiDialogRespDTO> page = (Page<TakaiDialogRespDTO>) list;
+            return getDataTableResultTotal(result, page.getTotal());
         }
     }
 
@@ -518,8 +546,8 @@ public class TakaiAiController extends BaseController {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         if (loginUser != null) {
             dialogReqDTO.setUserId(loginUser.getUserId());
-            takaiAisService.saveDialog(dialogReqDTO);
         }
+        takaiAisService.saveDialog(dialogReqDTO);
         return success();
     }
 
@@ -531,11 +559,13 @@ public class TakaiAiController extends BaseController {
     @GetMapping("/dialog/list/{appId}")
     public AjaxResult dialogList(@PathVariable String appId) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
+        String userId = null;
         if (loginUser != null) {
-            List<Object> dialogs = takaiAisService.getDialogList(appId, loginUser.getUserId());
-            return success(dialogs);
+            userId = loginUser.getUserId();
+
         }
-        return success(null);
+        List<Object> dialogs = takaiAisService.getDialogList(appId, userId);
+        return success(dialogs);
     }
 
     /**
@@ -590,6 +620,17 @@ public class TakaiAiController extends BaseController {
         return success(strList);
     }
 
+    /**
+     * 预设问题
+     *
+     * @param appId
+     * @return
+     */
+    @GetMapping("/free/presets/{appId}")
+    public AjaxResult freePresets(@PathVariable String appId) {
+        return presets(appId);
+    }
+
     /**
      * 新增切片
      *
@@ -645,11 +686,27 @@ public class TakaiAiController extends BaseController {
         return getDataTableResultTotal(sliceList, sortedChunkIds.size());
     }
 
+    /**
+     * 获取聊天切片列表
+     *
+     * @param params
+     * @return
+     */
+    @PostMapping("/free/slicePage")
+    public TableDataInfo freeDataExportList(@RequestBody SlicePageInfo params) {
+        return dataExportList(params);
+    }
+
     @GetMapping("/slice/search/{id}")
     public AjaxResult searchSlice(@PathVariable String id) {
         return success(takaiAisService.searchSlice(id));
     }
 
+    @GetMapping("/free/slice/search/{id}")
+    public AjaxResult freeSearchSlice(@PathVariable String id) {
+        return searchSlice(id);
+    }
+
     /**
      *
      * 类型列表
@@ -664,6 +721,53 @@ public class TakaiAiController extends BaseController {
         return success(dictDataList);
     }
 
+    /**
+     *
+     * 类型列表
+     * @param
+     * @return
+     */
+    @GetMapping(value = "/projectTree")
+    public AjaxResult getPorjectTree() {
+        SysDictData dictData = new SysDictData();
+        dictData.setDictType("project_type");
+        List<SysDictData> dictDataList = dictDataService.selectDictDataList(dictData);
+        List<SysProject> projectList = sysProjectService.selectSysProjectList(null);
+        logger.info("getPorjectTree:projectList:"+projectList.size());
+        List<TreeStruct> projectTreeList = new ArrayList<>();
+        for(SysDictData dict : dictDataList) {
+            logger.info("getPorjectTree:dict:"+dict);
+            String clientId;
+            if(ProjectTypeEnum.HJL.getCode().equals(String.valueOf(dict.getDictValue()))) {
+                clientId = ProjectTypeEnum.HJL.getClientId();
+            } else if (ProjectTypeEnum.HXG.getCode().equals(String.valueOf(dict.getDictValue()))) {
+                clientId = ProjectTypeEnum.HXG.getClientId();
+            } else {
+                clientId = "";
+            }
+            logger.info("getPorjectTree:clientId:"+clientId);
+            TreeStruct projectType = new TreeStruct();
+            projectType.setValue(clientId);
+            projectType.setLabel(dict.getDictLabel());
+            List<SysProject> filteredProjects = projectList.stream()
+                    .filter(project -> clientId.equals(project.getSourceFrom()))
+                    .collect(Collectors.toList());
+
+            List<TreeStruct> children = new ArrayList<>();
+            for(SysProject project : filteredProjects) {
+                TreeStruct child = new TreeStruct();
+                child.setValue(String.valueOf(project.getProjectId()));
+                child.setLabel(project.getProjectName());
+                children.add(child);
+            }
+            projectType.setChildren(children);
+            projectTreeList.add(projectType);
+        }
+
+
+        return success(projectTreeList);
+    }
+
     /**
      * 应用类型列表
      * @return

+ 58 - 25
takai-admin/src/main/resources/application-dev.yml

@@ -42,7 +42,7 @@ spring:
             testWhileIdle: true
             testOnBorrow: false
             testOnReturn: false
-            webStatFilter: 
+            webStatFilter:
                 enabled: true
             statViewServlet:
                 enabled: true
@@ -70,27 +70,60 @@ spring:
             hibernate:
                 dialect: org.hibernate.dialect.MySQL8Dialect
                 format_sql: true
-
-jk:
-    #Appid
-    iamAppid: e971e84b574c40b2
-    #Appsecret
-    iamAppsecret: 51e7f274f71f4887b25015fc0743e871
-    #clientID
-    iamClientID: e97f94cf93761f4d69e8
-    #clientSecret
-    iamClientSecret: 13845f824b5d9f4f2a58159109aac317263d
-    #用户接口url
-    iamUserUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/list
-    #用户回调接口,每次用户接口调用成功后都要回调一次接口
-    iamCallbackUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/callback
-    #部门接口url
-    iamDeptUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/org/listAll
-    #岗位接口url
-    iamPostUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/job/listAll
-    #code换取tokenurl
-    iamTokenUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/accessToken
-    #token换取用户信息
-    iamProfileUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/profile
-    #虚拟密码
-    jkPsw: GybjcxhDe8XQtabXVP1A
+deepseek:
+    #base url
+    baseurl: http://xia0miduo.gicp.net:6001
+#    baseurl: http://192.168.3.209:18079
+    #创建知识库
+    createKnowledge: /rag/create_collection
+    #删除知识库
+    deleteKnowledge: /rag/delete_knowledge
+    #获取切片列表
+    slicePage: /rag/search_word
+    #删除切片
+    deleteSlice: /rag/delete_slice
+    #切片详情
+    sliceDetail: /rag/search
+    #编辑切片信息
+    updateSlice: /rag/update_slice
+    #上传文件
+    uploadKnowledge: /upload_knowledge
+    #聊天
+    chat: /rag/chat
+    #异步提示词(还想问)
+    asyncCompletions: /rag/query
+    #删除知识文件
+    deleteDoc: /rag/delete_doc
+    #新增切片
+    addSlice: /rag/insert_slice
+    #获取排序切片列表
+    searchSlice: /rag/slice/search
+    #联网搜索结果
+    webSearch: /web/search
+    #deepseek单独聊天
+    baseChat: http://xia0miduo.gicp.net:6001
+    #提示词
+    prompt: 你是总结和提问大师。你只根据用户的对话记录,根据对话记录生成可能会问的问题,不要杜撰问题。问题的答案必须来自上面的对话记录。 你必须遵守以下要求:1. 不要输出用户问过的问题;2. 你需要输出3个问题供用户选择。3. 你只需要输出问题,不需要解释,不需要提问。4. 你的问题可以是空的,但你不能杜撰问题。5. 问题需要站在使用这个应用的人的视角提出,因此你要注意提问的语气和人称代词。不要用您这个字。6.生成的问题,必须能从提供的对话记录中找到答案。你一定要按照以下格式输出:{'问题':['xxx','xxx','xxx']}
+#jk:
+#    #Appid
+#    iamAppid: e971e84b574c40b2
+#    #Appsecret
+#    iamAppsecret: 51e7f274f71f4887b25015fc0743e871
+#    #clientID
+#    iamClientID: e97f94cf93761f4d69e8
+#    #clientSecret
+#    iamClientSecret: 13845f824b5d9f4f2a58159109aac317263d
+#    #用户接口url
+#    iamUserUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/list
+#    #用户回调接口,每次用户接口调用成功后都要回调一次接口
+#    iamCallbackUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/callback
+#    #部门接口url
+#    iamDeptUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/org/listAll
+#    #岗位接口url
+#    iamPostUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/job/listAll
+#    #code换取tokenurl
+#    iamTokenUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/accessToken
+#    #token换取用户信息
+#    iamProfileUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/profile
+#    #虚拟密码
+#    jkPsw: GybjcxhDe8XQtabXVP1A

+ 129 - 0
takai-admin/src/main/resources/application-takaitest.yml

@@ -0,0 +1,129 @@
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://xia0miduo.gicp.net:3336/deepseek_local?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: root
+                password: T@kai2025
+                hikari:
+                    pool-name: master-Pool
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                url: jdbc:mysql://localhost:3306/chat_zhipu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: root
+                password: T@kai2025
+                hikari:
+                    pool-name: slave-Pool
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置连接超时时间
+            connectTimeout: 30000
+            # 配置网络超时时间
+            socketTimeout: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username: takai
+                login-password: 123456
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true
+    jpa:
+        hibernate:
+            ddl-auto: update
+        show-sql: true
+        properties:
+            hibernate:
+                dialect: org.hibernate.dialect.MySQL8Dialect
+                format_sql: true
+deepseek:
+    #base url
+    baseurl: http://xia0miduo.gicp.net:6001
+#    baseurl: http://192.168.3.209:18079
+    #创建知识库
+    createKnowledge: /rag/create_collection
+    #删除知识库
+    deleteKnowledge: /rag/delete_knowledge
+    #获取切片列表
+    slicePage: /rag/search_word
+    #删除切片
+    deleteSlice: /rag/delete_slice
+    #切片详情
+    sliceDetail: /rag/search
+    #编辑切片信息
+    updateSlice: /rag/update_slice
+    #上传文件
+    uploadKnowledge: /upload_knowledge
+    #聊天
+    chat: /rag/chat
+    #异步提示词(还想问)
+    asyncCompletions: /rag/query
+    #删除知识文件
+    deleteDoc: /rag/delete_doc
+    #新增切片
+    addSlice: /rag/insert_slice
+    #获取排序切片列表
+    searchSlice: /rag/slice/search
+    #联网搜索结果
+    webSearch: /web/search
+    #deepseek单独聊天
+    baseChat: http://xia0miduo.gicp.net:6001
+    #提示词
+    prompt: 你是总结和提问大师。你只根据用户的对话记录,根据对话记录生成可能会问的问题,不要杜撰问题。问题的答案必须来自上面的对话记录。 你必须遵守以下要求:1. 不要输出用户问过的问题;2. 你需要输出3个问题供用户选择。3. 你只需要输出问题,不需要解释,不需要提问。4. 你的问题可以是空的,但你不能杜撰问题。5. 问题需要站在使用这个应用的人的视角提出,因此你要注意提问的语气和人称代词。不要用您这个字。6.生成的问题,必须能从提供的对话记录中找到答案。你一定要按照以下格式输出:{'问题':['xxx','xxx','xxx']}
+#jk:
+#    #Appid
+#    iamAppid: e971e84b574c40b2
+#    #Appsecret
+#    iamAppsecret: 51e7f274f71f4887b25015fc0743e871
+#    #clientID
+#    iamClientID: e97f94cf93761f4d69e8
+#    #clientSecret
+#    iamClientSecret: 13845f824b5d9f4f2a58159109aac317263d
+#    #用户接口url
+#    iamUserUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/list
+#    #用户回调接口,每次用户接口调用成功后都要回调一次接口
+#    iamCallbackUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/callback
+#    #部门接口url
+#    iamDeptUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/org/listAll
+#    #岗位接口url
+#    iamPostUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/job/listAll
+#    #code换取tokenurl
+#    iamTokenUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/accessToken
+#    #token换取用户信息
+#    iamProfileUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/profile
+#    #虚拟密码
+#    jkPsw: GybjcxhDe8XQtabXVP1A

+ 129 - 0
takai-admin/src/main/resources/application-test.yml

@@ -0,0 +1,129 @@
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://localhost:3306/chat_deepseek?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: root
+                password: 8&XiMO0r#l99
+                hikari:
+                    pool-name: master-Pool
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                url: jdbc:mysql://localhost:3306/chat_deepseek?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: root
+                password: 8&XiMO0r#l99
+                hikari:
+                    pool-name: slave-Pool
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置连接超时时间
+            connectTimeout: 30000
+            # 配置网络超时时间
+            socketTimeout: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username: takai
+                login-password: 123456
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true
+    jpa:
+        hibernate:
+            ddl-auto: update
+        show-sql: true
+        properties:
+            hibernate:
+                dialect: org.hibernate.dialect.MySQL8Dialect
+                format_sql: true
+deepseek:
+    #base url
+    baseurl: http://xia0miduo.gicp.net:6001
+    #  baseurl: http://192.168.3.209:18078
+    #创建知识库
+    createKnowledge: /rag/create_collection
+    #删除知识库
+    deleteKnowledge: /rag/delete_knowledge
+    #获取切片列表
+    slicePage: /rag/search_word
+    #删除切片
+    deleteSlice: /rag/delete_slice
+    #切片详情
+    sliceDetail: /rag/search
+    #编辑切片信息
+    updateSlice: /rag/update_slice
+    #上传文件
+    uploadKnowledge: /upload_knowledge
+    #聊天
+    chat: /rag/chat
+    #异步提示词(还想问)
+    asyncCompletions: /rag/query
+    #删除知识文件
+    deleteDoc: /rag/delete_doc
+    #新增切片
+    addSlice: /rag/insert_slice
+    #获取排序切片列表
+    searchSlice: /rag/slice/search
+    #联网搜索结果
+    webSearch: /web/search
+    #deepseek单独聊天
+    baseChat: http://xia0miduo.gicp.net:6001
+    #提示词
+    prompt: 你是总结和提问大师。你只根据用户的对话记录,根据对话记录生成可能会问的问题,不要杜撰问题。问题的答案必须来自上面的对话记录。 你必须遵守以下要求:1. 不要输出用户问过的问题;2. 你需要输出3个问题供用户选择。3. 你只需要输出问题,不需要解释,不需要提问。4. 你的问题可以是空的,但你不能杜撰问题。5. 问题需要站在使用这个应用的人的视角提出,因此你要注意提问的语气和人称代词。不要用您这个字。6.生成的问题,必须能从提供的对话记录中找到答案。你一定要按照以下格式输出:{'问题':['xxx','xxx','xxx']}
+#jk:
+#    #Appid
+#    iamAppid: e971e84b574c40b2
+#    #Appsecret
+#    iamAppsecret: 51e7f274f71f4887b25015fc0743e871
+#    #clientID
+#    iamClientID: e97f94cf93761f4d69e8
+#    #clientSecret
+#    iamClientSecret: 13845f824b5d9f4f2a58159109aac317263d
+#    #用户接口url
+#    iamUserUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/list
+#    #用户回调接口,每次用户接口调用成功后都要回调一次接口
+#    iamCallbackUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/account/callback
+#    #部门接口url
+#    iamDeptUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/org/listAll
+#    #岗位接口url
+#    iamPostUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/job/listAll
+#    #code换取tokenurl
+#    iamTokenUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/accessToken
+#    #token换取用户信息
+#    iamProfileUrl: https://esctest.sribs.com.cn/esc-sso/oauth2.0/profile
+#    #虚拟密码
+#    jkPsw: GybjcxhDe8XQtabXVP1A

+ 3 - 3
takai-admin/src/main/resources/application.yml

@@ -18,7 +18,7 @@ takai:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8091
+  port: 8090
   servlet:
     # 应用的访问路径
     context-path: /
@@ -54,7 +54,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: dev
+    active: takaitest
   # 文件上传
   servlet:
     multipart:
@@ -66,7 +66,7 @@ spring:
   devtools:
     restart:
       # 热部署开关
-      enabled: true
+      enabled: false
   # redis 配置
   redis:
     # 地址

+ 5 - 0
takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDialogDetailReqDTO.java

@@ -3,6 +3,7 @@ package com.takai.ai.domain.dto;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Data
 public class TakaiDialogDetailReqDTO {
@@ -18,8 +19,12 @@ public class TakaiDialogDetailReqDTO {
 
     private String dialogId;
 
+    private List<TakaiDocumentDTO> documents;
+
     private TakaiSliceInfoDTO sliceInfo;
 
     private String sliceJson;
 
+    private String downloadUrl;
+
 }

+ 5 - 0
takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDialogRespDTO.java

@@ -4,6 +4,7 @@ import com.takai.common.annotation.Excel;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 public class TakaiDialogRespDTO {
@@ -40,5 +41,9 @@ public class TakaiDialogRespDTO {
 
     private TakaiSliceInfoDTO sliceInfo;
 
+    private List<TakaiDocumentDTO> documents;
+
+    private String downloadUrl;
+
 
 }

+ 14 - 0
takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiDocumentDTO.java

@@ -0,0 +1,14 @@
+package com.takai.ai.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class TakaiDocumentDTO {
+
+    private String id;
+
+    private String name;
+
+    private String url;
+
+}

+ 16 - 0
takai-ai/src/main/java/com/takai/ai/domain/dto/TakaiSliceImage.java

@@ -0,0 +1,16 @@
+package com.takai.ai.domain.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+@Builder
+public class TakaiSliceImage {
+
+    private String name;
+
+    private String url;
+}

+ 17 - 170
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplication.java

@@ -1,21 +1,30 @@
 package com.takai.ai.domain.entity;
 
 import com.takai.common.core.domain.BaseEntity;
+import com.takai.common.core.domain.entity.SysUser;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 智谱应用列表 bm_application
- * 
+ *
  * @author takai
  */
+@Data
 @Builder
+@NoArgsConstructor  // 生成无参构造方法
+@AllArgsConstructor // 生成全参构造方法(供@Builder使用)
 public class TakaiApplication extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
 
-
     /** 应用ID */
     private String appId;
 
@@ -52,6 +61,8 @@ public class TakaiApplication extends BaseEntity
     /** max_token */
     private Integer maxToken;
 
+    private String isDeepThink;
+
     private String paramDesc;
 
     private String knowledgeInfo;
@@ -72,177 +83,13 @@ public class TakaiApplication extends BaseEntity
 
     private String addOrderBy;
 
-    public String getAddOrderBy() { return addOrderBy; }
-
-    public void setAddOrderBy(String needOrderBy) { this.addOrderBy = needOrderBy; }
-
-    public String getAppId() {
-        return appId;
-    }
-
-    public void setAppId(String appId) {
-        this.appId = appId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
+    //项目级应用 返回['项目分类','项目id']
+    private List<String> appProId = new ArrayList<>();
 
-    public void setDesc(String desc) {
-        this.desc = desc;
-    }
-
-    public String getPrompt() {
-        return prompt;
-    }
+    private String visible;
 
-    public void setPrompt(String prompt) {
-        this.prompt = prompt;
-    }
-
-    public String getTopP() {
-        return topP;
-    }
-
-    public void setTopP(String topP) {
-        this.topP = topP;
-    }
+    private List<SysUser> vipList;
 
-    public String getTemperature() {
-        return temperature;
-    }
-
-    public void setTemperature(String temperature) {
-        this.temperature = temperature;
-    }
-
-    public String getKnowledgeIds() {
-        return knowledgeIds;
-    }
-
-    public void setKnowledgeIds(String knowledgeIds) {
-        this.knowledgeIds = knowledgeIds;
-    }
-
-    public Integer getSliceCount() {
-        return sliceCount;
-    }
-
-    public void setSliceCount(Integer sliceCount) {
-        this.sliceCount = sliceCount;
-    }
-
-    public String getModel() {
-        return model;
-    }
-
-    public void setModel(String model) {
-        this.model = model;
-    }
-
-    public String getIconColor() {
-        return iconColor;
-    }
-
-    public void setIconColor(String iconColor) {
-        this.iconColor = iconColor;
-    }
-
-    public String getIconType() {
-        return iconType;
-    }
-
-    public void setIconType(String iconType) {
-        this.iconType = iconType;
-    }
-
-    public Integer getMaxToken() {
-        return maxToken;
-    }
-
-    public void setMaxToken(Integer maxToken) {
-        this.maxToken = maxToken;
-    }
-
-    public String getKnowledgeInfo() {
-        return knowledgeInfo;
-    }
-
-    public void setKnowledgeInfo(String knowledgeInfo) {
-        this.knowledgeInfo = knowledgeInfo;
-    }
-
-    public String getParamDesc() {
-        return paramDesc;
-    }
-
-    public void setParamDesc(String paramDesc) {
-        this.paramDesc = paramDesc;
-    }
-
-    public Long getTypeId() {
-        return typeId;
-    }
-
-    public void setTypeId(Long typeId) {
-        this.typeId = typeId;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getApprover() {
-        return approver;
-    }
-
-    public void setApprover(String approver) {
-        this.approver = approver;
-    }
-
-    public String getNodeOrder() {
-        return nodeOrder;
-    }
-
-    public void setNodeOrder(String nodeOrder) {
-        this.nodeOrder = nodeOrder;
-    }
-
-    public String getComment() {
-        return comment;
-    }
-
-    public void setComment(String comment) {
-        this.comment = comment;
-    }
-
-    public String getFlag() {
-        return flag;
-    }
-
-    public void setFlag(String flag) {
-        this.flag = flag;
-    }
-
-    public String getProjectId() {
-        return projectId;
-    }
-
-    public void setProjectId(String projectId) {
-        this.projectId = projectId;
-    }
 
     @Override
     public String toString() {

+ 9 - 158
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationParams.java

@@ -1,7 +1,10 @@
 package com.takai.ai.domain.entity;
 
-import java.util.List;
+import com.takai.common.core.domain.entity.SysUser;
+import lombok.Data;
 
+import java.util.List;
+@Data
 public class TakaiApplicationParams {
 
     private String name;
@@ -14,7 +17,7 @@ public class TakaiApplicationParams {
 
     private String temperature;
 
-    private String knowledge_ids;
+    private List<String> knowledge_ids;
 
     private String model;
 
@@ -44,163 +47,11 @@ public class TakaiApplicationParams {
 
     private String userId;
 
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public void setDesc(String desc) {
-        this.desc = desc;
-    }
-
-    public String getPrompt() {
-        return prompt;
-    }
-
-    public void setPrompt(String prompt) {
-        this.prompt = prompt;
-    }
-
-    public String getTop_p() {
-        return top_p;
-    }
-
-    public void setTop_p(String top_p) {
-        this.top_p = top_p;
-    }
-
-    public String getTemperature() {
-        return temperature;
-    }
-
-    public void setTemperature(String temperature) {
-        this.temperature = temperature;
-    }
-
-    public String getKnowledge_ids() {
-        return knowledge_ids;
-    }
-
-    public void setKnowledge_ids(String knowledge_ids) {
-        this.knowledge_ids = knowledge_ids;
-    }
-
-    public String getModel() {
-        return model;
-    }
-
-    public void setModel(String model) {
-        this.model = model;
-    }
-
-    public String getIcon_color() {
-        return icon_color;
-    }
-
-    public void setIcon_color(String icon_color) {
-        this.icon_color = icon_color;
-    }
-
-    public String getIcon_type() {
-        return icon_type;
-    }
-
-    public void setIcon_type(String icon_type) {
-        this.icon_type = icon_type;
-    }
-
-    public String getKnowledge_info() {
-        return knowledge_info;
-    }
-
-    public void setKnowledge_info(String knowledge_info) {
-        this.knowledge_info = knowledge_info;
-    }
-
-    public String getParam_desc() {
-        return param_desc;
-    }
-
-    public void setParam_desc(String param_desc) {
-        this.param_desc = param_desc;
-    }
-
-    public Integer getMax_token() {
-        return max_token;
-    }
-
-    public void setMax_token(Integer max_token) {
-        this.max_token = max_token;
-    }
-
-    public List<String> getQuestionList() {
-        return questionList;
-    }
-
-    public void setQuestionList(List<String> questionList) {
-        this.questionList = questionList;
-    }
-
-    public Integer getSlice_count() {
-        return slice_count;
-    }
-
-    public void setSlice_count(Integer slice_count) {
-        this.slice_count = slice_count;
-    }
-
-    public Long getTypeId() {
-        return typeId;
-    }
-
-    public void setTypeId(Long typeId) {
-        this.typeId = typeId;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getApprover() {
-        return approver;
-    }
-
-    public void setApprover(String approver) {
-        this.approver = approver;
-    }
-
-    public String getNodeOrder() {
-        return nodeOrder;
-    }
-
-    public void setNodeOrder(String nodeOrder) {
-        this.nodeOrder = nodeOrder;
-    }
-
-    public String getComment() {
-        return comment;
-    }
+    private String isDeepThink;
 
-    public void setComment(String comment) {
-        this.comment = comment;
-    }
+    private String[] appProId;
 
-    public String getUserId() {
-        return userId;
-    }
+    private String visible;
 
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
+    private List<SysUser> vipList;
 }

+ 8 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiApplicationResult.java

@@ -1,8 +1,10 @@
 package com.takai.ai.domain.entity;
 
+import com.takai.common.core.domain.entity.SysUser;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class TakaiApplicationResult {
@@ -21,6 +23,8 @@ public class TakaiApplicationResult {
 
     private String typeId;
 
+    private String visible;
+
     private String status;
 
     private String approver;
@@ -30,6 +34,8 @@ public class TakaiApplicationResult {
     private String userName;
 
     /** 创建时间 */
+    private String createBy;
+
     private Date createTime;
 
     private String typeName;
@@ -46,4 +52,6 @@ public class TakaiApplicationResult {
 
     private Date updateTime;
 
+    private List<SysUser> vipList;
+
 }

+ 18 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiFileInfo.java

@@ -0,0 +1,18 @@
+package com.takai.ai.domain.entity;
+
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class TakaiFileInfo extends BaseEntity {
+
+    private String id;
+
+    private String name;
+
+    private String url;
+
+    private String dialogId;
+
+    private String dialogDid;
+}

+ 20 - 69
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiKnowledge.java

@@ -1,15 +1,25 @@
 package com.takai.ai.domain.entity;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.takai.common.core.domain.BaseEntity;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 智谱知识库列表 bm_knowledge
- * 
+ *
  * @author takai
  */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
 @Builder
 public class TakaiKnowledge extends BaseEntity
 {
@@ -28,6 +38,11 @@ public class TakaiKnowledge extends BaseEntity
     /** 知识库描述 */
     private String description;
 
+    /**
+     * 可见性:'0':公开,'1':私有
+     */
+    private String visible;
+
     /** 背景颜色 */
     private String background;
 
@@ -43,77 +58,13 @@ public class TakaiKnowledge extends BaseEntity
     /** 知识文件数量 */
     private Integer documentSize;
 
-    public String getKnowledgeId() {
-        return knowledgeId;
-    }
-
-    public void setKnowledgeId(String knowledgeId) {
-        this.knowledgeId = knowledgeId;
-    }
-
-    public String getEmbeddingId() {
-        return embeddingId;
-    }
-
-    public void setEmbeddingId(String embeddingId) {
-        this.embeddingId = embeddingId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getBackground() {
-        return background;
-    }
+    /**
+     * 查询条件
+     */
+    private List<String> knowledgeIds = new ArrayList<>();
 
-    public void setBackground(String background) {
-        this.background = background;
-    }
 
-    public String getIcon() {
-        return icon;
-    }
 
-    public void setIcon(String icon) {
-        this.icon = icon;
-    }
-
-    public Integer getWordNum() {
-        return wordNum;
-    }
-
-    public void setWordNum(Integer wordNum) {
-        this.wordNum = wordNum;
-    }
-
-    public Integer getLength() {
-        return length;
-    }
-
-    public void setLength(Integer length) {
-        this.length = length;
-    }
-
-    public Integer getDocumentSize() {
-        return documentSize;
-    }
-
-    public void setDocumentSize(Integer documentSize) {
-        this.documentSize = documentSize;
-    }
 
 
     @Override

+ 10 - 46
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiKnowledgeParams.java

@@ -1,7 +1,12 @@
 package com.takai.ai.domain.entity;
 
+import com.takai.common.core.domain.entity.SysUser;
 import com.takai.common.enums.IconImg;
+import lombok.Data;
 
+import java.util.List;
+
+@Data
 public class TakaiKnowledgeParams {
 
     private String knowledgeId;
@@ -21,52 +26,11 @@ public class TakaiKnowledgeParams {
     /** 知识库图标 */
     private String icon = IconImg.QUESTION.getValue();
 
-    public String getKnowledgeId() {
-        return knowledgeId;
-    }
-
-    public void setKnowledgeId(String knowledgeId) {
-        this.knowledgeId = knowledgeId;
-    }
-
-    public String getEmbeddingId() {
-        return embeddingId;
-    }
-
-    public void setEmbeddingId(String embeddingId) {
-        this.embeddingId = embeddingId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getBackground() {
-        return background;
-    }
-
-    public void setBackground(String background) {
-        this.background = background;
-    }
-
-    public String getIcon() {
-        return icon;
-    }
+    /**
+     * 可见性:'0':公开,'1':私有
+     */
+    private String visible;
 
-    public void setIcon(String icon) {
-        this.icon = icon;
-    }
+    private List<SysUser> vipList;
 
 }

+ 5 - 64
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiSseInfoParams.java

@@ -2,8 +2,10 @@ package com.takai.ai.domain.entity;
 
 
 
-import java.util.List;
+import lombok.Data;
 
+import java.util.List;
+@Data
 public class TakaiSseInfoParams {
 
     private static final long serialVersionUID = 1L;
@@ -29,6 +31,8 @@ public class TakaiSseInfoParams {
      */
     private List<TakaiPromptInfo> prompt;
 
+    private List<TakaiPromptInfo> messages;
+
     private String appId;
     /**
      * ⽤于控制每次返回内容的类型,空或者没有此字段时默认按照json_string
@@ -52,67 +56,4 @@ public class TakaiSseInfoParams {
 
     private String model;
 
-    public String getRequest_id() {
-        return request_id;
-    }
-
-    public void setRequest_id(String request_id) {
-        this.request_id = request_id;
-    }
-
-    public Boolean getIncremental() {
-        return incremental;
-    }
-
-    public void setIncremental(Boolean incremental) {
-        this.incremental = incremental;
-    }
-
-    public List<TakaiPromptInfo> getPrompt() {
-        return prompt;
-    }
-
-    public void setPrompt(List<TakaiPromptInfo> prompt) {
-        this.prompt = prompt;
-    }
-
-    public String getReturnType() {
-        return returnType;
-    }
-
-    public void setReturnType(String returnType) {
-        this.returnType = returnType;
-    }
-
-    public String getKnowledge_ids() {
-        return knowledge_ids;
-    }
-
-    public void setKnowledge_ids(String knowledge_ids) {
-        this.knowledge_ids = knowledge_ids;
-    }
-
-    public List<Long> getDocument_ids() {
-        return document_ids;
-    }
-
-    public void setDocument_ids(List<Long> document_ids) {
-        this.document_ids = document_ids;
-    }
-
-    public String getModel() {
-        return model;
-    }
-
-    public void setModel(String model) {
-        this.model = model;
-    }
-
-    public String getAppId() {
-        return appId;
-    }
-
-    public void setAppId(String appId) {
-        this.appId = appId;
-    }
 }

+ 25 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/VipApplication.java

@@ -0,0 +1,25 @@
+package com.takai.ai.domain.entity;
+
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 智谱应用列表 bm_application
+ *
+ * @author takai
+ */
+@Data
+@Builder
+public class VipApplication extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 应用ID */
+    private String appId;
+
+    /** 应用名称 */
+    private String userId;
+
+}

+ 25 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/VipKnowledge.java

@@ -0,0 +1,25 @@
+package com.takai.ai.domain.entity;
+
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 智谱应用列表 bm_application
+ *
+ * @author takai
+ */
+@Data
+@Builder
+public class VipKnowledge extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 应用ID */
+    private String knowledgeId;
+
+    /** 应用名称 */
+    private String userId;
+
+}

+ 8 - 3
takai-ai/src/main/java/com/takai/ai/mapper/TakaiApplicationMapper.java

@@ -4,19 +4,20 @@ package com.takai.ai.mapper;
 import com.takai.ai.domain.entity.TakaiApplication;
 import com.takai.ai.domain.entity.TakaiApplicationResult;
 import com.takai.ai.domain.entity.TakaiPageParams;
+import com.takai.ai.domain.entity.VipApplication;
 
 import java.util.List;
 
 /**
  * 高井 应用列表
- * 
+ *
  * @author takai
  */
 public interface TakaiApplicationMapper
 {
     /**
      * 根据条件分页查询应用信息
-     * 
+     *
      * @param mData 应用信息
      * @return 应用信息
      */
@@ -33,12 +34,16 @@ public interface TakaiApplicationMapper
 
     /**
      * 新增应用信息
-     * 
+     *
      * @param mData 应用信息
      * @return 结果
      */
     public int insertApplication(TakaiApplication mData);
 
+    public int insertVipApp(VipApplication mData);
+
+    public int deleteVipByAppId(String appId);
+
     /**
      * 更新应用信息
      *

+ 14 - 0
takai-ai/src/main/java/com/takai/ai/mapper/TakaiFileInfoMapper.java

@@ -0,0 +1,14 @@
+package com.takai.ai.mapper;
+
+import com.takai.ai.domain.entity.TakaiFileInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface TakaiFileInfoMapper {
+
+    List<TakaiFileInfo> getFileInfoById(@Param("id") String id, @Param("dialogId") String dialogId, @Param("dialogDid") String dialogDid);
+
+    int insertFileInfo(TakaiFileInfo fileInfo);
+
+}

+ 10 - 3
takai-ai/src/main/java/com/takai/ai/mapper/TakaiKnowledgeMapper.java

@@ -1,25 +1,28 @@
 package com.takai.ai.mapper;
 
 import com.takai.ai.domain.entity.TakaiKnowledge;
+import com.takai.ai.domain.entity.VipApplication;
+import com.takai.ai.domain.entity.VipKnowledge;
 
 import java.util.List;
 
 /**
  * 高井 知识库列表
- * 
+ *
  * @author takai
  */
 public interface TakaiKnowledgeMapper
 {
     /**
      * 根据条件分页查询知识库信息
-     * 
+     *
      * @param mData 知识库信息
      * @return 知识库信息
      */
     public List<TakaiKnowledge> selectKnowledgeList(TakaiKnowledge mData);
 
 
+    public List<TakaiKnowledge> selectAllKnowledgeList(TakaiKnowledge mData);
     /**
      * 查询唯一知识库信息
      * @param mData
@@ -30,7 +33,7 @@ public interface TakaiKnowledgeMapper
 
     /**
      * 新增知识库信息
-     * 
+     *
      * @param mData 知识库信息
      * @return 结果
      */
@@ -46,4 +49,8 @@ public interface TakaiKnowledgeMapper
 
     int delKnowledge(String knowledgeId);
 
+    public int insertVipKnowledge(VipKnowledge mData);
+
+    public int deleteVipByknowledgeId(String appId);
+
 }

+ 6 - 4
takai-ai/src/main/java/com/takai/ai/service/ITakaiAiService.java

@@ -4,17 +4,17 @@ import com.alibaba.fastjson2.JSONObject;
 import com.takai.ai.domain.dto.TakaiDialogReqDTO;
 import com.takai.ai.domain.dto.TakaiDialogRespDTO;
 import com.takai.ai.domain.dto.TakaiQuestionDTO;
+import com.takai.ai.domain.dto.TakaiSliceImage;
 import com.takai.ai.domain.entity.*;
 import com.takai.common.core.domain.entity.SysDictData;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 高井 业务层
- * 
+ *
  * @author takai
  */
 public interface ITakaiAiService
@@ -72,7 +72,7 @@ public interface ITakaiAiService
 
     List<TakaiKnowledge> queryKnowledgeList();
 
-    List<Object> selectDialogListByAppId(String appId, String userId);
+    List<TakaiDialogRespDTO> selectDialogListByAppId(String appId, String userId);
 
     TakaiDocumentSettings documentSetting(String dialogId);
 
@@ -84,7 +84,7 @@ public interface ITakaiAiService
 
     JSONObject getSliceDetail(String sliceId, String knowledgeId);
 
-    List<String> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId);
+    List<TakaiSliceImage> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId);
 
     int updateSliceInfo(TakaiSliceUpdateParams params);
 
@@ -119,4 +119,6 @@ public interface ITakaiAiService
     List<TakaiApplicationResult> selectRoleApp();
 
     List<TakaiApplicationResult> getChatAppList(List<TakaiApplicationResult> list, String userId);
+
+    List<Object> setDialogList(List<TakaiDialogRespDTO> list);
 }

+ 297 - 59
takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java

@@ -9,26 +9,23 @@ import com.takai.ai.domain.dto.*;
 import com.takai.ai.domain.entity.*;
 import com.takai.ai.mapper.*;
 import com.takai.ai.service.ITakaiAiService;
-import com.takai.ai.utils.ApprovalFlowManager;
-import com.takai.ai.utils.ApprovalNode;
-import com.takai.ai.utils.MinioUtil;
-import com.takai.ai.utils.SnowflakeDigitGenerator;
+import com.takai.ai.utils.*;
 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.DocumentAuditConfig;
-import com.takai.system.domain.DocumentAuditInfo;
-import com.takai.system.domain.TypeApp;
-import com.takai.system.mapper.SysDictDataMapper;
-import com.takai.system.mapper.TypeAppMapper;
-import com.takai.system.mapper.DocumentAuditConfigMapper;
-import com.takai.system.mapper.DocumentAuditInfoMapper;
+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;
@@ -37,6 +34,7 @@ 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.stereotype.Service;
@@ -125,15 +123,26 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     @Autowired
     private SysDictDataMapper sysDictDataMapper;
 
+    @Autowired
+    private SysProjectAppMapper sysProjectAppMapper;
+
+    @Autowired
+    private TakaiFileInfoMapper fileInfoMapper;
+
     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 TODAY = "今";
 
-    public static final String BEFOR = "天前";
+    public static final String BEFOR = "日前";
+    @Autowired
+    private SysProjectMapper sysProjectMapper;
+
+    @Autowired
+    private ISysUserService userService;
 
     @Override
     public void initDeepseekInfo() {
@@ -146,9 +155,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         //获取知识库列表
         List<TakaiKnowledge> knowledgeList = null;
         if (StringUtils.isEmpty(knowledgeId)) {
-            knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(null);
+            knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(null);
         } else {
-            knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
+            knowledgeList = takaiKnowledgeMapper.selectAllKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
         }
 
         //获取知识列表
@@ -176,16 +185,32 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     public SseEmitter sseInvoke(TakaiSseInfoParams sseParams) {
         TakaiApplication appInfo = takaiApplicationMapper.selectTargetApplication(TakaiApplication.builder().appId(sseParams.getAppId()).build());
         if (appInfo != null) {
-            TakaiKnowledge knowledge = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(appInfo.getKnowledgeIds()).build());
-            if (knowledge != 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());
-                String query = sseParams.getPrompt().get(sseParams.getPrompt().size() - 1).getContent();
+                //重新设置knowledgeIds为数组
+                json.put("knowledgeIds",idList);
+                String query = null;
+                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", knowledge.getEmbeddingId());
+                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);
@@ -386,6 +411,19 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 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;
@@ -413,6 +451,24 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 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);
+                        }
+                    }
+                }
+
+            }
         }
     }
 
@@ -476,6 +532,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         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()) {
@@ -488,7 +545,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                             .name(knowledge.getName())
                             .embeddingId(knowledge.getEmbeddingId())
                             .description(knowledge.getDescription())
+                            .visible(knowledge.getVisible())
                             .build();
+                    params.setCreateBy(createdBy);
                     return takaiKnowledgeMapper.insertKnowledge(params);
                 }
             } else {
@@ -506,7 +565,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 .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);
     }
 
@@ -590,7 +653,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             TakaiDocumentSettings settings = new TakaiDocumentSettings();
             settings.setKnowledgeId(knowledgeId);
             JSONObject jsonObject = analysisFile(params, settings, "upload");
-
+            String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
             if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
                 for (UploadDocumentParams vo : params) {
                     // 更新知识库文件大小,总字符数, 文件总数
@@ -617,6 +680,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                                 .length(fileLen)
                                 .wordNum(wordNum)
                                 .build();
+                        document.setCreateBy(updateBy);
                         int documentIdInsert = takaiDocumentMapper.insertDocument(document);
 
                         if (documentIdInsert > 0) {
@@ -652,11 +716,14 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 .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);
     }
 
@@ -674,8 +741,9 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 .documentId(documentId)
                 .length(totalSize)
                 .wordNum(totalLen)
+                .sliceTotal(sliceList.size())
                 .build();
-        String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUsername();
+        String updateBy = SecurityUtils.getLoginUser() == null ? "":SecurityUtils.getLoginUser().getUserId();
         doc.setUpdateBy(updateBy);
         doc.setUpdateTime(new Date());
         takaiDocumentMapper.updateDocument(doc);
@@ -767,7 +835,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .name(params.getName())
                     .desc(params.getDesc())
                     .model(params.getModel())
-                    .knowledgeIds(params.getKnowledge_ids().toString())
+                    .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
                     .topP(params.getTop_p())
                     .temperature(params.getTemperature())
                     .maxToken(params.getMax_token())
@@ -775,8 +843,20 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .knowledgeInfo(params.getKnowledge_info())
                     .sliceCount(params.getSlice_count())
                     .typeId(params.getTypeId())
+                    .visible(params.getVisible())
+                    .isDeepThink(params.getIsDeepThink())
                     .build();
-            if(isAdmin){
+            //关联项目
+            if(params.getAppProId() != null){
+                SysProjectApp sysProjectApp = new SysProjectApp();
+                sysProjectApp.setProjectId(params.getAppProId()[1]);
+                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("5"); // 未开始审核状态
@@ -786,6 +866,18 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             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));
@@ -824,7 +916,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .name(params.getName())
                     .desc(params.getDesc())
                     .model(params.getModel())
-                    .knowledgeIds(params.getKnowledge_ids().toString())
+                    .knowledgeIds(params.getKnowledge_ids().stream().collect(Collectors.joining(",")))
                     .topP(params.getTop_p())
                     .temperature(params.getTemperature())
                     .maxToken(params.getMax_token())
@@ -832,8 +924,21 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     .knowledgeInfo(params.getKnowledge_info())
                     .sliceCount(params.getSlice_count())
                     .typeId(params.getTypeId())
+                    .isDeepThink(params.getIsDeepThink())
+                    .visible(params.getVisible())
                     .build();
-            if(isAdmin){
+            //关联项目
+            if(params.getAppProId() != null){
+                SysProjectApp  sysProjectApp = sysProjectAppMapper.selectSysProjectAppByAppId(appId);
+                if(sysProjectApp != null){
+                    sysProjectAppMapper.deleteSysProjectAppByAppId(appId);
+                }
+                sysProjectApp = new SysProjectApp();
+                sysProjectApp.setProjectId(params.getAppProId()[1]);
+                sysProjectApp.setAppId(appId);
+                sysProjectAppMapper.insertSysProjectApp(sysProjectApp);
+            }
+            if(isAdmin  || "1".equals(params.getVisible())){
                 info.setStatus("3"); // 有直接修改权限无需审核
                 info.setApprover(null);
                 info.setNodeOrder(null);
@@ -845,6 +950,19 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             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()));
@@ -871,16 +989,53 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
 
     @Override
     public List<TakaiApplicationResult> getApplicationList(TakaiApplication params) {
-        return takaiApplicationMapper.selectApplicationList(params);
+        //管理员 获取所有项目
+        Map<String,Object> userParams = getUserParams();
+        if(userParams != null){
+            params.setParams(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(Arrays.asList(
+                            String.valueOf(sysProject.getSourceFrom()),
+                            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("detail", takaiApplication);
         object.put("questionlist", list);
         return object;
     }
@@ -891,6 +1046,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         if (i > 0) {
             takaiAppInfoMapper.delAppInfoByAppId(appId);
             takaiQuestionMapper.delQuestionByAppId(appId);
+            takaiApplicationMapper.delApplication(appId);
         }
         return i;
     }
@@ -903,14 +1059,46 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
 
     @Override
     public List<TakaiKnowledge> queryKnowledgeList() {
-        return takaiKnowledgeMapper.selectKnowledgeList(null);
+        //管理员 获取所有项目
+        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<Object> selectDialogListByAppId(String appId, String userId) {
+    public List<TakaiDialogRespDTO> selectDialogListByAppId(String appId, String userId) {
         List<TakaiDialogRespDTO> list = takaiDialogMapper.selectDialog(appId, userId);
-        List<Object> result = setDialogList(list);
-        return result;
+//        List<Object> result = setDialogList(list);
+        return list;
     }
 
     @Override
@@ -1016,7 +1204,18 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             if (response.isSuccessful()) {
                 String body = response.body().string();
                 log.info("查询切片详情返回:" + body);
-                return JSON.parseObject(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());
             }
@@ -1027,7 +1226,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     }
 
     @Override
-    public List<String> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId) {
+    public List<TakaiSliceImage> uploadSliceImage(MultipartFile[] files, String knowledgeId, String documentId) {
         List<TakaiSysOss> resultList = null;
         try {
             resultList = minioUtil.uploadSliceImages(files,knowledgeId,documentId);
@@ -1035,7 +1234,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             logger.error("上传文件失败", e.getMessage());
         }
         //保存图片信息
-        List<String> originTextList = new ArrayList<>();
+        List<TakaiSliceImage> originTextList = new ArrayList<>();
         for (TakaiSysOss  result : resultList) {
             TakaiMediaReplacement  takaiMediaReplacement =
                     TakaiMediaReplacement.builder()
@@ -1049,7 +1248,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             takaiMediaReplacement.setCreateTime(currentDate);
             takaiMediaReplacement.setUpdateTime(currentDate);
             takaiMediaReplacementMapper.insertMedia(takaiMediaReplacement);
-            originTextList.add(result.getOriginText());
+            TakaiSliceImage sliceImage = TakaiSliceImage.builder().name(result.getOriginText()).url(result.getUrl()).build();
+            originTextList.add(sliceImage);
         }
         return originTextList;
     }
@@ -1169,12 +1369,13 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         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.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 = searchAppTypeGroupList(paramsVo, dictData);
+                    Map<String, Object> l = searchAppProjectGroupList(paramsVo, dictData);
                     if(!MapUtils.isEmpty(l)){
                         result.add(l);
                     }
@@ -1202,9 +1403,47 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         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();
@@ -1257,12 +1496,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             }
 
             ApprovalNode vo = flowManager.getFirstApprover();
-            int i = takaiApplicationMapper.updateApplication(TakaiApplication.builder()
-                    .appId(appId)
-                    .approver(String.valueOf(vo.getApprover()))
-                    .nodeOrder(String.valueOf(vo.getNodeOrder()))
-                    .status("1") // 待审核
-                    .build());
+            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);
@@ -1299,13 +1537,12 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     return saveAuditInfo(appParams, "3", appId);
                 }else{
                     // 审核通过,下一个节点
-                    int successI = takaiApplicationMapper.updateApplication(TakaiApplication.builder()
-                            .appId(appId)
-                            .status("2")
-                            .approver(String.valueOf(nextNode.getApprover()))
-                            .nodeOrder(String.valueOf(nextNode.getNodeOrder()))
-                            .comment(appParams.getComment())
-                            .build());
+                    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);
@@ -1329,13 +1566,12 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     }
 
     private int saveAuditInfo(TakaiApplicationParams appParams, String status, String appId){
-        int successI = takaiApplicationMapper.updateApplication(TakaiApplication.builder()
-                .appId(appId)
-                .status(status)
-                .approver(appParams.getApprover())
-                .nodeOrder(appParams.getNodeOrder())
-                .comment(appParams.getComment())
-                .build());
+        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);
@@ -1453,7 +1689,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 Integer code = obj.getInteger("code");
                 if (code == 200) {
                     logger.info("上传文档调用python接口成功,返回内容:{}", body);
-                    return obj;
+                } else {
+                    logger.info("上传文档调用python接口失败,返回内容:{}", body);
                 }
                 return obj;
             } else {
@@ -1466,7 +1703,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         }
     }
 
-    private List<Object> setDialogList(List<TakaiDialogRespDTO> list) {
+    @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();

+ 180 - 0
takai-ai/src/main/java/com/takai/ai/utils/SchematicNumberParser.java

@@ -0,0 +1,180 @@
+package com.takai.ai.utils;
+
+import com.takai.ai.domain.dto.TakaiSliceImage;
+import com.takai.ai.domain.entity.TakaiMediaReplacement;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 解析文本中【示意图序号_XXXXX】格式内容的工具类
+ */
+@Slf4j
+public class SchematicNumberParser {
+
+    // 定义匹配【示意图序号_XXXXX】格式的正则表达式
+    // 说明:【】为中文全角括号,\\d+匹配1个及以上数字,()表示捕获组(提取序号)
+    private static final String REGEX_PATTERN = "【示意图序号_([a-zA-Z0-9_]+)】";
+
+    /**
+     * 核心方法:从输入文本中提取所有【示意图序号_XXXXX】格式的序号
+     * @param inputText 待解析的原始文本
+     * @return 提取到的序号列表(若无匹配则返回空列表)
+     */
+    public static List<String> extractSchematicNumbers(String inputText) {
+        // 1. 校验输入文本(避免空指针)
+        if (inputText == null || inputText.trim().isEmpty()) {
+            System.out.println("警告:输入文本为空,无法解析!");
+            return new ArrayList<>();
+        }
+
+        // 2. 编译正则表达式(Pattern为线程安全类,可复用)
+        Pattern pattern = Pattern.compile(REGEX_PATTERN);
+        // 3. 创建匹配器,关联输入文本
+        Matcher matcher = pattern.matcher(inputText);
+
+        // 4. 遍历所有匹配结果,提取序号
+        List<String> schematicNumbers = new ArrayList<>();
+        while (matcher.find()) {
+            // matcher.group(1):获取第1个捕获组(即括号内的数字序号)
+            String number = matcher.group(1);
+            String text = matcher.group(0);
+            schematicNumbers.add(text);
+            // 可选:打印匹配过程(便于调试)
+//            System.out.printf("已匹配到示意图序号:%s(完整格式:%s)%n",
+//                    number, matcher.group(0)); // group(0)为完整匹配的字符串
+        }
+
+        // 5. 处理无匹配的情况
+        if (schematicNumbers.isEmpty()) {
+            System.out.println("提示:未在文本中找到【示意图序号_XXXXX】格式的内容!");
+        }
+
+        return schematicNumbers;
+    }
+
+    /**
+     * 将文本中的示意图序号替换为图片超链接
+     * @param inputText 原始文本
+     * @return 替换后的文本,其中示意图序号被替换为超链接
+     */
+    public static String replaceWithImageLinks(String inputText,List<TakaiMediaReplacement> imageList) {
+        if (inputText == null || inputText.trim().isEmpty() || imageList == null || imageList.isEmpty()) {
+            return inputText;
+        }
+
+        Pattern pattern = Pattern.compile(REGEX_PATTERN);
+        Matcher matcher = pattern.matcher(inputText);
+
+        StringBuffer result = new StringBuffer();
+
+        while (matcher.find()) {
+            String fullNumber = matcher.group(0);
+            String imageUrl = imageList.stream()
+                    // 过滤掉null元素和originText为null的元素
+                    .filter(media -> media != null && media.getOriginText() != null)
+                    // 匹配originText与示意图序号
+                    .filter(media -> media.getOriginText().equals(fullNumber))
+                    // 提取mediaUrl
+                    .map(TakaiMediaReplacement::getMediaUrl)
+                    // 获取第一个匹配项,如果没有则返回空Optional
+                    .findFirst()
+                    // 如果找到则返回,否则返回null并打印警告
+                    .orElseGet(() -> {
+                        return null;
+                    });
+
+            // 如果找到图片链接,替换为超链接格式;否则保留原始文本
+            if (imageUrl != null) {
+                if(imageUrl.contains("https://10.1.28.14:9000")){
+                    imageUrl = imageUrl.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
+                }
+                // 构建HTML超链接,可根据需要调整格式
+                String link = String.format("<a href=\"%s\" target=\"_blank\">%s</a>", imageUrl, fullNumber);
+                matcher.appendReplacement(result, link);
+            } else {
+                // 未找到图片链接,保留原始内容
+                matcher.appendReplacement(result, fullNumber);
+                System.out.println("警告:未找到序号 " + fullNumber + " 对应的图片链接");
+            }
+        }
+
+        matcher.appendTail(result);
+        return result.toString();
+    }
+
+    /**
+     * 提取文本中的示意图序号与对应图片URL的映射关系
+     * @param inputText 原始文本
+     * @param imageList 图片替换信息列表
+     * @return 包含示意图序号与图片URL映射关系的List<Map>
+     */
+    public static List<TakaiSliceImage> extractImageUrlMappings(String inputText, List<TakaiMediaReplacement> imageList) {
+        List<TakaiSliceImage> resultList = new ArrayList<>();
+
+        if (inputText == null || inputText.trim().isEmpty() || imageList == null || imageList.isEmpty()) {
+            return resultList;
+        }
+
+        Pattern pattern = Pattern.compile(REGEX_PATTERN);
+        Matcher matcher = pattern.matcher(inputText);
+
+        while (matcher.find()) {
+            String fullNumber = matcher.group(0);
+            String imageUrl = imageList.stream()
+                    // 过滤掉null元素和originText为null的元素
+                    .filter(media -> media != null && media.getOriginText() != null)
+                    // 匹配originText与示意图序号
+                    .filter(media -> media.getOriginText().equals(fullNumber))
+                    // 提取mediaUrl
+                    .map(TakaiMediaReplacement::getMediaUrl)
+                    // 获取第一个匹配项,如果没有则返回空Optional
+                    .findFirst()
+                    // 如果找到则返回,否则返回null
+                    .orElse(null);
+
+            // 处理URL替换
+            if (imageUrl != null && imageUrl.contains("https://10.1.28.14:9000")) {
+                imageUrl = imageUrl.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
+            }
+
+            // 创建映射并添加到结果列表
+            TakaiSliceImage sliceImage = TakaiSliceImage.builder().name(fullNumber).url(imageUrl).build();
+            resultList.add(sliceImage);
+
+            // 对于没有找到对应URL的情况打印警告
+            if (imageUrl == null) {
+                System.out.println("警告:未找到序号 " + fullNumber + " 对应的图片链接");
+            }
+        }
+
+        return resultList;
+    }
+
+    // 测试方法:验证解析逻辑
+    public static void main(String[] args) {
+        // 示例输入文本(与题目中的文本一致)
+        String sampleText = "步骤详述: \n" +
+                "1)选择模型。点击【请选择需要浏览的模型文件】按钮,选择需要加载的模型(支持选多个模型文件);【示意图序号_a2942670488668995584_22】\n" +
+                "2)选任务类型。选择需要查看的任务类型,点击【查询】按钮;\n" +
+                "3)选任务状态。选择需要查看的任务状态,点击【查询】按钮;\n" +
+                "4)通过模型查看报表。选中构件颜色为绿色的模型构件,点击鼠标右键弹出面板,点击【查看构件详情】。【示意图序号_a2942670488668995584_23】【示意图序号_a2942670488668995584_24】";
+
+        // 调用解析方法
+        List<String> result = extractSchematicNumbers(sampleText);
+
+        // 输出最终结果
+        System.out.println("\n========== 解析结果 ==========");
+        if (!result.isEmpty()) {
+            System.out.printf("共提取到 %d 个示意图序号:%n", result.size());
+            for (int i = 0; i < result.size(); i++) {
+                System.out.printf("%d. %s%n", i + 1, result.get(i));
+            }
+        }
+    }
+}

+ 121 - 15
takai-ai/src/main/resources/mapper/takaiai/TakaiApplicationMapper.xml

@@ -14,12 +14,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="knowledgeIds"   column="knowledge_ids"   />
 		<result property="sliceCount"   column="slice_count"   />
 		<result property="model"   column="model"   />
+		<result property="isDeepThink" column="is_deep_think" />
 		<result property="iconColor"   column="icon_color"   />
 		<result property="iconType"   column="icon_type"   />
 		<result property="maxToken" column="max_token" />
 		<result property="paramDesc"   column="param_desc"/>
 		<result property="knowledgeInfo" column="knowledge_info" />
 		<result property="typeId" column="type_id" />
+		<result property="visible" column="visible" />
 		<result property="status" column="status" />
 		<result property="approver" column="approver" />
 		<result property="nodeOrder" column="node_order" />
@@ -37,10 +39,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="desc"  column="description"  />
 		<result property="prompt"   column="prompt"   />
 		<result property="typeId" column="type_id" />
+		<result property="visible" column="visible" />
 		<result property="status"  column="status"  />
 		<result property="approver"  column="approver"  />
 		<result property="comment"   column="comment"   />
 		<result property="userName"   column="user_name"   />
+		<result property="createBy"   column="create_by"   />
 		<result property="createTime" column="create_time" />
 		<result property="typeName" column="typeName" />
 		<result property="chatMode" column="chatMode" />
@@ -49,24 +53,70 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="projectName" column="projectName" />
 		<result property="updateTime" column="update_time" />
 	</resultMap>
-	
+
 	<sql id="selectSql">
 		select appId, name, description, prompt, top_p, temperature, knowledge_ids, slice_count,model,icon_color,icon_type,max_token, param_desc, knowledge_info, type_id,
-			   status, approver, node_order, comment,remark, create_by, create_time, update_by, update_time
+			   status, approver, node_order, comment,remark, create_by, create_time, update_by, update_time, is_deep_think,visible
 		from bm_application
     </sql>
 
 	<select id="selectApplicationList" parameterType="com.takai.ai.domain.entity.TakaiApplication" resultMap="BmApplicationListResult">
-		<!-- 用户所属项目下的应用 -->
+		<!-- 管理员管理所有应用 -->
+		<if test="params != null and params.isAdmin">
+			SELECT DISTINCT
+			bm.appId,
+			bm.name,
+			bm.description,
+			bm.type_id,
+			bm.create_by,
+			bm.create_time,
+			bm.status,
+			bm.comment,
+			(SELECT dai.STATUS
+			FROM document_audit_info dai
+			WHERE dai.app_id = bm.appId
+			ORDER BY dai.create_time DESC
+			LIMIT 1) AS auditStatus,
+			sp.project_name as projectName,
+			bm.update_time,
+			bm.sort
+			FROM
+			bm_application bm
+			LEFT JOIN sys_project_app pa ON pa.app_id = bm.appId
+			LEFT JOIN sys_project sp ON pa.project_id = sp.project_id
+			<where>
+				<if test="flag != null and flag != ''">
+					AND (
+					<choose>
+						<when test="flag == 1">
+							bm.status = '1' OR bm.status  = '2' or bm.status = '3' OR bm.status = '4' OR bm.status  = '5' OR bm.status = '' OR bm.status IS NULL
+						</when>
+						<otherwise>
+							bm.status = '3' OR bm.status = '' OR bm.status IS NULL
+						</otherwise>
+					</choose>
+					)
+				</if>
+				<if test="typeId != null and typeId != ''">
+					AND bm.type_id = #{typeId}
+				</if>
+				<if test="projectId != null and projectId != ''">
+					AND sp.project_id = #{projectId}
+				</if>
+			</where>
+			ORDER BY bm.update_time DESC, bm.create_time DESC
+		</if>
+		<if test="params == null or !params.isAdmin">
 		SELECT DISTINCT
 			bm.appId,
-
 			bm.name,
 			bm.description,
 			bm.type_id,
+			bm.create_by,
 			bm.create_time,
 			bm.status,
 			bm.comment,
+			bm.visible,
 			(SELECT dai.STATUS
 			FROM document_audit_info dai
 			WHERE dai.app_id = bm.appId
@@ -82,7 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		LEFT JOIN sys_project_staff spa ON spa.project_pid = sp.project_pid
 		LEFT JOIN sys_dict_data sdd ON sdd.dict_code = bm.type_id
 		where
-		1=1
+		(bm.visible is null or bm.visible='0')
 		<if test="flag != null and flag != ''">
 			AND (
 			<choose>
@@ -112,9 +162,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				ba.name,
 				ba.description,
 				ba.type_id,
+				ba.create_by,
 				ba.create_time,
 				ba.status,
 				ba.comment,
+			    ba.visible,
 				(SELECT dai.STATUS
 				FROM document_audit_info dai
 				WHERE dai.app_id = ba.appId
@@ -127,7 +179,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				bm_application ba
 			LEFT JOIN sys_dict_data sdd on sdd.dict_code = ba.type_id
 			WHERE
-			    1=1
+			(ba.visible is null or ba.visible='0')
 			 AND ba.appId NOT IN (
 				SELECT
 					app_id
@@ -149,9 +201,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				bl.name,
 				bl.description,
 				bl.type_id,
+				bl.create_by,
 				bl.create_time,
 				bl.status,
 				bl.comment,
+				bl.visible,
 				(SELECT dai.STATUS
 				FROM document_audit_info dai
 				WHERE dai.app_id = bl.appId
@@ -163,7 +217,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			FROM
 				bm_application bl
 			WHERE
-			1=1
+			(bl.visible is null or bl.visible='0')
 			<if test="flag != null and flag != ''">
 				AND (
 				<choose>
@@ -186,18 +240,46 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				AND bl.type_id = #{typeId}
 			</if>
 		</if>
+		<!-- 私有应用 -->
+		UNION
+		SELECT
+			ba.appId,
+			ba.name,
+			ba.description,
+			ba.type_id,
+			ba.create_by,
+			ba.create_time,
+			ba.status,
+			ba.comment,
+			ba.visible,
+			(SELECT dai.STATUS
+			FROM document_audit_info dai
+			WHERE dai.app_id = ba.appId
+			ORDER BY dai.create_time DESC
+			LIMIT 1) AS auditStatus,
+			'' AS projectName,
+			ba.update_time,
+			ba.sort
+		FROM
+		bm_application ba
+		LEFT JOIN sys_dict_data sdd on sdd.dict_code = ba.type_id
+		WHERE
+		    ba.visible='1'
+		    and ba.create_by= #{params.userId}
+		<if test="typeId != null and typeId != ''">
+			AND ba.type_id = #{typeId}
+		</if>
 		<if test="addOrderBy == null or addOrderBy == 'Y'">
 			ORDER BY update_time DESC, create_time DESC
 		</if>
-
-
+		</if>
 	</select>
 
 	<select id="selectTargetApplication" parameterType="BmApplication" resultMap="BmApplicationResult">
 		<include refid="selectSql"/>
 		where appId = #{appId}
 	</select>
- 	
+
  	<insert id="insertApplication" parameterType="TakaiApplication">
  		insert into bm_application(
  			<if test="appId != null">appId,</if>
@@ -220,6 +302,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="nodeOrder != null and nodeOrder != ''">node_order,</if>
 			<if test="approver != null and approver != ''">approver,</if>
 			<if test="comment != null and comment != ''">comment,</if>
+		    <if test="isDeepThink != null and isDeepThink != ''">is_deep_think,</if>
+			<if test="visible != null and visible != ''">visible,</if>
  			create_time,
 		    update_time
  		)values(
@@ -243,6 +327,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="nodeOrder != null and nodeOrder != ''">#{nodeOrder},</if>
 			<if test="approver != null and approver != ''">#{approver},</if>
 			<if test="comment != null and comment != ''">#{comment},</if>
+			<if test="isDeepThink != null and isDeepThink != ''">#{isDeepThink},</if>
+			<if test="visible != null and visible != ''">#{visible},</if>
  			sysdate(),
 		    sysdate()
  		)
@@ -265,6 +351,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="remark != null">remark = #{remark},</if>
 			<if test="knowledgeInfo != null and knowledgeInfo != ''">knowledge_info = #{knowledgeInfo},</if>
 			<if test="maxToken != null and maxToken != ''">max_token = #{maxToken},</if>
+			<if test="isDeepThink != null and isDeepThink != ''">is_deep_think = #{isDeepThink},</if>
+			<if test="visible != null and visible != ''">visible = #{visible},</if>
 <!--			<if test="typeId != null and typeId != ''">type_id = #{typeId},</if>-->
 			type_id = #{typeId},
 			<if test="status != null and status != ''">status = #{status},</if>
@@ -282,12 +370,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 	<select id="selectAppListByApprover" parameterType="BmApplication" resultMap="BmApplicationListResult">
 		select bm.appId, bm.name, bm.description, bm.prompt, bm.type_id,
-		bm.status, bm.approver, bm.comment, bm.create_time, su.user_name
+		bm.status, bm.approver, bm.comment, bm.create_time, su.user_name, bm.is_deep_think, bm.visible
 		from bm_application bm
 		left join sys_user su on bm.approver = su.user_id
 		<where>
-			1=1
-			and (bm.status = '4'  OR bm.status = '1' OR bm.status = '2')
+			(bm.status = '4'  OR bm.status = '1' OR bm.status = '2')
 			<if test="appId != null and appId != ''">
 				AND bm.appId = #{appId}
 			</if>
@@ -304,6 +391,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			bm. NAME,
 			bm.description,
 			bm.type_id,
+			bm.visible,
 			bm.create_time,
 			sdd.dict_label AS typeName,
 			'LOCAL' AS chatMode,
@@ -338,7 +426,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			bm.create_time,
 			bm.status,
 			bm.comment,
-			bm.type_id
+			bm.type_id,
+			bm.visible
 		from
 			bm_application bm
 				LEFT JOIN sys_project_app pa ON bm.appId = pa.app_id
@@ -353,6 +442,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			bm. NAME,
 			bm.description,
 			bm.type_id,
+			bm.visible,
 			bm.create_time
 		FROM
 			bm_application bm
@@ -362,4 +452,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			OR bm. STATUS IS NULL
 	</select>
 
-</mapper>
+	<insert id="insertVipApp" parameterType="VipApplication">
+		insert into vip_application
+		<trim prefix="(" suffix=")" suffixOverrides=",">
+			<if test="appId != null">appId,</if>
+			<if test="userId != null">user_id,</if>
+		</trim>
+		<trim prefix="values (" suffix=")" suffixOverrides=",">
+			<if test="appId != null">#{appId},</if>
+			<if test="userId != null">#{userId},</if>
+		</trim>
+	</insert>
+
+	<delete id="deleteVipByAppId" parameterType="String">
+		delete from vip_application where appId = #{appId}
+	</delete>
+
+</mapper>

+ 7 - 3
takai-ai/src/main/resources/mapper/takaiai/TakaiDialogMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.takai.ai.mapper.TakaiDialogMapper">
-	
+
 	<resultMap type="com.takai.ai.domain.dto.TakaiDialogRespDTO" id="TakaiDialogResult">
 		<id property="id"   column="id"   />
 		<result property="dialog_name"  column="dialog_name"  />
@@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="type"   column="type"   />
 		<result property="create_time" column="create_time" />
 		<result property="slice_info" column="slice_info" />
+		<result property="downloadUrl" column="downloadUrl" />
 	</resultMap>
 
 	<select id="selectDialogById" parameterType="String" resultMap="TakaiDialogResult">
@@ -80,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="content != null">content,</if>
 		<if test="role != null">create_by,</if>
 		<if test="sliceJson != null and sliceJson != ''">slice_info,</if>
+		<if test="downloadUrl != null and downloadUrl != ''">download_url,</if>
 		create_time
 		)values(
 		#{id},
@@ -88,6 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="content != null">#{content},</if>
 		<if test="role != null">#{role},</if>
 		<if test="sliceJson != null and sliceJson != ''">#{sliceJson},</if>
+		<if test="downloadUrl != null and downloadUrl != ''">#{downloadUrl},</if>
 		sysdate()
 		)
 	</insert>
@@ -104,7 +107,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			dd.type,
 			dd.content,
 			dd.dialog_id,
-			dd.slice_info as sliceJson
+			dd.slice_info as sliceJson,
+			dd.download_url as downloadUrl
 		from dialog d
 				 left join dialog_detail dd on d.id = dd.dialog_id
 		where dd.dialog_id = #{dialogId}
@@ -183,4 +187,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		ORDER BY d.create_time asc
 	</select>
 
-</mapper>
+</mapper>

+ 1 - 0
takai-ai/src/main/resources/mapper/takaiai/TakaiDocumentMapper.xml

@@ -95,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="parseImage != null">parse_image = #{parseImage},</if>
 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
 			<if test="remark != null">remark = #{remark},</if>
+			<if test="sliceTotal != null">slice_total = #{sliceTotal},</if>
 			update_time = sysdate()
 		</set>
 		where document_id = #{documentId}

+ 48 - 0
takai-ai/src/main/resources/mapper/takaiai/TakaiFileInfoMapper.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takai.ai.mapper.TakaiFileInfoMapper">
+
+	<resultMap type="com.takai.ai.domain.entity.TakaiFileInfo" id="FileInfoResult">
+		<id property="id"   column="id"   />
+		<result property="name"  column="name"  />
+		<result property="url"  column="url"  />
+		<result property="dialogId"   column="dialog_id"   />
+		<result property="dialogDid"   column="dialog_did"  />
+		<result property="createBy"   column="create_by"   />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy"   column="update_by"   />
+		<result property="updateTime" column="update_time" />
+	</resultMap>
+
+	<select id="getFileInfoById" resultMap="FileInfoResult">
+	    select id, name, url, dialog_id, dialog_did from file_info
+		 <where>
+			 <if test="id != null and id != ''">id = #{id}</if>
+			 <if test="dialogId != null and dialogId != ''">and dialog_id = #{dialogId}</if>
+			 <if test="dialogDid != null and dialogDid != ''">and dialog_did = #{dialogDid}</if>
+		 </where>
+	</select>
+
+ 	<insert id="insertFileInfo" parameterType="FileInfo">
+ 		insert into file_info(
+ 			<if test="id != null and id != ''">id,</if>
+ 			<if test="name != null and name != ''">name,</if>
+ 			<if test="url != null and url != ''">url,</if>
+ 			<if test="dialogId != null and dialogId != ''">dialog_id,</if>
+		    <if test="dialogDid != null and dialogDid != ''">dialog_did,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+			<if test="id != null and id != ''">#{id},</if>
+			<if test="name != null and name != ''">#{name},</if>
+			<if test="url != null and url != ''">#{url},</if>
+			<if test="dialogId != null and dialogId != ''">#{dialogId},</if>
+			<if test="dialogDid != null and dialogDid != ''">#{dialogDid},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+ 			sysdate()
+ 		)
+	</insert>
+
+</mapper>

+ 65 - 7
takai-ai/src/main/resources/mapper/takaiai/TakaiKnowledgeMapper.xml

@@ -3,12 +3,13 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.takai.ai.mapper.TakaiKnowledgeMapper">
-	
+
 	<resultMap type="com.takai.ai.domain.entity.TakaiKnowledge" id="BmKnowledgeResult">
 		<id property="knowledgeId"   column="knowledge_id"   />
 		<result property="embeddingId"  column="embedding_id"  />
 		<result property="name"  column="name"  />
 		<result property="description"   column="description"   />
+		<result property="visible"   column="visible"   />
 		<result property="background"   column="background"   />
 		<result property="icon"   column="icon"   />
 		<result property="wordNum"   column="word_num"   />
@@ -20,33 +21,73 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateBy"   column="update_by"   />
 		<result property="updateTime" column="update_time" />
 	</resultMap>
-	
+
 	<sql id="selectSql">
-        select knowledge_id, embedding_id, name, description, background, icon, word_num, length,document_size, create_by, create_time,update_time, remark
+        select knowledge_id, embedding_id, name, description, visible, background, icon, word_num, length,document_size, create_by, create_time,update_time, remark
 		from bm_knowledge
     </sql>
 
 	<select id="selectKnowledgeList" parameterType="TakaiKnowledge" resultMap="BmKnowledgeResult">
 	    <include refid="selectSql"/>
 		<where>
+			(visible is null or visible='0')
 		    <if test="knowledgeId != null and knowledgeId != ''">
 				AND knowledge_id = #{knowledgeId}
 			</if>
+			<if test="knowledgeIds != null and knowledgeIds.size() > 0">
+				AND knowledge_id IN
+				<foreach collection="knowledgeIds" item="id" open="(" separator="," close=")">
+					#{id}
+				</foreach>
+			</if>
+		</where>
+		<if test="params != null and params.userId != null">
+			UNION
+			<include refid="selectSql"/>
+			<where>
+				(visible='1' and (create_by= #{params.userId} or #{params.isAdmin}))
+				<if test="knowledgeId != null and knowledgeId != ''">
+					AND knowledge_id = #{knowledgeId}
+				</if>
+				<if test="knowledgeIds != null and knowledgeIds.size() > 0">
+					AND knowledge_id IN
+					<foreach collection="knowledgeIds" item="id" open="(" separator="," close=")">
+						#{id}
+					</foreach>
+				</if>
+			</where>
+		</if>
+		order by create_time asc
+	</select>
+
+	<select id="selectAllKnowledgeList" parameterType="TakaiKnowledge" resultMap="BmKnowledgeResult">
+		<include refid="selectSql"/>
+		<where>
+			<if test="knowledgeId != null and knowledgeId != ''">
+				AND knowledge_id = #{knowledgeId}
+			</if>
+			<if test="knowledgeIds != null and knowledgeIds.size() > 0">
+				AND knowledge_id IN
+				<foreach collection="knowledgeIds" item="id" open="(" separator="," close=")">
+					#{id}
+				</foreach>
+			</if>
 		</where>
 		order by create_time asc
 	</select>
-	
+
 	<select id="selectTargetKnowledge" parameterType="TakaiKnowledge" resultMap="BmKnowledgeResult">
 		<include refid="selectSql"/>
 		where knowledge_id = #{knowledgeId}
 	</select>
- 	
+
  	<insert id="insertKnowledge" parameterType="TakaiKnowledge">
  		insert into bm_knowledge(
  			<if test="knowledgeId != null  and knowledgeId != ''">knowledge_id,</if>
  			<if test="embeddingId != null and embeddingId != ''">embedding_id,</if>
  			<if test="name != null and name != ''">name,</if>
  			<if test="description != null and description != ''">description,</if>
+			<if test="visible != null">visible,</if>
  			<if test="background != null and background != ''">background,</if>
 			<if test="icon != null and icon != ''">icon,</if>
 			<if test="wordNum != null">word_num,</if>
@@ -60,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="embeddingId != null and embeddingId != ''">#{embeddingId},</if>
 			<if test="name != null and name != ''">#{name},</if>
 			<if test="description != null and description != ''">#{description},</if>
+			<if test="visible != null">#{visible},</if>
 			<if test="background != null and background != ''">#{background},</if>
 			<if test="icon != null and icon != ''">#{icon},</if>
 			<if test="wordNum != null">#{wordNum},</if>
@@ -78,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="embeddingId != null">embedding_id = #{embeddingId},</if>
 			<if test="name != null and name != ''">name = #{name},</if>
 			<if test="description != null and description != ''">description = #{description},</if>
+			<if test="visible != null">visible = #{visible},</if>
 			<if test="background != null and background != ''">background = #{background},</if>
 			<if test="icon != null and icon != ''">icon = #{icon},</if>
 			<if test="wordNum != null">word_num = #{wordNum},</if>
@@ -93,5 +136,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<delete id="delKnowledge" parameterType="String">
 		delete from bm_knowledge where knowledge_id = #{knowledgeId}
 	</delete>
-	
-</mapper> 
+
+	<insert id="insertVipKnowledge" parameterType="VipKnowledge">
+		insert into vip_knowledge
+		<trim prefix="(" suffix=")" suffixOverrides=",">
+			<if test="knowledgeId != null">knowledge_id,</if>
+			<if test="userId != null">user_id,</if>
+		</trim>
+		<trim prefix="values (" suffix=")" suffixOverrides=",">
+			<if test="knowledgeId != null">#{knowledgeId},</if>
+			<if test="userId != null">#{userId},</if>
+		</trim>
+	</insert>
+	<delete id="deleteVipByknowledgeId" parameterType="String">
+		delete from vip_knowledge where knowledgeId = #{knowledgeId}
+	</delete>
+
+</mapper>

+ 4 - 104
takai-bigmodel/src/main/java/com/takai/bigmodel/domain/entity/BmApplication.java

@@ -2,14 +2,16 @@ package com.takai.bigmodel.domain.entity;
 
 import com.takai.common.core.domain.BaseEntity;
 import lombok.Builder;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 智谱应用列表 bm_application
- * 
+ *
  * @author takai
  */
+@Data
 @Builder
 public class BmApplication extends BaseEntity
 {
@@ -54,109 +56,7 @@ public class BmApplication extends BaseEntity
 
     private String knowledgeInfo;
 
-    public String getAppId() {
-        return appId;
-    }
-
-    public void setAppId(String appId) {
-        this.appId = appId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public void setDesc(String desc) {
-        this.desc = desc;
-    }
-
-    public String getPrompt() {
-        return prompt;
-    }
-
-    public void setPrompt(String prompt) {
-        this.prompt = prompt;
-    }
-
-    public String getTopP() {
-        return topP;
-    }
-
-    public void setTopP(String topP) {
-        this.topP = topP;
-    }
-
-    public String getTemperature() {
-        return temperature;
-    }
-
-    public void setTemperature(String temperature) {
-        this.temperature = temperature;
-    }
-
-    public String getKnowledgeIds() {
-        return knowledgeIds;
-    }
-
-    public void setKnowledgeIds(String knowledgeIds) {
-        this.knowledgeIds = knowledgeIds;
-    }
-
-    public Integer getSliceCount() {
-        return sliceCount;
-    }
-
-    public void setSliceCount(Integer sliceCount) {
-        this.sliceCount = sliceCount;
-    }
-
-    public String getModel() {
-        return model;
-    }
-
-    public void setModel(String model) {
-        this.model = model;
-    }
-
-    public String getIconColor() {
-        return iconColor;
-    }
-
-    public void setIconColor(String iconColor) {
-        this.iconColor = iconColor;
-    }
-
-    public String getIconType() {
-        return iconType;
-    }
-
-    public void setIconType(String iconType) {
-        this.iconType = iconType;
-    }
-
-    public Integer getMaxToken() {
-        return maxToken;
-    }
-
-    public void setMaxToken(Integer maxToken) {
-        this.maxToken = maxToken;
-    }
-
-    public String getKnowledgeInfo() {
-        return knowledgeInfo;
-    }
-
-    public void setKnowledgeInfo(String knowledgeInfo) {
-        this.knowledgeInfo = knowledgeInfo;
-    }
+    private String visible;
 
     @Override
     public String toString() {

+ 11 - 0
takai-bigmodel/src/main/java/com/takai/bigmodel/domain/entity/BmMediaReplacement.java

@@ -41,6 +41,8 @@ public class BmMediaReplacement extends BaseEntity
     /** url */
     private String mediaUrl;
 
+    private String knowledgeId;
+
 
     public Long getId() {
         return id;
@@ -90,6 +92,14 @@ public class BmMediaReplacement extends BaseEntity
         this.mediaUrl = mediaUrl;
     }
 
+    public String getKnowledgeId() {
+        return knowledgeId;
+    }
+
+    public void setKnowledgeId(String knowledgeId) {
+        this.knowledgeId = knowledgeId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -99,6 +109,7 @@ public class BmMediaReplacement extends BaseEntity
             .append("mediaType", getMediaType())
             .append("mediaKey", getMediaKey())
             .append("mediaUrl", getMediaUrl())
+            .append("knowledgeId", getKnowledgeId())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())

+ 7 - 6
takai-bigmodel/src/main/resources/mapper/bm/BmApplicationMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.takai.bigmodel.mapper.BmApplicationMapper">
-	
+
 	<resultMap type="BmApplication" id="BmApplicationResult">
 		<id property="appId"   column="appId"   />
 		<result property="name"  column="name"  />
@@ -25,9 +25,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateTime" column="update_time" />
 		<result property="knowledgeInfo"   column="knowledge_info"   />
 	</resultMap>
-	
+
 	<sql id="selectSql">
-        select appId, name, description, prompt, top_p, temperature, knowledge_ids, slice_count,model,icon_color,icon_type,max_token, create_by, create_time, remark, knowledge_info
+        select appId, name, description, prompt, top_p, temperature, knowledge_ids, slice_count,model,icon_color,icon_type,
+               max_token, create_by, create_time, remark, knowledge_info
 		from bm_application
     </sql>
 
@@ -45,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectSql"/>
 		where appId = #{appId}
 	</select>
- 	
+
  	<insert id="insertApplication" parameterType="BmApplication">
  		insert into bm_application(
  			<if test="appId != null">appId,</if>
@@ -109,5 +110,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<delete id="delApplication" parameterType="String">
 		delete from bm_application where appId = #{appId}
 	</delete>
-	
-</mapper> 
+
+</mapper>

+ 2 - 2
takai-common/src/main/java/com/takai/common/constant/Constants.java

@@ -4,7 +4,7 @@ import io.jsonwebtoken.Claims;
 
 /**
  * 通用常量信息
- * 
+ *
  * @author takai
  */
 public class Constants
@@ -63,7 +63,7 @@ public class Constants
      * 登录失败
      */
     public static final String LOGIN_FAIL = "Error";
- 
+
     /**
      * 验证码有效期(分钟)
      */

+ 5 - 5
takai-common/src/main/java/com/takai/common/core/domain/TreeSelect.java

@@ -9,7 +9,7 @@ import com.takai.common.core.domain.entity.SysMenu;
 
 /**
  * Treeselect树结构实体类
- * 
+ *
  * @author takai
  */
 public class TreeSelect implements Serializable
@@ -17,7 +17,7 @@ public class TreeSelect implements Serializable
     private static final long serialVersionUID = 1L;
 
     /** 节点ID */
-    private Long id;
+    private String id;
 
     /** 节点名称 */
     private String label;
@@ -40,17 +40,17 @@ public class TreeSelect implements Serializable
 
     public TreeSelect(SysMenu menu)
     {
-        this.id = menu.getMenuId();
+        this.id = String.valueOf(menu.getMenuId());
         this.label = menu.getMenuName();
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
-    public Long getId()
+    public String getId()
     {
         return id;
     }
 
-    public void setId(Long id)
+    public void setId(String id)
     {
         this.id = id;
     }

+ 24 - 0
takai-common/src/main/java/com/takai/common/core/domain/TreeStruct.java

@@ -0,0 +1,24 @@
+package com.takai.common.core.domain;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * TreeStruct类
+ *
+ * @author takai
+ */
+@Data
+public class TreeStruct
+{
+    private static final long serialVersionUID = 1L;
+
+
+    private String value;
+
+    private String label;
+
+    private List<TreeStruct> children = new ArrayList<TreeStruct>();
+}

+ 8 - 8
takai-common/src/main/java/com/takai/common/core/domain/entity/SysDept.java

@@ -12,7 +12,7 @@ import com.takai.common.core.domain.BaseEntity;
 
 /**
  * 部门表 sys_dept
- * 
+ *
  * @author takai
  */
 public class SysDept extends BaseEntity
@@ -20,10 +20,10 @@ public class SysDept extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 部门ID */
-    private Long deptId;
+    private String deptId;
 
     /** 父部门ID */
-    private Long parentId;
+    private String parentId;
 
     /** 祖级列表 */
     private String ancestors;
@@ -51,26 +51,26 @@ public class SysDept extends BaseEntity
 
     /** 父部门名称 */
     private String parentName;
-    
+
     /** 子部门 */
     private List<SysDept> children = new ArrayList<SysDept>();
 
-    public Long getDeptId()
+    public String getDeptId()
     {
         return deptId;
     }
 
-    public void setDeptId(Long deptId)
+    public void setDeptId(String deptId)
     {
         this.deptId = deptId;
     }
 
-    public Long getParentId()
+    public String getParentId()
     {
         return parentId;
     }
 
-    public void setParentId(Long parentId)
+    public void setParentId(String parentId)
     {
         this.parentId = parentId;
     }

+ 21 - 1
takai-common/src/main/java/com/takai/common/core/domain/entity/SysUser.java

@@ -14,7 +14,7 @@ import com.takai.common.xss.Xss;
 
 /**
  * 用户对象 sys_user
- * 
+ *
  * @author takai
  */
 public class SysUser extends BaseEntity
@@ -95,6 +95,10 @@ public class SysUser extends BaseEntity
 
     private String userType;
 
+    private String userTypeName;
+
+    private String deptName;
+
     public SysUser()
     {
 
@@ -319,6 +323,14 @@ public class SysUser extends BaseEntity
         this.userType = userType;
     }
 
+    public String getUserTypeName() {
+        return userTypeName;
+    }
+
+    public void setUserTypeName(String userTypeName) {
+        this.userTypeName = userTypeName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -345,4 +357,12 @@ public class SysUser extends BaseEntity
             .append("workNo", getWorkNo())
             .toString();
     }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
 }

+ 49 - 0
takai-common/src/main/java/com/takai/common/core/domain/model/FrameLoginBody.java

@@ -0,0 +1,49 @@
+package com.takai.common.core.domain.model;
+
+import lombok.Data;
+
+/**
+ * frame用户登录对象
+ *
+ * @author takai
+ */
+@Data
+public class FrameLoginBody
+{
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 项目ID
+     */
+    private String workspaceId;
+
+    /**
+     * 项目名称
+     */
+    private String workspaceName;
+
+    /**
+     * 客户端唯一标识
+     */
+    private String clientId;
+
+
+    /**
+     * 请求时间
+     */
+    private String timestamp;
+
+    /**
+     * 签名
+     */
+    private String signature;
+
+    /**
+     * 用户类型
+     */
+    private String userType;
+
+}

+ 30 - 0
takai-common/src/main/java/com/takai/common/enums/AppTypeEnum.java

@@ -0,0 +1,30 @@
+package com.takai.common.enums;
+
+/**
+ * 应用分组
+ *
+ * @author takai
+ */
+public enum AppTypeEnum
+{
+    SPECIALIZED("39", "专业知识"), MANAGEMENT("40", "职能管理"), PROJECT("41", "项目级应用");
+
+    private final String code;
+    private final String info;
+
+    AppTypeEnum(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 37 - 0
takai-common/src/main/java/com/takai/common/enums/ProjectTypeEnum.java

@@ -0,0 +1,37 @@
+package com.takai.common.enums;
+
+/**
+ * 应用分组
+ *
+ * @author takai
+ */
+public enum ProjectTypeEnum
+{
+    HJL("0", "慧监理", "a34851c530ee0d07d1154beb47bb93dd"), HXG("1", "慧项管","f47ac10b58cc4372a5670e06f141669d");
+
+    private final String code;
+    private final String info;
+    private final String clientId;
+
+    ProjectTypeEnum(String code, String info, String clientId)
+    {
+        this.code = code;
+        this.info = info;
+        this.clientId = clientId;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+
+    public String getClientId()
+    {
+        return clientId;
+    }
+}

+ 15 - 2
takai-common/src/main/java/com/takai/common/enums/UserTypeEnum.java

@@ -2,12 +2,12 @@ package com.takai.common.enums;
 
 /**
  * 用户状态
- * 
+ *
  * @author takai
  */
 public enum UserTypeEnum
 {
-    SYS_USER("00", "系统用户"), JK_USER("01", "建科用户");
+    SYS_USER("00", "系统用户"), JK_USER("01", "建科用户"), HJL_USER("02", "慧监理第三方用户"), HXG_USER("03", "慧项管第三方用户"), OTHER_USER("09", "其他用户");
 
     private final String code;
     private final String info;
@@ -27,4 +27,17 @@ public enum UserTypeEnum
     {
         return info;
     }
+
+    // 新增:通过code获取info的方法
+    public static String getInfoByCode(String code) {
+        // 遍历所有枚举值
+        for (UserTypeEnum userType : values()) {
+            // 找到匹配的code
+            if (userType.code.equals(code)) {
+                return userType.info;
+            }
+        }
+        // 没有找到对应code时返回null或默认值
+        return null;
+    }
 }

+ 7 - 3
takai-common/src/main/java/com/takai/common/utils/SecurityUtils.java

@@ -9,7 +9,7 @@ import com.takai.common.exception.ServiceException;
 
 /**
  * 安全服务工具类
- * 
+ *
  * @author takai
  */
 public class SecurityUtils
@@ -43,7 +43,7 @@ public class SecurityUtils
             throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED);
         }
     }
-    
+
     /**
      * 获取用户账户
      **/
@@ -98,6 +98,10 @@ public class SecurityUtils
         return passwordEncoder.encode(password);
     }
 
+    public static void main(String[] args) {
+        System.out.println(encryptPassword("123456"));
+    }
+
     /**
      * 判断密码是否相同
      *
@@ -113,7 +117,7 @@ public class SecurityUtils
 
     /**
      * 是否为管理员
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */

+ 34 - 2
takai-common/src/main/java/com/takai/common/utils/SnowflakeDigitGenerator.java

@@ -48,15 +48,47 @@ public class SnowflakeDigitGenerator {
 
         lastTimestamp = timestamp;
 
+        // 直接返回原始计算的唯一ID,不做取模转换
         long id = ((timestamp - twepoch) << timestampShift)
                 | (datacenterId << datacenterIdShift)
                 | (workerId << workerIdShift)
                 | sequence;
 
-        // 转换为19位数字
-        return 1000000000000000000L + (id % 9000000000000000000L);
+        // 确保生成的ID是19位数字
+        if (id < 1000000000000000000L) {
+            // 如果小于1e18,加上1e18确保19位
+            id += 1000000000000000000L;
+        }
+        return id;
     }
 
+//    public synchronized long nextId() {
+//        long timestamp = timeGen();
+//
+//        if (timestamp < lastTimestamp) {
+//            throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");
+//        }
+//
+//        if (lastTimestamp == timestamp) {
+//            sequence = (sequence + 1) & ((1 << sequenceBits) - 1);
+//            if (sequence == 0) {
+//                timestamp = tilNextMillis(lastTimestamp);
+//            }
+//        } else {
+//            sequence = 0L;
+//        }
+//
+//        lastTimestamp = timestamp;
+//
+//        long id = ((timestamp - twepoch) << timestampShift)
+//                | (datacenterId << datacenterIdShift)
+//                | (workerId << workerIdShift)
+//                | sequence;
+//
+//        // 转换为19位数字
+//        return 1000000000000000000L + (id % 9000000000000000000L);
+//    }
+
     private long tilNextMillis(long lastTimestamp) {
         long timestamp = timeGen();
         while (timestamp <= lastTimestamp) {

+ 6 - 6
takai-framework/src/main/java/com/takai/framework/config/SecurityConfig.java

@@ -22,7 +22,7 @@ import com.takai.framework.security.handle.LogoutSuccessHandlerImpl;
 
 /**
  * spring security配置
- * 
+ *
  * @author takai
  */
 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@@ -33,7 +33,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
      */
     @Autowired
     private UserDetailsService userDetailsService;
-    
+
     /**
      * 认证失败处理类
      */
@@ -51,7 +51,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
      */
     @Autowired
     private JwtAuthenticationTokenFilter authenticationTokenFilter;
-    
+
     /**
      * 跨域过滤器
      */
@@ -111,11 +111,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/jk_code_login","/register", "/captchaImage","/getToken","/**/sse-invoke","/**/application/list","/bigmodel/api/dialog/**",
+                .antMatchers("/login", "/jk_code_login","/frame_login","/register", "/captchaImage","/getToken","/**/sse-invoke","/**/application/list","/bigmodel/api/dialog/**",
                         "/**/completions", "/**/slice_info/**", "/**/async_result/**", "/**/assistant/**", "/getInfo",
-                        "/checkToken", "/**/presets/**", "/**/index/**", "/**/createApplaction/**", "/**/createKnowledge/**",
+                        "/checkToken/**", "/**/presets/**", "/**/index/**", "/**/createApplaction/**", "/**/createKnowledge/**",
                         "/**/updateKnowledge/**", "/**/detailKnowledge/**", "/**/delKnowledge/**", "/**/knowledgeList/**",
-                        "/**//bigmodel/api/**", "/**/tool/gen/**", "/**/deepseek/api/**",
+                        "/**//bigmodel/api/**", "/**/tool/gen/**","/**/deepseek/api/chat","/**/deepseek/api/free/**",
                         "/admin/login", "/**/deepseek/getInfo/**", "/**/system/info/**", "/**/system/audit/config/**",
                         "/**/system/project/**").permitAll()
                 // 静态资源,可匿名访问

+ 229 - 0
takai-framework/src/main/java/com/takai/framework/web/service/FrameLoginService.java

@@ -0,0 +1,229 @@
+package com.takai.framework.web.service;
+
+import com.takai.common.config.JkConfig;
+import com.takai.common.constant.Constants;
+import com.takai.common.core.domain.entity.SysUser;
+import com.takai.common.core.domain.model.FrameLoginBody;
+import com.takai.common.core.domain.model.LoginUser;
+import com.takai.common.core.redis.RedisCache;
+import com.takai.common.enums.UserTypeEnum;
+import com.takai.common.exception.ServiceException;
+import com.takai.common.exception.user.UserPasswordNotMatchException;
+import com.takai.common.utils.DateUtils;
+import com.takai.common.utils.MessageUtils;
+import com.takai.common.utils.SecurityUtils;
+import com.takai.common.utils.StringUtils;
+import com.takai.common.utils.ip.IpUtils;
+import com.takai.framework.manager.AsyncManager;
+import com.takai.framework.manager.factory.AsyncFactory;
+import com.takai.framework.security.context.AuthenticationContextHolder;
+import com.takai.system.domain.SysClient;
+import com.takai.system.domain.SysProject;
+import com.takai.system.domain.SysProjectStaff;
+import com.takai.system.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 建科Frame登录校验方法
+ *
+ * @author takai
+ */
+@Slf4j
+@Component
+public class FrameLoginService
+{
+    // 令牌自定义标识
+    @Value("${token.header}")
+    private String header;
+
+    // 令牌有效期(默认30分钟)
+    @Value("${token.expireTime}")
+    private int expireTime;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private IJkApiService jkApiService;
+
+    @Autowired
+    private ISysClientService clientService;
+
+    @Autowired
+    private JkConfig jkConfig;
+
+    @Autowired
+    private ISysProjectService sysProjectService;
+
+    @Autowired
+    private ISysProjectStaffService sysProjectStaffService;
+
+
+    /**
+     * 记录登录信息
+     *
+     * @param userId 用户ID
+     */
+    public void recordLoginInfo(String userId)
+    {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(IpUtils.getIpAddr());
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        userService.updateUserProfile(sysUser);
+    }
+
+    public Map<String, Object> login(FrameLoginBody loginBody)
+    {
+        //用户不存在或者非建科用户则添加用户
+        SysUser sysUser = checkUserExist(loginBody);
+        if (sysUser == null) {
+            sysUser = new SysUser();
+            sysUser.setUserName(loginBody.getUserName());
+            sysUser.setNickName(loginBody.getUserName());
+            sysUser.setPassword(SecurityUtils.encryptPassword(jkConfig.getJkPsw()));
+            sysUser.setUserType(loginBody.getUserType());
+            sysUser.setCreateBy("frameLogin");
+            sysUser.setCreateTime(DateUtils.getNowDate());
+            userService.insertUser(sysUser);
+        }
+
+        //项目不存在则添加项目
+        SysProject sysProject = sysProjectService.selectSysProjectByProjectPid(loginBody.getWorkspaceId());
+        if(sysProject == null) {
+            sysProject = new SysProject();
+            sysProject.setProjectPid(loginBody.getWorkspaceId());
+            sysProject.setProjectName(loginBody.getWorkspaceName());
+            sysProject.setSourceFrom(loginBody.getClientId());
+            sysProject.setCreateBy("frameLogin");
+            sysProject.setCreateTime(DateUtils.getNowDate());
+            sysProjectService.insertSysProject(sysProject);
+        }
+
+        //项目用户不存在则添加项目用户
+        SysProjectStaff sysProjectStaff = new SysProjectStaff();
+        sysProjectStaff.setProjectPid(loginBody.getWorkspaceId());
+        sysProjectStaff.setUserName(loginBody.getUserName());
+        sysProjectStaff.setUserId(sysUser.getUserId());
+        SysProjectStaff staff =  sysProjectStaffService.selectSysProjectStaff(sysProjectStaff);
+        if(staff == null) {
+            sysProjectStaffService.insertSysProjectStaff(sysProjectStaff);
+        }
+        String username = "";
+        // 用户验证
+        Authentication authentication = null;
+        try
+        {
+            username = loginBody.getUserName();
+            String password = jkConfig.getJkPsw();
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
+            AuthenticationContextHolder.setContext(authenticationToken);
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager.authenticate(authenticationToken);
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        finally
+        {
+            AuthenticationContextHolder.clearContext();
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        recordLoginInfo(loginUser.getUserId());
+
+        // 生成token
+        String login_token = tokenService.createToken(loginUser);
+        String token_key = tokenService.getTokenKey(login_token);
+        redisCache.setCacheObject(token_key, login_token, expireTime, TimeUnit.MINUTES);
+        Map<String, Object> map = new HashMap();
+        map.put("userId", loginUser.getUserId());
+        map.put("nickName", loginUser.getUser().getNickName());
+        map.put("token", login_token);
+        return map;
+    }
+
+
+
+    private SysUser checkUserExist(FrameLoginBody loginBody) {
+        SysUser sysUser = userService.selectUserByUserName(loginBody.getUserName());
+        if(sysUser == null) {
+            return null;
+        }
+        String newUserName = loginBody.getUserName();
+        //慧监理
+        if("a34851c530ee0d07d1154beb47bb93dd".equals(loginBody.getClientId())) {
+            loginBody.setUserType(UserTypeEnum.HJL_USER.getCode());
+            newUserName = loginBody.getUserName()+"_HJL";
+        //慧项管
+        } else if ("f47ac10b58cc4372a5670e06f141669d".equals(loginBody.getClientId())) {
+            loginBody.setUserType(UserTypeEnum.HXG_USER.getCode());
+            newUserName = loginBody.getUserName()+"_HXG";
+        } else {
+            loginBody.setUserType(UserTypeEnum.OTHER_USER.getCode());
+            newUserName = loginBody.getUserName()+"_OTHER";
+        }
+        if(UserTypeEnum.JK_USER.getCode().equals(sysUser.getUserType())
+                || sysUser.getUserType().equals(loginBody.getUserType())) {
+            return sysUser;
+        } else {
+            loginBody.setUserName(newUserName);
+        }
+
+        return checkUserExist(loginBody);
+    }
+
+    public boolean checkToken(String token){
+        String loginToken = redisCache.getCacheObject("login_token");
+        if(StringUtils.isNotEmpty(loginToken) && loginToken.equals(token)){
+            return true;
+        }
+        return false;
+    }
+
+
+    public void logout(){
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(user.getUserId());
+        sysUser.setLoginIp(IpUtils.getIpAddr());
+        sysUser.setStatus(Constants.LOGOUT);
+        sysUser.setUpdateTime(DateUtils.getNowDate());
+        userService.updateUserProfile(sysUser);
+        redisCache.deleteObject("login_token");
+    }
+}

+ 10 - 4
takai-framework/src/main/java/com/takai/framework/web/service/JkLoginService.java

@@ -36,7 +36,7 @@ import java.util.concurrent.TimeUnit;
 
 /**
  * 建科登录校验方法
- * 
+ *
  * @author takai
  */
 @Slf4j
@@ -47,6 +47,10 @@ public class JkLoginService
     @Value("${token.header}")
     private String header;
 
+    // 令牌有效期(默认30分钟)
+    @Value("${token.expireTime}")
+    private int expireTime;
+
     @Autowired
     private TokenService tokenService;
 
@@ -55,7 +59,7 @@ public class JkLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
@@ -131,7 +135,8 @@ public class JkLoginService
 
         // 生成token
         String login_token = tokenService.createToken(loginUser);
-        redisCache.setCacheObject("login_token", login_token, Constants.TOKEN_EXPIRATION, TimeUnit.MINUTES);
+        String token_key = tokenService.getTokenKey(login_token);
+        redisCache.setCacheObject(token_key, login_token, expireTime, TimeUnit.MINUTES);
         Map<String, Object> map = new HashMap();
         map.put("userId", loginUser.getUserId());
         map.put("nickName", loginUser.getUser().getNickName());
@@ -140,7 +145,8 @@ public class JkLoginService
     }
 
     public boolean checkToken(String token){
-        String loginToken = redisCache.getCacheObject("login_token");
+        String token_key = tokenService.getTokenKey(token);
+        String loginToken = redisCache.getCacheObject(token_key);
         if(StringUtils.isNotEmpty(loginToken) && loginToken.equals(token)){
             return true;
         }

+ 22 - 9
takai-framework/src/main/java/com/takai/framework/web/service/SysLoginService.java

@@ -4,6 +4,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
 import com.takai.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -40,9 +41,10 @@ import java.util.concurrent.TimeUnit;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author takai
  */
+@Slf4j
 @Component
 public class SysLoginService
 {
@@ -50,6 +52,10 @@ public class SysLoginService
     @Value("${token.header}")
     private String header;
 
+    // 令牌有效期(默认30分钟)
+    @Value("${token.expireTime}")
+    private int expireTime;
+
     @Autowired
     private TokenService tokenService;
 
@@ -58,7 +64,7 @@ public class SysLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
@@ -67,7 +73,7 @@ public class SysLoginService
 
     /**
      * 登录验证
-     * 
+     *
      * @param username 用户名
      * @param password 密码
      * @param code 验证码
@@ -127,7 +133,7 @@ public class SysLoginService
 
     /**
      * 校验验证码
-     * 
+     *
      * @param username 用户名
      * @param code 验证码
      * @param uuid 唯一标识
@@ -212,8 +218,10 @@ public class SysLoginService
         //bcc5e847c7d24319a49e752b4019ea7f
     }
 
-    public Map<String, Object> login(String username, String password)
+    public Map<String, Object> loginInfo(String username, String password,String code, String uuid)
     {
+        // 验证码校验
+        validateCaptcha(username, code, uuid);
         // 登录前置校验
         loginPreCheck(username, password);
         // 用户验证
@@ -245,10 +253,10 @@ public class SysLoginService
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         recordLoginInfo(Long.valueOf(loginUser.getUserId()));
-
         // 生成token
         String login_token = tokenService.createToken(loginUser);
-        redisCache.setCacheObject("login_token", login_token, Constants.TOKEN_EXPIRATION, TimeUnit.MINUTES);
+        String token_key = tokenService.getTokenKey(login_token);
+        redisCache.setCacheObject(token_key, login_token, expireTime, TimeUnit.MINUTES);
         Map<String, Object> map = new HashMap();
         map.put("userId", loginUser.getUserId());
         map.put("nickName", loginUser.getUser().getNickName());
@@ -257,7 +265,10 @@ public class SysLoginService
     }
 
     public boolean checkToken(String token){
-        String loginToken = redisCache.getCacheObject("login_token");
+        String token_key = tokenService.getTokenKey(token);
+        String loginToken = redisCache.getCacheObject(token_key);
+        log.info("checkToken=====:loginToken",loginToken);
+        log.info("checkToken=====:result",loginToken.equals(token));
         if(StringUtils.isNotEmpty(loginToken) && loginToken.equals(token)){
             return true;
         }
@@ -273,6 +284,8 @@ public class SysLoginService
         sysUser.setStatus(Constants.LOGOUT);
         sysUser.setUpdateTime(DateUtils.getNowDate());
         userService.updateUserProfile(sysUser);
-        redisCache.deleteObject("login_token");
+        String userKey = tokenService.getTokenKey(SecurityUtils.getLoginUser().getToken());
+        log.info("User:" + user.getUserId() + "logout, userKey:" + userKey);
+        redisCache.deleteObject(userKey);
     }
 }

+ 27 - 2
takai-framework/src/main/java/com/takai/framework/web/service/TokenService.java

@@ -45,7 +45,7 @@ public class TokenService
 
     protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
 
-    private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
+    private static final Long MILLIS_MINUTE_TEN = 10 * MILLIS_MINUTE;
 
     @Autowired
     private RedisCache redisCache;
@@ -77,6 +77,31 @@ public class TokenService
         return null;
     }
 
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUser getLoginUser(String token)
+    {
+        if (StringUtils.isNotEmpty(token))
+        {
+            try
+            {
+                Claims claims = parseToken(token);
+                // 解析对应的权限以及用户信息
+                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+                String userKey = getTokenKey(uuid);
+                LoginUser user = redisCache.getCacheObject(userKey);
+                return user;
+            }
+            catch (Exception e)
+            {
+            }
+        }
+        return null;
+    }
+
     /**
      * 设置用户身份信息
      */
@@ -219,7 +244,7 @@ public class TokenService
         return token;
     }
 
-    private String getTokenKey(String uuid)
+    public String getTokenKey(String uuid)
     {
         return CacheConstants.LOGIN_TOKEN_KEY + uuid;
     }

+ 6 - 0
takai-system/pom.xml

@@ -41,6 +41,12 @@
             <version>4.9.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.9</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 71 - 0
takai-system/src/main/java/com/takai/system/domain/SysClient.java

@@ -0,0 +1,71 @@
+package com.takai.system.domain;
+
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+ * 授权管理对象 sys_client
+ *
+ * @author hqjiang
+ * @date 2025-08-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysClient extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 客户端id
+     */
+    private String clientId;
+
+    /**
+     * 客户端key
+     */
+    private String clientKey;
+
+    /**
+     * 客户端秘钥
+     */
+    private String clientSecret;
+
+    /**
+     * 授权类型
+     */
+    private String grantType;
+
+    /**
+     * 客户端名称
+     */
+    private String clientName;
+
+    /**
+     * token活跃超时时间
+     */
+    private Long activeTimeout;
+
+    /**
+     * token固定超时时间
+     */
+    private Long timeout;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+
+}

+ 5 - 50
takai-system/src/main/java/com/takai/system/domain/SysProject.java

@@ -2,15 +2,17 @@ package com.takai.system.domain;
 
 import com.takai.common.annotation.Excel;
 import com.takai.common.core.domain.BaseEntity;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 【请填写功能名称】对象 sys_project
- * 
+ *
  * @author takai
  * @date 2025-05-28
  */
+@Data
 public class SysProject extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -32,57 +34,10 @@ public class SysProject extends BaseEntity
 
     private Long projectType;
 
-    public void setProjectId(long projectId)
-    {
-        this.projectId = projectId;
-    }
-
-    public long getProjectId()
-    {
-        return projectId;
-    }
-    public void setProjectPid(String projectPid) 
-    {
-        this.projectPid = projectPid;
-    }
-
-    public String getProjectPid() 
-    {
-        return projectPid;
-    }
-    public void setProjectName(String projectName) 
-    {
-        this.projectName = projectName;
-    }
+    private String sourceFrom;
 
-    public String getProjectName() 
-    {
-        return projectName;
-    }
-
-    public String[] getAppId() {
-        return appId;
-    }
+    private String sourceFromName;
 
-    public void setAppId(String[] appId) {
-        this.appId = appId;
-    }
-
-    public String[] getName() {
-        return name;
-    }
-
-    public void setName(String[] name) {
-        this.name = name;
-    }
-
-    public Long getProjectType() {
-        return projectType;
-    }
-
-    public void setProjectType(Long projectType) {
-        this.projectType = projectType;
-    }
 
     @Override
     public String toString() {

+ 29 - 0
takai-system/src/main/java/com/takai/system/domain/SysProjectTree.java

@@ -0,0 +1,29 @@
+package com.takai.system.domain;
+
+import com.takai.common.annotation.Excel;
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】对象 sys_project
+ *
+ * @author takai
+ * @date 2025-05-28
+ */
+@Data
+public class SysProjectTree
+{
+    private static final long serialVersionUID = 1L;
+
+    private String projectTypeCode;
+
+    private String projectTypeName;
+
+    private List<SysProject> projectList;
+
+
+}

+ 22 - 0
takai-system/src/main/java/com/takai/system/mapper/SysClientMapper.java

@@ -0,0 +1,22 @@
+package com.takai.system.mapper;
+
+import com.takai.system.domain.SysClient;
+import com.takai.system.domain.SysProject;
+
+/**
+ * 授权管理Mapper接口
+ *
+ * @author papb
+ * @date 2023-05-15
+ */
+public interface SysClientMapper
+{
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param clientId 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public SysClient selectSysClientById(String clientId);
+}

+ 23 - 23
takai-system/src/main/java/com/takai/system/mapper/SysDeptMapper.java

@@ -6,14 +6,14 @@ import com.takai.common.core.domain.entity.SysDept;
 
 /**
  * 部门管理 数据层
- * 
+ *
  * @author takai
  */
 public interface SysDeptMapper
 {
     /**
      * 查询部门管理数据
-     * 
+     *
      * @param dept 部门信息
      * @return 部门信息集合
      */
@@ -21,7 +21,7 @@ public interface SysDeptMapper
 
     /**
      * 根据角色ID查询部门树信息
-     * 
+     *
      * @param roleId 角色ID
      * @param deptCheckStrictly 部门树选择项是否关联显示
      * @return 选中部门列表
@@ -30,56 +30,56 @@ public interface SysDeptMapper
 
     /**
      * 根据部门ID查询信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门信息
      */
-    public SysDept selectDeptById(Long deptId);
+    public SysDept selectDeptById(String deptId);
 
     /**
      * 根据ID查询所有子部门
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门列表
      */
-    public List<SysDept> selectChildrenDeptById(Long deptId);
+    public List<SysDept> selectChildrenDeptById(String deptId);
 
     /**
      * 根据ID查询所有子部门(正常状态)
-     * 
+     *
      * @param deptId 部门ID
      * @return 子部门数
      */
-    public int selectNormalChildrenDeptById(Long deptId);
+    public int selectNormalChildrenDeptById(String deptId);
 
     /**
      * 是否存在子节点
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
-    public int hasChildByDeptId(Long deptId);
+    public int hasChildByDeptId(String deptId);
 
     /**
      * 查询部门是否存在用户
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
-    public int checkDeptExistUser(Long deptId);
+    public int checkDeptExistUser(String deptId);
 
     /**
      * 校验部门名称是否唯一
-     * 
+     *
      * @param deptName 部门名称
      * @param parentId 父部门ID
      * @return 结果
      */
-    public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId);
+    public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") String parentId);
 
     /**
      * 新增部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -87,7 +87,7 @@ public interface SysDeptMapper
 
     /**
      * 修改部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -95,14 +95,14 @@ public interface SysDeptMapper
 
     /**
      * 修改所在部门正常状态
-     * 
+     *
      * @param deptIds 部门ID组
      */
-    public void updateDeptStatusNormal(Long[] deptIds);
+    public void updateDeptStatusNormal(String[] deptIds);
 
     /**
      * 修改子元素关系
-     * 
+     *
      * @param depts 子元素
      * @return 结果
      */
@@ -110,16 +110,16 @@ public interface SysDeptMapper
 
     /**
      * 删除部门管理信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
-    public int deleteDeptById(Long deptId);
+    public int deleteDeptById(String deptId);
 
     /**
      * 校验部门ID是否存在
      * @param deptId
      * @return
      */
-    public int checkDeptExist(Long deptId);
+    public int checkDeptExist(String deptId);
 }

+ 9 - 2
takai-system/src/main/java/com/takai/system/mapper/SysProjectAppMapper.java

@@ -11,10 +11,10 @@ public interface SysProjectAppMapper {
     /**
      * 查询【请填写功能名称】
      *
-     * @param projectId 【请填写功能名称】主键
+     * @param appId 【请填写功能名称】主键
      * @return 【请填写功能名称】
      */
-    public SysProjectApp selectSysProjectAppByProjectId(String projectId);
+    public SysProjectApp selectSysProjectAppByAppId(String appId);
 
     /**
      * 查询【请填写功能名称】列表
@@ -48,6 +48,13 @@ public interface SysProjectAppMapper {
      */
     public int deleteSysProjectAppByProjectId(String projectId);
 
+    /**
+     * 通过APPID删除关联信息
+     * @param appId
+     * @return
+     */
+    public int  deleteSysProjectAppByAppId(String appId);
+
     /**
      * 批量删除【请填写功能名称】
      *

+ 8 - 0
takai-system/src/main/java/com/takai/system/mapper/SysProjectMapper.java

@@ -20,6 +20,14 @@ public interface SysProjectMapper
      */
     public SysProject selectSysProjectByProjectId(String projectId);
 
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param projectPid 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    public SysProject selectSysProjectByProjectPid(String projectPid);
+
     /**
      * 查询【请填写功能名称】列表
      * 

+ 17 - 8
takai-system/src/main/java/com/takai/system/mapper/SysProjectStaffMapper.java

@@ -6,15 +6,15 @@ import java.util.List;
 
 /**
  * 【请填写功能名称】Mapper接口
- * 
+ *
  * @author takai
  * @date 2025-05-28
  */
-public interface SysProjectStaffMapper 
+public interface SysProjectStaffMapper
 {
     /**
      * 查询【请填写功能名称】
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 【请填写功能名称】
      */
@@ -22,15 +22,24 @@ public interface SysProjectStaffMapper
 
     /**
      * 查询【请填写功能名称】列表
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 【请填写功能名称】集合
      */
     public List<SysProjectStaff> selectSysProjectStaffList(SysProjectStaff sysProjectStaff);
 
+
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param sysProjectStaff 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public SysProjectStaff selectSysProjectStaff(SysProjectStaff sysProjectStaff);
+
     /**
      * 新增【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -38,7 +47,7 @@ public interface SysProjectStaffMapper
 
     /**
      * 修改【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -46,7 +55,7 @@ public interface SysProjectStaffMapper
 
     /**
      * 删除【请填写功能名称】
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 结果
      */
@@ -54,7 +63,7 @@ public interface SysProjectStaffMapper
 
     /**
      * 批量删除【请填写功能名称】
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */

+ 37 - 13
takai-system/src/main/java/com/takai/system/mapper/SysUserMapper.java

@@ -6,14 +6,14 @@ import com.takai.common.core.domain.entity.SysUser;
 
 /**
  * 用户表 数据层
- * 
+ *
  * @author takai
  */
 public interface SysUserMapper
 {
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param sysUser 用户信息
      * @return 用户信息集合信息
      */
@@ -21,7 +21,7 @@ public interface SysUserMapper
 
     /**
      * 根据条件分页查询已配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -29,7 +29,7 @@ public interface SysUserMapper
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -37,7 +37,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -45,7 +45,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -53,7 +53,7 @@ public interface SysUserMapper
 
     /**
      * 新增用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -61,7 +61,7 @@ public interface SysUserMapper
 
     /**
      * 修改用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -69,7 +69,7 @@ public interface SysUserMapper
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -78,7 +78,7 @@ public interface SysUserMapper
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -87,7 +87,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -95,7 +95,7 @@ public interface SysUserMapper
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -103,7 +103,7 @@ public interface SysUserMapper
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param userName 用户名称
      * @return 结果
      */
@@ -131,4 +131,28 @@ public interface SysUserMapper
      * @return
      */
     public int checkUserExist(String userId);
+
+    /**
+     * 根据条件分页查询已配用户角色列表
+     *
+     * @param user 用户信息
+     * @return 用户信息集合信息
+     */
+    public List<SysUser> selectUserForAppVipList(SysUser user);
+
+    /**
+     * 根据条件分页查询已配用户角色列表
+     *
+     * @param appId 应用ID
+     * @return 用户信息集合信息
+     */
+    public List<SysUser> selectAppVipList(String appId);
+
+    /**
+     * 根据条件分页查询已配用户角色列表
+     *
+     * @param knowledgeId 知识库ID
+     * @return 用户信息集合信息
+     */
+    public List<SysUser> selectKnowledgeVipList(String knowledgeId);
 }

+ 25 - 0
takai-system/src/main/java/com/takai/system/service/ISysClientService.java

@@ -0,0 +1,25 @@
+package com.takai.system.service;
+
+
+
+import com.takai.system.domain.SysClient;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客户端管理Service接口
+ *
+ * @author hqjiang
+ * @date 2025-08-04
+ */
+public interface ISysClientService {
+
+
+    /**
+     * 查询客户端信息基于客户端id
+     */
+    SysClient selectSysClientById(String clientId);
+
+
+}

+ 21 - 21
takai-system/src/main/java/com/takai/system/service/ISysDeptService.java

@@ -7,14 +7,14 @@ import com.takai.common.core.domain.entity.SysUser;
 
 /**
  * 部门管理 服务层
- * 
+ *
  * @author takai
  */
 public interface ISysDeptService
 {
     /**
      * 查询部门管理数据
-     * 
+     *
      * @param dept 部门信息
      * @return 部门信息集合
      */
@@ -22,7 +22,7 @@ public interface ISysDeptService
 
     /**
      * 查询部门树结构信息
-     * 
+     *
      * @param dept 部门信息
      * @return 部门树信息集合
      */
@@ -30,7 +30,7 @@ public interface ISysDeptService
 
     /**
      * 构建前端所需要树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 树结构列表
      */
@@ -38,7 +38,7 @@ public interface ISysDeptService
 
     /**
      * 构建前端所需要下拉树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 下拉树结构列表
      */
@@ -46,7 +46,7 @@ public interface ISysDeptService
 
     /**
      * 根据角色ID查询部门树信息
-     * 
+     *
      * @param roleId 角色ID
      * @return 选中部门列表
      */
@@ -54,39 +54,39 @@ public interface ISysDeptService
 
     /**
      * 根据部门ID查询信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门信息
      */
-    public SysDept selectDeptById(Long deptId);
+    public SysDept selectDeptById(String deptId);
 
     /**
      * 根据ID查询所有子部门(正常状态)
-     * 
+     *
      * @param deptId 部门ID
      * @return 子部门数
      */
-    public int selectNormalChildrenDeptById(Long deptId);
+    public int selectNormalChildrenDeptById(String deptId);
 
     /**
      * 是否存在部门子节点
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
-    public boolean hasChildByDeptId(Long deptId);
+    public boolean hasChildByDeptId(String deptId);
 
     /**
      * 查询部门是否存在用户
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果 true 存在 false 不存在
      */
-    public boolean checkDeptExistUser(Long deptId);
+    public boolean checkDeptExistUser(String deptId);
 
     /**
      * 校验部门名称是否唯一
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -94,14 +94,14 @@ public interface ISysDeptService
 
     /**
      * 校验部门是否有数据权限
-     * 
+     *
      * @param deptId 部门id
      */
-    public void checkDeptDataScope(Long deptId);
+    public void checkDeptDataScope(String deptId);
 
     /**
      * 新增保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -117,7 +117,7 @@ public interface ISysDeptService
 
     /**
      * 修改保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -125,9 +125,9 @@ public interface ISysDeptService
 
     /**
      * 删除部门管理信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
-    public int deleteDeptById(Long deptId);
+    public int deleteDeptById(String deptId);
 }

+ 2 - 0
takai-system/src/main/java/com/takai/system/service/ISysProjectService.java

@@ -20,6 +20,8 @@ public interface ISysProjectService
      */
     public SysProject selectSysProjectByProjectId(String projectId);
 
+    SysProject selectSysProjectByProjectPid(String projectPid);
+
     /**
      * 查询【请填写功能名称】列表
      * 

+ 15 - 8
takai-system/src/main/java/com/takai/system/service/ISysProjectStaffService.java

@@ -6,15 +6,15 @@ import java.util.List;
 
 /**
  * 【请填写功能名称】Service接口
- * 
+ *
  * @author takai
  * @date 2025-05-28
  */
-public interface ISysProjectStaffService 
+public interface ISysProjectStaffService
 {
     /**
      * 查询【请填写功能名称】
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 【请填写功能名称】
      */
@@ -22,15 +22,22 @@ public interface ISysProjectStaffService
 
     /**
      * 查询【请填写功能名称】列表
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 【请填写功能名称】集合
      */
     public List<SysProjectStaff> selectSysProjectStaffList(SysProjectStaff sysProjectStaff);
 
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param sysProjectStaff 【请填写功能名称】
+     * @return 【请填写功能名称】集合
+     */
+    public SysProjectStaff selectSysProjectStaff(SysProjectStaff sysProjectStaff);
     /**
      * 新增【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -38,7 +45,7 @@ public interface ISysProjectStaffService
 
     /**
      * 修改【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -46,7 +53,7 @@ public interface ISysProjectStaffService
 
     /**
      * 批量删除【请填写功能名称】
-     * 
+     *
      * @param ids 需要删除的【请填写功能名称】主键集合
      * @return 结果
      */
@@ -54,7 +61,7 @@ public interface ISysProjectStaffService
 
     /**
      * 删除【请填写功能名称】信息
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 结果
      */

+ 32 - 23
takai-system/src/main/java/com/takai/system/service/ISysUserService.java

@@ -1,18 +1,20 @@
 package com.takai.system.service;
 
 import java.util.List;
+
+import com.takai.common.annotation.DataScope;
 import com.takai.common.core.domain.entity.SysUser;
 
 /**
  * 用户 业务层
- * 
+ *
  * @author takai
  */
 public interface ISysUserService
 {
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -20,7 +22,7 @@ public interface ISysUserService
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -28,7 +30,7 @@ public interface ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -36,7 +38,7 @@ public interface ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -44,7 +46,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -52,7 +54,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -60,7 +62,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -68,7 +70,7 @@ public interface ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -92,21 +94,21 @@ public interface ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     public void checkUserAllowed(SysUser user);
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     public void checkUserDataScope(String userId);
 
     /**
      * 新增用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -122,7 +124,7 @@ public interface ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -130,7 +132,7 @@ public interface ISysUserService
 
     /**
      * 修改用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -138,7 +140,7 @@ public interface ISysUserService
 
     /**
      * 用户授权角色
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -146,7 +148,7 @@ public interface ISysUserService
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -154,7 +156,7 @@ public interface ISysUserService
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -162,7 +164,7 @@ public interface ISysUserService
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -171,7 +173,7 @@ public interface ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -179,7 +181,7 @@ public interface ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -188,7 +190,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -196,7 +198,7 @@ public interface ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -204,11 +206,18 @@ public interface ISysUserService
 
     /**
      * 导入用户数据
-     * 
+     *
      * @param userList 用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
      * @param operName 操作用户
      * @return 结果
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+
+    List<SysUser> selectUserForAppVipList(SysUser user);
+
+    List<SysUser> selectAppVipList(String appId);
+
+    List<SysUser> selectKnowledgeVipList(String knowledgeId);
 }

+ 2 - 2
takai-system/src/main/java/com/takai/system/service/impl/JkApiServiceImpl.java

@@ -171,9 +171,9 @@ public class JkApiServiceImpl implements IJkApiService {
         for(int i = 0; i < jsonArray.size(); i++) {
             SysDept sysDept = new SysDept();
             JSONObject json = jsonArray.getJSONObject(i);
-            sysDept.setDeptId(json.getLong("idt_org__id"));
+            sysDept.setDeptId(json.getString("idt_org__id"));
             sysDept.setDeptName(json.getString("idt_org__name"));
-            sysDept.setParentId(json.getLong("idt_org__parent_id"));
+            sysDept.setParentId(json.getString("idt_org__parent_id"));
             sysDept.setAncestors(json.getString("idt_org__org_path").substring(1).replaceAll("/",","));
             //部门状态,启用:1,停用:0
             String status = json.getString("idt_org__status");

+ 35 - 0
takai-system/src/main/java/com/takai/system/service/impl/SysClientServiceImpl.java

@@ -0,0 +1,35 @@
+package com.takai.system.service.impl;
+
+
+import com.takai.system.domain.SysClient;
+import com.takai.system.mapper.SysClientMapper;
+import com.takai.system.service.ISysClientService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 客户端管理Service业务层处理
+ *
+ * @author papb
+ * @date 2023-06-18
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysClientServiceImpl implements ISysClientService {
+
+    private final SysClientMapper baseMapper;
+    /**
+     * 查询客户端管理
+     */
+    @Override
+    public SysClient selectSysClientById(String clientId) {
+        return baseMapper.selectSysClientById(clientId);
+    }
+
+}

+ 29 - 29
takai-system/src/main/java/com/takai/system/service/impl/SysDeptServiceImpl.java

@@ -24,7 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 部门管理 服务实现
- * 
+ *
  * @author takai
  */
 @Service
@@ -38,7 +38,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 查询部门管理数据
-     * 
+     *
      * @param dept 部门信息
      * @return 部门信息集合
      */
@@ -51,7 +51,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 查询部门树结构信息
-     * 
+     *
      * @param dept 部门信息
      * @return 部门树信息集合
      */
@@ -64,7 +64,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 构建前端所需要树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 树结构列表
      */
@@ -72,7 +72,7 @@ public class SysDeptServiceImpl implements ISysDeptService
     public List<SysDept> buildDeptTree(List<SysDept> depts)
     {
         List<SysDept> returnList = new ArrayList<SysDept>();
-        List<Long> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
+        List<String> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
         for (SysDept dept : depts)
         {
             // 如果是顶级节点, 遍历该父节点的所有子节点
@@ -91,7 +91,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 构建前端所需要下拉树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 下拉树结构列表
      */
@@ -104,7 +104,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 根据角色ID查询部门树信息
-     * 
+     *
      * @param roleId 角色ID
      * @return 选中部门列表
      */
@@ -117,36 +117,36 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 根据部门ID查询信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门信息
      */
     @Override
-    public SysDept selectDeptById(Long deptId)
+    public SysDept selectDeptById(String deptId)
     {
         return deptMapper.selectDeptById(deptId);
     }
 
     /**
      * 根据ID查询所有子部门(正常状态)
-     * 
+     *
      * @param deptId 部门ID
      * @return 子部门数
      */
     @Override
-    public int selectNormalChildrenDeptById(Long deptId)
+    public int selectNormalChildrenDeptById(String deptId)
     {
         return deptMapper.selectNormalChildrenDeptById(deptId);
     }
 
     /**
      * 是否存在子节点
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public boolean hasChildByDeptId(Long deptId)
+    public boolean hasChildByDeptId(String deptId)
     {
         int result = deptMapper.hasChildByDeptId(deptId);
         return result > 0;
@@ -154,12 +154,12 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 查询部门是否存在用户
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果 true 存在 false 不存在
      */
     @Override
-    public boolean checkDeptExistUser(Long deptId)
+    public boolean checkDeptExistUser(String deptId)
     {
         int result = deptMapper.checkDeptExistUser(deptId);
         return result > 0;
@@ -167,16 +167,16 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 校验部门名称是否唯一
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
     public boolean checkDeptNameUnique(SysDept dept)
     {
-        Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
+        String deptId = StringUtils.isNull(dept.getDeptId()) ? "-1" : dept.getDeptId();
         SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
-        if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue())
+        if (StringUtils.isNotNull(info) && !info.getDeptId().equals(deptId))
         {
             return UserConstants.NOT_UNIQUE;
         }
@@ -185,11 +185,11 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 校验部门是否有数据权限
-     * 
+     *
      * @param deptId 部门id
      */
     @Override
-    public void checkDeptDataScope(Long deptId)
+    public void checkDeptDataScope(String deptId)
     {
         if (!SysUser.isAdmin(SecurityUtils.getUserId()))
         {
@@ -205,7 +205,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 新增保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -252,7 +252,7 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 修改保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
@@ -280,24 +280,24 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 修改该部门的父级部门状态
-     * 
+     *
      * @param dept 当前部门
      */
     private void updateParentDeptStatusNormal(SysDept dept)
     {
         String ancestors = dept.getAncestors();
-        Long[] deptIds = Convert.toLongArray(ancestors);
+        String[] deptIds = Convert.toStrArray(ancestors);
         deptMapper.updateDeptStatusNormal(deptIds);
     }
 
     /**
      * 修改子元素关系
-     * 
+     *
      * @param deptId 被修改的部门ID
      * @param newAncestors 新的父ID集合
      * @param oldAncestors 旧的父ID集合
      */
-    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
+    public void updateDeptChildren(String deptId, String newAncestors, String oldAncestors)
     {
         List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
         for (SysDept child : children)
@@ -312,12 +312,12 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 删除部门管理信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public int deleteDeptById(Long deptId)
+    public int deleteDeptById(String deptId)
     {
         return deptMapper.deleteDeptById(deptId);
     }
@@ -349,7 +349,7 @@ public class SysDeptServiceImpl implements ISysDeptService
         while (it.hasNext())
         {
             SysDept n = (SysDept) it.next();
-            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().equals(t.getDeptId()))
             {
                 tlist.add(n);
             }

+ 66 - 13
takai-system/src/main/java/com/takai/system/service/impl/SysProjectServiceImpl.java

@@ -1,27 +1,36 @@
 package com.takai.system.service.impl;
 
+import com.takai.common.core.domain.entity.SysUser;
+import com.takai.common.enums.AppTypeEnum;
+import com.takai.common.enums.ProjectTypeEnum;
 import com.takai.common.utils.DateUtils;
+import com.takai.common.utils.SecurityUtils;
 import com.takai.common.utils.SnowflakeDigitGenerator;
+import com.takai.common.utils.StringUtils;
 import com.takai.system.domain.ProjectApplication;
 import com.takai.system.domain.SysProject;
 import com.takai.system.domain.SysProjectApp;
 import com.takai.system.mapper.SysProjectAppMapper;
 import com.takai.system.mapper.SysProjectMapper;
 import com.takai.system.service.ISysProjectService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 【请填写功能名称】Service业务层处理
- * 
+ *
  * @author takai
  * @date 2025-05-28
  */
+@Slf4j
 @Service
-public class SysProjectServiceImpl implements ISysProjectService 
+public class SysProjectServiceImpl implements ISysProjectService
 {
     @Autowired
     private SysProjectMapper sysProjectMapper;
@@ -31,7 +40,7 @@ public class SysProjectServiceImpl implements ISysProjectService
 
     /**
      * 查询【请填写功能名称】
-     * 
+     *
      * @param projectId 【请填写功能名称】主键
      * @return 【请填写功能名称】
      */
@@ -52,23 +61,65 @@ public class SysProjectServiceImpl implements ISysProjectService
         return vo;
     }
 
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param projectPid 【请填写功能名称】主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public SysProject selectSysProjectByProjectPid(String projectPid)
+    {
+        return sysProjectMapper.selectSysProjectByProjectPid(projectPid);
+    }
+
+
+
     /**
      * 查询【请填写功能名称】列表
-     * 
+     *
      * @param sysProject 【请填写功能名称】
      * @return 【请填写功能名称】
      */
     @Override
     public List<SysProject> selectSysProjectList(SysProject sysProject)
     {
+        //管理员 获取所有项目
+        log.info("selectSysProjectList:SecurityUtils.getLoginUser()",SecurityUtils.getLoginUser());
+        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
+        Map<String,Object> userParams = new HashMap<>();
+        userParams.put("userId",loginUser.getUserId());
+        log.info("selectSysProjectList:userId",loginUser.getUserId());
+        if(loginUser.getRoles().stream().anyMatch(role -> role.getRoleId() == 1)) {
+            log.info("selectSysProjectList:isAdmin",true);
+            userParams.put("isAdmin", true);
+        } else {
+            log.info("selectSysProjectList:isAdmin",false);
+            userParams.put("isAdmin", false);
+        }
+        if(sysProject == null){
+            sysProject = new SysProject();
+        }
+        sysProject.setParams(userParams);
         List<SysProject> list = sysProjectMapper.selectSysProjectList(sysProject);
+
         for (SysProject sysProjects : list){
+            if(sysProjects.getSourceFrom() != null) {
+                if(ProjectTypeEnum.HJL.getClientId().equals(sysProjects.getSourceFrom())) {
+                    sysProjects.setSourceFromName(ProjectTypeEnum.HJL.getInfo());
+                } else if (ProjectTypeEnum.HXG.getClientId().equals(sysProjects.getSourceFrom())) {
+                    sysProjects.setSourceFromName(ProjectTypeEnum.HXG.getInfo());
+                }
+
+            }
             SysProjectApp params = new SysProjectApp();
             params.setProjectId(String.valueOf(sysProjects.getProjectId()));
             List<ProjectApplication> sysProjectApps = sysProjectAppMapper.selectSysProjectApplicationList(params);
             List<String> names = new ArrayList<>();
             for (ProjectApplication sysProjectApp : sysProjectApps){
-                names.add(sysProjectApp.getName());
+                if(sysProjectApp != null) {
+                    names.add(sysProjectApp.getName());
+                }
             }
             sysProjects.setName(names.toArray(new String[names.size()]));
         }
@@ -77,19 +128,21 @@ public class SysProjectServiceImpl implements ISysProjectService
 
     /**
      * 新增【请填写功能名称】
-     * 
+     *
      * @param sysProject 【请填写功能名称】
      * @return 结果
      */
     @Override
     public int insertSysProject(SysProject sysProject)
     {
-        SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
-        long projectPId = snowflakeDigitGenerator.nextId();
+        if(StringUtils.isEmpty(sysProject.getProjectPid())) {
+            SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
+            long projectPId = snowflakeDigitGenerator.nextId();
+            sysProject.setProjectPid(String.valueOf(projectPId));
+        }
         sysProject.setCreateTime(DateUtils.getNowDate());
-        sysProject.setProjectPid(String.valueOf(projectPId));
         int i = sysProjectMapper.insertSysProject(sysProject);
-        if(i > 0){
+        if(i > 0 && sysProject.getAppId() != null){
             for (String appId : sysProject.getAppId()){
                 SysProjectApp sysProjectApp = new SysProjectApp();
                 sysProjectApp.setProjectId(String.valueOf(sysProject.getProjectId()));
@@ -102,7 +155,7 @@ public class SysProjectServiceImpl implements ISysProjectService
 
     /**
      * 修改【请填写功能名称】
-     * 
+     *
      * @param sysProject 【请填写功能名称】
      * @return 结果
      */
@@ -127,7 +180,7 @@ public class SysProjectServiceImpl implements ISysProjectService
 
     /**
      * 批量删除【请填写功能名称】
-     * 
+     *
      * @param projectIds 需要删除的【请填写功能名称】主键
      * @return 结果
      */
@@ -143,7 +196,7 @@ public class SysProjectServiceImpl implements ISysProjectService
 
     /**
      * 删除【请填写功能名称】信息
-     * 
+     *
      * @param projectId 【请填写功能名称】主键
      * @return 结果
      */

+ 21 - 8
takai-system/src/main/java/com/takai/system/service/impl/SysProjectStaffServiceImpl.java

@@ -12,19 +12,19 @@ import java.util.List;
 
 /**
  * 【请填写功能名称】Service业务层处理
- * 
+ *
  * @author takai
  * @date 2025-05-28
  */
 @Service
-public class SysProjectStaffServiceImpl implements ISysProjectStaffService 
+public class SysProjectStaffServiceImpl implements ISysProjectStaffService
 {
     @Autowired
     private SysProjectStaffMapper sysProjectStaffMapper;
 
     /**
      * 查询【请填写功能名称】
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 【请填写功能名称】
      */
@@ -36,7 +36,7 @@ public class SysProjectStaffServiceImpl implements ISysProjectStaffService
 
     /**
      * 查询【请填写功能名称】列表
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 【请填写功能名称】
      */
@@ -46,9 +46,22 @@ public class SysProjectStaffServiceImpl implements ISysProjectStaffService
         return sysProjectStaffMapper.selectSysProjectStaffList(sysProjectStaff);
     }
 
+    /**
+     * 查询【请填写功能名称】列表
+     *
+     * @param sysProjectStaff 【请填写功能名称】
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public SysProjectStaff selectSysProjectStaff(SysProjectStaff sysProjectStaff)
+    {
+        return sysProjectStaffMapper.selectSysProjectStaff(sysProjectStaff);
+    }
+
+
     /**
      * 新增【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -66,7 +79,7 @@ public class SysProjectStaffServiceImpl implements ISysProjectStaffService
 
     /**
      * 修改【请填写功能名称】
-     * 
+     *
      * @param sysProjectStaff 【请填写功能名称】
      * @return 结果
      */
@@ -82,7 +95,7 @@ public class SysProjectStaffServiceImpl implements ISysProjectStaffService
 
     /**
      * 批量删除【请填写功能名称】
-     * 
+     *
      * @param ids 需要删除的【请填写功能名称】主键
      * @return 结果
      */
@@ -94,7 +107,7 @@ public class SysProjectStaffServiceImpl implements ISysProjectStaffService
 
     /**
      * 删除【请填写功能名称】信息
-     * 
+     *
      * @param id 【请填写功能名称】主键
      * @return 结果
      */

+ 65 - 29
takai-system/src/main/java/com/takai/system/service/impl/SysUserServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import javax.validation.Validator;
 
+import com.takai.common.enums.UserTypeEnum;
 import com.takai.common.utils.SnowflakeDigitGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +35,7 @@ import com.takai.system.service.ISysUserService;
 
 /**
  * 用户 业务层处理
- * 
+ *
  * @author takai
  */
 @Service
@@ -65,7 +66,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -73,12 +74,19 @@ public class SysUserServiceImpl implements ISysUserService
     @DataScope(deptAlias = "d", userAlias = "u")
     public List<SysUser> selectUserList(SysUser user)
     {
-        return userMapper.selectUserList(user);
+        List<SysUser> userList = userMapper.selectUserList(user);
+        if(!CollectionUtils.isEmpty(userList)){
+            for (SysUser u : userList) {
+                String name = UserTypeEnum.getInfoByCode(u.getUserType());
+                u.setUserTypeName(name);
+            }
+        }
+        return userList;
     }
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -91,7 +99,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -104,7 +112,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -116,19 +124,22 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
     @Override
     public SysUser selectUserById(String userId)
     {
-        return userMapper.selectUserById(userId);
+        SysUser user = userMapper.selectUserById(userId);
+        String name = UserTypeEnum.getInfoByCode(user.getUserType());
+        user.setUserTypeName(name);
+        return user;
     }
 
     /**
      * 查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -145,7 +156,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -162,7 +173,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -216,13 +227,14 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     @Override
     public void checkUserAllowed(SysUser user)
     {
-        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
+
+        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin() && !SecurityUtils.getLoginUser().getUser().isAdmin())
         {
             throw new ServiceException("不允许操作超级管理员用户");
         }
@@ -230,7 +242,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     @Override
@@ -250,7 +262,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -300,7 +312,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -312,7 +324,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -334,7 +346,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 用户授权角色
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -348,7 +360,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -360,7 +372,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -372,7 +384,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -385,7 +397,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -397,7 +409,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -410,7 +422,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserRole(SysUser user)
@@ -420,7 +432,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户岗位信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserPost(SysUser user)
@@ -443,7 +455,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -466,7 +478,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -483,7 +495,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -505,7 +517,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 导入用户数据
-     * 
+     *
      * @param userList 用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
      * @param operName 操作用户
@@ -574,4 +586,28 @@ public class SysUserServiceImpl implements ISysUserService
         }
         return successMsg.toString();
     }
+
+    /**
+     * 根据条件分页查询用户列表
+     *
+     * @param user 用户信息
+     * @return 用户信息集合信息
+     */
+    @DataScope(deptAlias = "d", userAlias = "u")
+    @Override
+    public List<SysUser> selectUserForAppVipList(SysUser user)
+    {
+        List<SysUser> userList = userMapper.selectUserForAppVipList(user);
+        return userList;
+    }
+
+    @Override
+    public List<SysUser> selectAppVipList(String appId) {
+        return userMapper.selectAppVipList(appId);
+    }
+
+    @Override
+    public List<SysUser> selectKnowledgeVipList(String knowledgeId) {
+        return userMapper.selectKnowledgeVipList(knowledgeId);
+    }
 }

+ 28 - 0
takai-system/src/main/resources/mapper/system/SysClientMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.takai.system.mapper.SysClientMapper">
+    <resultMap type="SysClient" id="SysClientResult">
+        <result property="clientId"    column="client_id"    />
+        <result property="clientSecret"    column="client_secret"    />
+        <result property="clientKey"    column="client_key"    />
+        <result property="clientName"    column="client_name"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+    <select id="selectSysClientById" parameterType="String" resultMap="SysClientResult">
+        select client_id,
+               client_secret,
+               client_key,
+               client_name,
+               create_by,
+               create_time,
+               update_by,
+               update_time
+        from sys_client
+        where client_id = #{clientId}
+    </select>
+</mapper>

+ 25 - 25
takai-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -21,12 +21,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateBy"   column="update_by"   />
 		<result property="updateTime" column="update_time" />
 	</resultMap>
-	
+
 	<sql id="selectDeptVo">
-        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time 
+        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
         from sys_dept d
     </sql>
-    
+
 	<select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
         <include refid="selectDeptVo"/>
         where d.del_flag = '0'
@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		${params.dataScope}
 		order by d.parent_id, d.order_num
     </select>
-    
+
     <select id="selectDeptListByRoleId" resultType="Long">
 		select d.dept_id
 		from sys_dept d
@@ -57,40 +57,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
 		order by d.parent_id, d.order_num
 	</select>
-    
-    <select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
+
+    <select id="selectDeptById" parameterType="String" resultMap="SysDeptResult">
 		select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
 			(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
 		from sys_dept d
 		where d.dept_id = #{deptId}
 	</select>
-    
-    <select id="checkDeptExistUser" parameterType="Long" resultType="int">
+
+    <select id="checkDeptExistUser" parameterType="String" resultType="int">
 		select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'
 	</select>
-	
-	<select id="hasChildByDeptId" parameterType="Long" resultType="int">
+
+	<select id="hasChildByDeptId" parameterType="String" resultType="int">
 		select count(1) from sys_dept
 		where del_flag = '0' and parent_id = #{deptId} limit 1
 	</select>
-	
-	<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
+
+	<select id="selectChildrenDeptById" parameterType="String" resultMap="SysDeptResult">
 		select * from sys_dept where find_in_set(#{deptId}, ancestors)
 	</select>
-	
-	<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
+
+	<select id="selectNormalChildrenDeptById" parameterType="String" resultType="int">
 		select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
 	</select>
-	
+
 	<select id="checkDeptNameUnique" resultMap="SysDeptResult">
 	    <include refid="selectDeptVo"/>
 		where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
 	</select>
 
-	<select id="checkDeptExist" parameterType="Long" resultType="Integer">
+	<select id="checkDeptExist" parameterType="String" resultType="Integer">
 		select count(1) from sys_dept where dept_id = #{deptId}
 	</select>
-    
+
     <insert id="insertDept" parameterType="SysDept">
  		insert into sys_dept(
  			<if test="deptId != null and deptId != 0">dept_id,</if>
@@ -118,7 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
-	
+
 	<update id="updateDept" parameterType="SysDept">
  		update sys_dept
  		<set>
@@ -135,7 +135,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  		</set>
  		where dept_id = #{deptId}
 	</update>
-	
+
 	<update id="updateDeptChildren" parameterType="java.util.List">
 	    update sys_dept set ancestors =
 	    <foreach collection="depts" item="item" index="index"
@@ -148,16 +148,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	        #{item.deptId}
 	    </foreach>
 	</update>
-	 
-	<update id="updateDeptStatusNormal" parameterType="Long">
- 	    update sys_dept set status = '0' where dept_id in 
+
+	<update id="updateDeptStatusNormal" parameterType="String">
+ 	    update sys_dept set status = '0' where dept_id in
  	    <foreach collection="array" item="deptId" open="(" separator="," close=")">
         	#{deptId}
         </foreach>
 	</update>
-	
-	<delete id="deleteDeptById" parameterType="Long">
+
+	<delete id="deleteDeptById" parameterType="String">
 		update sys_dept set del_flag = '2' where dept_id = #{deptId}
 	</delete>
 
-</mapper> 
+</mapper>

+ 7 - 3
takai-system/src/main/resources/mapper/system/SysProjectAppMapper.xml

@@ -26,9 +26,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
-    <select id="selectSysProjectAppByProjectId" parameterType="String" resultMap="SysProjectAppResult">
+    <select id="selectSysProjectAppByAppId" parameterType="String" resultMap="SysProjectAppResult">
         <include refid="selectSysProjectAppVo"/>
-        where project_id = #{projectId}
+        where app_id = #{appId}
     </select>
 
     <insert id="insertSysProjectApp" parameterType="SysProjectApp">
@@ -62,6 +62,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <delete id="deleteSysProjectAppByAppId" parameterType="String">
+        delete from sys_project_app where app_id = #{appId}
+    </delete>
+
     <select id="selectSysProjectApplicationList" parameterType="SysProject" resultMap="SysProjectResult">
         select bm.name from sys_project_app spa
         left join bm_application bm on spa.app_id = bm.appId
@@ -70,4 +74,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="appId != null  and appId != ''"> and app_id = #{appId}</if>
         </where>
     </select>
-</mapper>
+</mapper>

+ 32 - 13
takai-system/src/main/resources/mapper/system/SysProjectMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.takai.system.mapper.SysProjectMapper">
-    
+
     <resultMap type="SysProject" id="SysProjectResult">
         <result property="projectId"    column="project_id"    />
         <result property="projectPid"    column="project_pid"    />
@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <!--        <result property="appId"    column="appId"    />-->
 <!--        <result property="name"    column="name"    />-->
         <result property="projectType"    column="project_type"    />
+        <result property="sourceFrom"    column="source_from"    />
     </resultMap>
 
     <sql id="selectSysProjectVo">
@@ -31,17 +32,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                sp.update_time,
                /*ba.appId,
                ba.name*/
-               sp.project_type
+               sp.project_type,
+               sp.source_from
         from sys_project as sp
-         /*left join sys_project_app as spa on sp.project_id = spa.project_id*/
-        /*left join bm_application as ba on ba.appId = spa.app_id*/
-        <where>  
+        <where>
             <if test="projectPid != null  and projectPid != ''"> and sp.project_pid = #{projectPid}</if>
             <if test="projectName != null  and projectName != ''"> and sp.project_name like concat('%', #{projectName}, '%')</if>
-            <!--<if test="appId != null  and appId != ''"> and ba.appId = #{appId}</if>-->
+            <if test="params != null and params.userId != null and params.isAdmin == false">
+                and sp.project_pid in (select project_pid from sys_project_staff where user_id = #{params.userId})
+            </if>
         </where>
     </select>
-    
+
     <select id="selectSysProjectByProjectId" parameterType="String" resultMap="SysProjectResult">
         select sp.project_id,
                sp.project_pid,
@@ -52,13 +54,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                sp.update_time,
             /*   ba.appId,
                ba.name*/
-               sp.project_type
+               sp.project_type,
+               sp.source_from
         from sys_project as sp
 --                  left join sys_project_app as spa on sp.project_id = spa.project_id
                  /*left join bm_application as ba on ba.appId = spa.app_id*/
         where sp.project_id = #{projectId}
     </select>
-        
+
+    <select id="selectSysProjectByProjectPid" parameterType="String" resultMap="SysProjectResult">
+        select sp.project_id,
+               sp.project_pid,
+               sp.project_name,
+               sp.create_by,
+               sp.create_time,
+               sp.update_by,
+               sp.update_time,
+               sp.project_type
+        from sys_project as sp
+        where sp.project_pid = #{projectPId}
+    </select>
+
     <insert id="insertSysProject" parameterType="SysProject" useGeneratedKeys="true" keyProperty="projectId">
         insert into sys_project(
             <if test="projectPid != null">project_pid,</if>
@@ -67,7 +83,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="projectType != null">project_type,</if>
-            <if test="createTime != null">create_time</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="sourceFrom != null">source_from</if>
+
         )values(
             <if test="projectPid != null">#{projectPid},</if>
             <if test="projectName != null">#{projectName},</if>
@@ -75,7 +93,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="projectType != null">#{projectType},</if>
-            <if test="createTime != null">#{createTime}</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="sourceFrom != null">#{sourceFrom}</if>
         )
     </insert>
 
@@ -98,9 +117,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteSysProjectByProjectIds" parameterType="String">
-        delete from sys_project where project_id in 
+        delete from sys_project where project_id in
         <foreach item="projectId" collection="array" open="(" separator="," close=")">
             #{projectId}
         </foreach>
     </delete>
-</mapper>
+</mapper>

+ 30 - 6
takai-system/src/main/resources/mapper/system/SysProjectStaffMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.takai.system.mapper.SysProjectStaffMapper">
-    
+
     <resultMap type="SysProjectStaff" id="SysProjectStaffResult">
         <result property="id"    column="id"    />
         <result property="projectPid"    column="project_pid"    />
@@ -45,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join sys_user as su on sps.user_id = su.user_id
         left join sys_project as sp on sps.project_pid = sp.project_pid
         left join sys_role as sr on sps.role_id = sr.role_id
-        <where>  
+        <where>
             <if test="projectPid != null  and projectPid != ''"> and sps.project_pid = #{projectPid}</if>
             <!--<if test="userId != null  and userId != ''"> and sps.user_id = #{userId}</if>-->
             <if test="roleId != null  and roleId != ''"> and sps.role_id = #{roleId}</if>
@@ -53,7 +53,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="mEdate != null "> and sps.m_edate <![CDATA[ <= ]]> #{mEdate}</if>
         </where>
     </select>
-    
+
+    <select id="selectSysProjectStaff" parameterType="SysProjectStaff" resultMap="SysProjectStaffResult">
+        select sps.id,
+        sps.project_pid,
+        sps.user_id,
+        sps.role_id,
+        sps.m_bdate,
+        sps.m_edate,
+        sps.create_by,
+        sps.create_time,
+        sps.update_by,
+        sps.update_time,
+        su.user_name,
+        sp.project_name,
+        sr.role_name
+        from sys_project_staff as sps
+        left join sys_user as su on sps.user_id = su.user_id
+        left join sys_project as sp on sps.project_pid = sp.project_pid
+        left join sys_role as sr on sps.role_id = sr.role_id
+        <where>
+            sps.project_pid = #{projectPid}
+            and su.user_name = #{userName}
+        </where>
+    </select>
+
     <select id="selectSysProjectStaffById" parameterType="Long" resultMap="SysProjectStaffResult">
         select sps.id,
                sps.project_pid,
@@ -72,7 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join sys_project as sp on sps.project_pid = sp.project_pid
         where id = #{id}
     </select>
-        
+
     <insert id="insertSysProjectStaff" parameterType="SysProjectStaff">
         insert into sys_project_staff
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -122,9 +146,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteSysProjectStaffByIds" parameterType="String">
-        delete from sys_project_staff where id in 
+        delete from sys_project_staff where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
-</mapper>
+</mapper>

+ 82 - 22
takai-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -25,10 +25,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime"   column="update_time"  />
 		<result property="workNo"       column="work_no"       />
         <result property="remark"       column="remark"       />
+		<result property="deptName"       column="dept_name"       />
+		<result property="userType"       column="user_type"       />
+		<result property="userTypeName"       column="user_type_name"       />
         <association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"           resultMap="RoleResult" />
     </resultMap>
-	
+
     <resultMap id="deptResult" type="SysDept">
         <id     property="deptId"    column="dept_id"     />
         <result property="parentId"  column="parent_id"   />
@@ -38,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="leader"    column="leader"      />
         <result property="status"    column="dept_status" />
     </resultMap>
-	
+
     <resultMap id="RoleResult" type="SysRole">
         <id     property="roleId"       column="role_id"        />
         <result property="roleName"     column="role_name"      />
@@ -47,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="dataScope"     column="data_scope"    />
         <result property="status"       column="role_status"    />
     </resultMap>
-	
+
 	<sql id="selectUserVo">
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
@@ -57,9 +60,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		    left join sys_user_role ur on u.user_id = ur.user_id
 		    left join sys_role r on r.role_id = ur.role_id
     </sql>
-    
+
     <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
-		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader, u.work_no from sys_user u
+		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.user_type, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader, u.work_no from sys_user u
 		left join sys_dept d on u.dept_id = d.dept_id
 		where u.del_flag = '0'
 		<if test="userId != null and userId != 0">
@@ -86,7 +89,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<!-- 数据范围过滤 -->
 		<!-- ${params.dataScope} -->
 	</select>
-	
+
 	<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
 	    select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time, u.work_no
 	    from sys_user u
@@ -103,7 +106,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<!-- 数据范围过滤 -->
 		${params.dataScope}
 	</select>
-	
+
 	<select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
 	    select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time, u.work_no
 	    from sys_user u
@@ -121,25 +124,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<!-- 数据范围过滤 -->
 		${params.dataScope}
 	</select>
-	
+
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
 	    <include refid="selectUserVo"/>
 		where u.user_name = #{userName} and u.del_flag = '0'
 	</select>
-	
+
 	<select id="selectUserById" parameterType="String" resultMap="SysUserResult">
 		<include refid="selectUserVo"/>
 		where u.user_id = #{userId}
 	</select>
-	
+
 	<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1
 	</select>
-	
+
 	<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1
 	</select>
-	
+
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
@@ -147,7 +150,64 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="checkUserExist" parameterType="String" resultType="Integer">
 		select count(1) from sys_user where user_id = #{userId}
 	</select>
-	
+
+	<select id="selectUserForAppVipList" parameterType="SysUser" resultMap="SysUserResult">
+		select distinct u.user_id,
+		u.dept_id,
+		u.user_name,
+		u.nick_name,
+		u.email,
+		u.phonenumber,
+		u.status,
+		u.create_time,
+		u.work_no,
+		u.user_type,
+		d.dept_name,
+		case when u.user_type='00' then '系统用户'
+			when u.user_type='01' then '建科用户'
+			when u.user_type='02' then '慧监理第三方用户'
+			when u.user_type='03' then '慧项管第三方用户'
+			when u.user_type='09' then '其他用户'
+		END AS user_type_name
+		from sys_user u
+		left join sys_dept d on u.dept_id = d.dept_id
+		where u.del_flag = '0'
+		<if test="userName != null and userName != ''">
+			AND u.user_name like concat('%', #{userName}, '%')
+		</if>
+		<if test="nickName != null and nickName != ''">
+			AND u.nick_name like concat('%', #{nickName}, '%')
+		</if>
+		<if test="phonenumber != null and phonenumber != ''">
+			AND u.phonenumber like concat('%', #{phonenumber}, '%')
+		</if>
+		<if test="userType != null and userType != ''">
+			AND u.user_type = #{userType}
+		</if>
+		<!-- 数据范围过滤 -->
+		${params.dataScope}
+	</select>
+
+	<select id="selectAppVipList" parameterType="String" resultMap="SysUserResult">
+		select distinct u.user_id,
+		                u.user_name,
+		                u.nick_name
+		from vip_application v
+		left join sys_user u on  v.user_id = u.user_id
+		where u.del_flag = '0'
+		and v.appId = #{appId}
+	</select>
+
+	<select id="selectKnowledgeVipList" parameterType="String" resultMap="SysUserResult">
+		select distinct u.user_id,
+						u.user_name,
+						u.nick_name
+		from vip_knowledge v
+				 left join sys_user u on  v.user_id = u.user_id
+		where u.del_flag = '0'
+		  and v.knowledge_id = #{knowledgeId}
+	</select>
+
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
@@ -183,7 +243,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
-	
+
 	<update id="updateUser" parameterType="SysUser">
  		update sys_user
  		<set>
@@ -205,28 +265,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  		</set>
  		where user_id = #{userId}
 	</update>
-	
+
 	<update id="updateUserStatus" parameterType="SysUser">
  		update sys_user set status = #{status} where user_id = #{userId}
 	</update>
-	
+
 	<update id="updateUserAvatar" parameterType="SysUser">
  		update sys_user set avatar = #{avatar} where user_name = #{userName}
 	</update>
-	
+
 	<update id="resetUserPwd" parameterType="SysUser">
  		update sys_user set password = #{password} where user_name = #{userName}
 	</update>
-	
+
 	<delete id="deleteUserById" parameterType="String">
  		update sys_user set del_flag = '2' where user_id = #{userId}
  	</delete>
- 	
+
  	<delete id="deleteUserByIds" parameterType="String">
  		update sys_user set del_flag = '2' where user_id in
  		<foreach collection="array" item="userId" open="(" separator="," close=")">
  			#{userId}
-        </foreach> 
+        </foreach>
  	</delete>
-	
-</mapper> 
+
+</mapper>