Quellcode durchsuchen

建科统一身份认证平台接入

S0025136190 vor 5 Monaten
Ursprung
Commit
2be31fd8e3
26 geänderte Dateien mit 890 neuen und 11 gelöschten Zeilen
  1. 13 0
      pom.xml
  2. 27 6
      takai-admin/src/main/java/com/takai/init/InitDataLoader.java
  3. 19 0
      takai-admin/src/main/java/com/takai/web/controller/system/SysLoginController.java
  4. 4 4
      takai-admin/src/main/resources/application-dev.yml
  5. 21 1
      takai-admin/src/main/resources/application.yml
  6. 4 0
      takai-ai/pom.xml
  7. 4 0
      takai-common/pom.xml
  8. 30 0
      takai-common/src/main/java/com/takai/common/config/JkConfig.java
  9. 13 0
      takai-common/src/main/java/com/takai/common/core/domain/entity/SysUser.java
  10. 157 0
      takai-framework/src/main/java/com/takai/framework/web/service/JkLoginService.java
  11. 49 0
      takai-quartz/src/main/java/com/takai/quartz/task/JkTask.java
  12. 18 0
      takai-system/pom.xml
  13. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysDeptMapper.java
  14. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysPostMapper.java
  15. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysUserMapper.java
  16. 40 0
      takai-system/src/main/java/com/takai/system/service/IJkApiService.java
  17. 9 0
      takai-system/src/main/java/com/takai/system/service/ISysDeptService.java
  18. 10 0
      takai-system/src/main/java/com/takai/system/service/ISysPostService.java
  19. 8 0
      takai-system/src/main/java/com/takai/system/service/ISysUserService.java
  20. 346 0
      takai-system/src/main/java/com/takai/system/service/impl/JkApiServiceImpl.java
  21. 28 0
      takai-system/src/main/java/com/takai/system/service/impl/SysDeptServiceImpl.java
  22. 30 0
      takai-system/src/main/java/com/takai/system/service/impl/SysPostServiceImpl.java
  23. 27 0
      takai-system/src/main/java/com/takai/system/service/impl/SysUserServiceImpl.java
  24. 4 0
      takai-system/src/main/resources/mapper/system/SysDeptMapper.xml
  25. 4 0
      takai-system/src/main/resources/mapper/system/SysPostMapper.xml
  26. 4 0
      takai-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 13 - 0
pom.xml

@@ -127,6 +127,19 @@
                 <version>${jwt.version}</version>
             </dependency>
 
+            <!-- 建科Token生成与解析-->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>4.4.0</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>com.squareup.okhttp3</groupId>
+                        <artifactId>okhttp</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
             <!-- 验证码 -->
             <dependency>
                 <groupId>pro.fessional</groupId>

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

@@ -1,11 +1,16 @@
 package com.takai.init;
 
+import com.takai.system.service.IJkApiService;
 import com.takai.ai.service.ITakaiAiService;
 import com.takai.bigmodel.service.IBigModelService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
+import java.io.IOException;
+
+@Slf4j
 @Component
 public class InitDataLoader implements CommandLineRunner {
 
@@ -14,18 +19,34 @@ public class InitDataLoader implements CommandLineRunner {
     @Autowired
     private ITakaiAiService takaiService;
 
+    @Autowired
+    private IJkApiService jkApiService;
+
     @Override
     public void run(String... args) throws Exception {
         loadData();
     }
 
     private void loadData() {
-        System.out.println("========================初始化智谱信息()");
-        bigModelService.initZhiPuInfo();
-        System.out.println("========================初始化智谱信息结束()");
+//        System.out.println("========================初始化智谱信息()");
+//        bigModelService.initZhiPuInfo();
+//        System.out.println("========================初始化智谱信息结束()");
+//
+//        System.out.println("========================初始化DeepSeek信息()");
+//        takaiService.initDeepseekInfo();
+//        System.out.println("========================初始化DeepSeek信息结束()");
 
-        System.out.println("========================初始化DeepSeek信息()");
-        takaiService.initDeepseekInfo();
-        System.out.println("========================初始化DeepSeek信息结束()");
+        log.info("===================获取建科统一用户平台信息Job开始执行==============");
+        try {
+            log.info("===================开始获取部门信息==============");
+            jkApiService.getJkDepts();
+            log.info("===================开始获取岗位信息==============");
+//            jkApiService.getJkPosts();
+            log.info("===================开始获取用户信息==============");
+//            jkApiService.getJkUsers();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        log.info("===================获取建科统一用户平台信息Job执行结束==============");
     }
 }

+ 19 - 0
takai-admin/src/main/java/com/takai/web/controller/system/SysLoginController.java

@@ -6,6 +6,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.takai.common.utils.StringUtils;
+import com.takai.framework.web.service.JkLoginService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.takai.common.constant.Constants;
@@ -31,6 +32,9 @@ public class SysLoginController
     @Autowired
     private SysLoginService loginService;
 
+    @Autowired
+    private JkLoginService jkLoginService;
+
     @Autowired
     private ISysMenuService menuService;
 
@@ -56,6 +60,21 @@ public class SysLoginController
         return ajax;
     }
 
+    /**
+     * 建科用户登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @PostMapping("/jk_code_login")
+    public AjaxResult jkLogin(@RequestBody LoginBody loginBody)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        Map<String, Object> map  = jkLoginService.login(loginBody.getCode());
+        ajax.put("data", map);
+        return ajax;
+    }
+
     /**
      * 登录方法
      *

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

@@ -6,17 +6,17 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/ai_master?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://localhost:3306/chat_deepseek?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
-                password: password
+                password: root
                 hikari:
                     pool-name: master-Pool
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
-                url: jdbc:mysql://localhost:3306/tk-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://localhost:3306/chat_zhipu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
-                password: password
+                password: root
                 hikari:
                     pool-name: slave-Pool
             # 初始连接数

+ 21 - 1
takai-admin/src/main/resources/application.yml

@@ -54,7 +54,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: prd
+    active: dev
   # 文件上传
   servlet:
     multipart:
@@ -197,3 +197,23 @@ deepseek:
   baseChat: http://10.1.27.4:18078
   #提示词
   prompt: 你是总结和提问大师。你只根据用户的对话记录,根据对话记录生成可能会问的问题,不要杜撰问题。问题的答案必须来自上面的对话记录。 你必须遵守以下要求:1. 不要输出用户问过的问题;2. 你需要输出3个问题供用户选择。3. 你只需要输出问题,不需要解释,不需要提问。4. 你的问题可以是空的,但你不能杜撰问题。5. 问题需要站在使用这个应用的人的视角提出,因此你要注意提问的语气和人称代词。不要用您这个字。6.生成的问题,必须能从提供的对话记录中找到答案。你一定要按照以下格式输出:{'问题':['xxx','xxx','xxx']}
+jk:
+  #IAM环境 url
+  iamurl: https://sso-poc.sso360.cn:9189/
+  #Appid
+  iamAppid: e971e84b574c40b2
+  #Appsecret
+  iamAppsecret: 51e7f274f71f4887b25015fc0743e871
+  #用户接口url
+  iamUserUrl: http://esc.sribs.com.cn:8080/esc-idm/api/v1/account/list
+  #部门接口url
+  iamDeptUrl: https://esctest.sribs.com.cn/esc-idm/api/v1/org/listAll
+  #岗位接口url
+  iamPostUrl: http://esc.sribs.com.cn:8080/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
+

+ 4 - 0
takai-ai/pom.xml

@@ -60,6 +60,10 @@
             <artifactId>okhttp-sse</artifactId>
             <version>4.9.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.takai</groupId>
+            <artifactId>takai-system</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 4 - 0
takai-common/pom.xml

@@ -125,6 +125,10 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 30 - 0
takai-common/src/main/java/com/takai/common/config/JkConfig.java

@@ -0,0 +1,30 @@
+package com.takai.common.config;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+@ConfigurationProperties(prefix = "jk")
+public class JkConfig {
+
+    private String iamurl;
+
+    private String iamAppid;
+
+    private String iamAppsecret;
+
+    private String iamUserUrl;
+
+    private String iamDeptUrl;
+
+    private String iamPostUrl;
+
+    private String iamTokenUrl;
+
+    private String  iamProfileUrl;
+
+    private String jkPsw;
+}

+ 13 - 0
takai-common/src/main/java/com/takai/common/core/domain/entity/SysUser.java

@@ -77,6 +77,10 @@ public class SysUser extends BaseEntity
     })
     private SysDept dept;
 
+    /** 工号 */
+    private String workNo;
+
+
     /** 角色对象 */
     private List<SysRole> roles;
 
@@ -297,6 +301,14 @@ public class SysUser extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getWorkNo() {
+        return workNo;
+    }
+
+    public void setWorkNo(String workNo) {
+        this.workNo = workNo;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -319,6 +331,7 @@ public class SysUser extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
+            .append("workNo", getWorkNo())
             .toString();
     }
 }

+ 157 - 0
takai-framework/src/main/java/com/takai/framework/web/service/JkLoginService.java

@@ -0,0 +1,157 @@
+package com.takai.framework.web.service;
+
+import com.takai.common.config.JkConfig;
+import com.takai.common.constant.CacheConstants;
+import com.takai.common.constant.Constants;
+import com.takai.common.constant.UserConstants;
+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.exception.ServiceException;
+import com.takai.common.exception.user.*;
+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.service.IJkApiService;
+import com.takai.system.service.ISysConfigService;
+import com.takai.system.service.ISysUserService;
+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;
+
+/**
+ * 建科登录校验方法
+ * 
+ * @author takai
+ */
+@Component
+public class JkLoginService
+{
+    // 令牌自定义标识
+    @Value("${token.header}")
+    private String header;
+
+    @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
+    JkConfig jkConfig;
+
+
+    /**
+     * 记录登录信息
+     *
+     * @param userId 用户ID
+     */
+    public void recordLoginInfo(Long userId)
+    {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(IpUtils.getIpAddr());
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        userService.updateUserProfile(sysUser);
+    }
+
+    public static void main(String[] args) {
+        //System.out.println(UUID.randomUUID().toString().replaceAll("-",""));
+        //System.out.println(UUID.randomUUID().toString().replaceAll("-",""));
+        System.out.println(SecurityUtils.encryptPassword("Bcc5e847c7D24319a49e"));
+        //19b5bca9593844ecbb3d8bd8f9d88eaf
+        //bcc5e847c7d24319a49e752b4019ea7f
+    }
+
+    public Map<String, Object> login(String code)
+    {
+        String username = "";
+        // 用户验证
+        Authentication authentication = null;
+        try
+        {
+            Map<String, Object> resJson = jkApiService.getJkToken(code);
+            String.valueOf(resJson.get("userId"));
+            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);
+        redisCache.setCacheObject("login_token", login_token, Constants.TOKEN_EXPIRATION, 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;
+    }
+
+    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");
+    }
+}

+ 49 - 0
takai-quartz/src/main/java/com/takai/quartz/task/JkTask.java

@@ -0,0 +1,49 @@
+package com.takai.quartz.task;
+
+import com.takai.system.service.IJkApiService;
+import com.takai.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * 建科统一用户平台信息定时任务调度
+ * 
+ * @author takai
+ */
+@Slf4j
+@Component("jkTask")
+public class JkTask
+{
+
+    @Autowired
+    private IJkApiService jkApiService;
+
+    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
+    {
+        System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
+    }
+
+    public void ryParams(String params)
+    {
+        System.out.println("执行有参方法:" + params);
+    }
+
+    public void ryNoParams()
+    {
+        log.info("===================获取建科统一用户平台信息Job开始执行==============");
+        try {
+            log.info("===================开始获取部门信息==============");
+            jkApiService.getJkDepts();
+            log.info("===================开始获取岗位信息==============");
+            jkApiService.getJkPosts();
+            log.info("===================开始获取用户信息==============");
+            jkApiService.getJkUsers();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        log.info("===================获取建科统一用户平台信息Job执行结束==============");
+    }
+}

+ 18 - 0
takai-system/pom.xml

@@ -23,6 +23,24 @@
             <artifactId>takai-common</artifactId>
         </dependency>
 
+        <!-- 建科Token生成与解析-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.squareup.okhttp3</groupId>
+                    <artifactId>okhttp</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.9.3</version>
+        </dependency>
+
     </dependencies>
 
 </project>

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

@@ -115,4 +115,11 @@ public interface SysDeptMapper
      * @return 结果
      */
     public int deleteDeptById(Long deptId);
+
+    /**
+     * 校验部门ID是否存在
+     * @param deptId
+     * @return
+     */
+    public int checkDeptExist(Long deptId);
 }

+ 7 - 0
takai-system/src/main/java/com/takai/system/mapper/SysPostMapper.java

@@ -96,4 +96,11 @@ public interface SysPostMapper
      * @return 结果
      */
     public SysPost checkPostCodeUnique(String postCode);
+
+    /**
+     * 校验岗位ID是否存在
+     * @param postCode
+     * @return
+     */
+    public int checkPostExist(String postCode);
 }

+ 7 - 0
takai-system/src/main/java/com/takai/system/mapper/SysUserMapper.java

@@ -124,4 +124,11 @@ public interface SysUserMapper
      * @return 结果
      */
     public SysUser checkEmailUnique(String email);
+
+    /**
+     * 校验用户ID是否存在
+     * @param userId
+     * @return
+     */
+    public int checkUserExist(Long userId);
 }

+ 40 - 0
takai-system/src/main/java/com/takai/system/service/IJkApiService.java

@@ -0,0 +1,40 @@
+package com.takai.system.service;
+
+import com.takai.common.core.domain.entity.SysDept;
+import com.takai.common.core.domain.entity.SysUser;
+import com.takai.system.domain.SysPost;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 高井 业务层
+ * 
+ * @author takai
+ */
+public interface IJkApiService
+{
+
+    /**
+     * 通过建科接口获取建科用户信息
+     */
+    List<SysUser> getJkUsers() throws IOException;
+
+    /**
+     * 通过建科接口获取建科部门信息
+     */
+    List<SysDept> getJkDepts() throws IOException;
+
+    /**
+     * 通过建科接口获取建科岗位信息
+     */
+    List<SysPost> getJkPosts() throws IOException;
+
+    /**
+     * 通过code获取建科token
+     */
+    Map<String, Object> getJkToken(String code) throws IOException;
+
+}

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

@@ -3,6 +3,7 @@ package com.takai.system.service;
 import java.util.List;
 import com.takai.common.core.domain.TreeSelect;
 import com.takai.common.core.domain.entity.SysDept;
+import com.takai.common.core.domain.entity.SysUser;
 
 /**
  * 部门管理 服务层
@@ -106,6 +107,14 @@ public interface ISysDeptService
      */
     public int insertDept(SysDept dept);
 
+    /**
+     * 批量新增部门信息
+     *
+     * @param deptList 用户信息
+     * @return 结果
+     */
+    public int batchDept(List<SysDept> deptList);
+
     /**
      * 修改保存部门信息
      * 

+ 10 - 0
takai-system/src/main/java/com/takai/system/service/ISysPostService.java

@@ -1,6 +1,8 @@
 package com.takai.system.service;
 
 import java.util.List;
+
+import com.takai.common.core.domain.entity.SysUser;
 import com.takai.system.domain.SysPost;
 
 /**
@@ -57,6 +59,14 @@ public interface ISysPostService
      */
     public boolean checkPostCodeUnique(SysPost post);
 
+    /**
+     * 批量新增岗位信息
+     *
+     * @param postList 用户信息
+     * @return 结果
+     */
+    public int batchPost(List<SysPost> postList);
+
     /**
      * 通过岗位ID查询岗位使用数量
      * 

+ 8 - 0
takai-system/src/main/java/com/takai/system/service/ISysUserService.java

@@ -112,6 +112,14 @@ public interface ISysUserService
      */
     public int insertUser(SysUser user);
 
+    /**
+     * 批量新增用户信息
+     *
+     * @param userList 用户信息
+     * @return 结果
+     */
+    public int batchUser(List<SysUser> userList);
+
     /**
      * 注册用户信息
      * 

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

@@ -0,0 +1,346 @@
+package com.takai.system.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.takai.common.utils.StringUtils;
+import com.takai.system.service.IJkApiService;
+import com.takai.common.annotation.DataSource;
+import com.takai.common.config.JkConfig;
+import com.takai.common.core.domain.entity.SysDept;
+import com.takai.common.core.domain.entity.SysUser;
+import com.takai.common.core.redis.RedisCache;
+import com.takai.common.enums.DataSourceType;
+import com.takai.system.domain.SysPost;
+import com.takai.system.service.ISysDeptService;
+import com.takai.system.service.ISysPostService;
+import com.takai.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+
+import com.auth0.jwt.JWT;
+
+/**
+ * 高井 业务层处理
+ *
+ * @author takai
+ */
+@Slf4j
+@Service
+@DataSource(DataSourceType.MASTER)
+public class JkApiServiceImpl implements IJkApiService {
+    private static final Logger logger = LoggerFactory.getLogger(JkApiServiceImpl.class);
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private ISysDeptService sysDeptService;
+
+    @Autowired
+    private ISysPostService sysPostService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    @Autowired
+    JkConfig jkConfig;
+
+    public static final String BEARER = "Bearer";
+
+    public static final String PARAM_ST = "startTime";
+
+    public static final String PARAM_PAGE = "page";
+
+    public static final String PARAM_SIZE = "size";
+
+    public static final String PARAM_GRANT_TYPE = "grant_type";
+
+    public static final String PARAM_CLIENT_ID  = "client_id";
+
+    public static final String PARAM_CLIENT_SECRET = "client_secret";
+
+    public static final String PARAM_CODE = "code";
+
+    public static final String PARAM_ACCESS_TOKEN = "access_token";
+
+    public static final int DEFAULT_SIZE = 100;
+
+    public static final String CODE_SUCCESS = "0";
+
+    public static final String DATA = "data";
+
+    public static final String TOTAL = "total";
+
+    public static final String LIST = "list";
+
+    public static final String GRANT_TYPE_AC = "authorization_code";
+
+    private static final MediaType JSON_UTF8 = MediaType.get("application/json; charset=utf-8");
+
+    private static final OkHttpClient client = new OkHttpClient();
+
+
+
+    /**
+     * 通过建科接口获取建科用户信息
+     */
+    @Override
+    public List<SysUser> getJkUsers() throws IOException {
+        List<SysUser> userList = new ArrayList<>();
+        List<JSONObject> dataList = getApiData(jkConfig.getIamUserUrl(),"用户");
+        for(JSONObject jsonObject : dataList) {
+            List<SysUser> users = buildSysUserList(jsonObject.getJSONArray(LIST));
+            //保存用户到用户表
+            sysUserService.batchUser(users);
+            userList.addAll(users);
+        }
+        return userList;
+    }
+
+    private List<SysUser> buildSysUserList(JSONArray jsonArray) {
+        List<SysUser> userList = new ArrayList<>();
+        for(int i = 0; i < jsonArray.size(); i++) {
+            SysUser sysUser = new SysUser();
+            JSONObject json = jsonArray.getJSONObject(i);
+            sysUser.setUserId(json.getLong("app_account__id"));
+            sysUser.setUserName(json.getString("app_account__account_no"));
+            sysUser.setNickName(json.getString("app_account__account_name"));
+            //建科用户状态,启用:1,停用:0,删除:-1
+            String status = json.getString("app_account__status");
+            status = status.equals("1") ? "0" : "1";
+            sysUser.setStatus("1");
+            sysUser.setPhonenumber(json.getString("idt_user__mobile"));
+            sysUser.setWorkNo(json.getString("idt_user__work_no"));
+            sysUser.setEmail(json.getString("idt_user__email"));
+            JSONArray orgs = json.getJSONArray("orgs");
+            if(orgs.size() > 0) {
+                sysUser.setDeptId(orgs.getJSONObject(0).getLong("idt_org__id"));
+            }
+            userList.add(sysUser);
+        }
+        return userList;
+    }
+
+    /**
+     * 通过建科接口获取建科部门信息
+     */
+    @Override
+    public List<SysDept> getJkDepts() throws IOException {
+        List<SysDept> deptList = new ArrayList<>();
+        List<JSONObject> dataList = getApiData(jkConfig.getIamDeptUrl(),"部门");
+        for(JSONObject jsonObject : dataList) {
+            List<SysDept> depts = buildSysDeptList(jsonObject.getJSONArray(LIST));
+            //保存用户到用户表
+            sysDeptService.batchDept(depts);
+            deptList.addAll(depts);
+        }
+        return deptList;
+    }
+
+    private List<SysDept> buildSysDeptList(JSONArray jsonArray) {
+        List<SysDept> deptList = new ArrayList<>();
+        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.setDeptName(json.getString("idt_org__org_name"));
+            sysDept.setParentId(json.getLong("idt_org__parent_id"));
+            sysDept.setAncestors(json.getString("idt_org__org_path").substring(1).replaceAll("/",","));
+            //部门状态,启用:1,停用:0
+            String status = json.getString("idt_org__status");
+            status = status.equals("1") ? "0" : "1";
+            sysDept.setStatus("1");
+            deptList.add(sysDept);
+        }
+        return deptList;
+    }
+
+    /**
+     * 通过建科接口获取建科岗位信息
+     */
+    @Override
+    public List<SysPost> getJkPosts() throws IOException {
+        List<SysPost> postList = new ArrayList<>();
+        List<JSONObject> dataList = getApiData(jkConfig.getIamPostUrl(),"岗位");
+        for(JSONObject jsonObject : dataList) {
+            List<SysPost> posts = buildSysPostList(jsonObject.getJSONArray(LIST));
+            //保存用户到用户表
+            sysPostService.batchPost(posts);
+            postList.addAll(posts);
+        }
+        return postList;
+    }
+
+    private List<SysPost> buildSysPostList(JSONArray jsonArray) {
+        List<SysPost> postList = new ArrayList<>();
+        for(int i = 0; i < jsonArray.size(); i++) {
+            SysPost sysPost = new SysPost();
+            JSONObject json = jsonArray.getJSONObject(i);
+            sysPost.setPostCode(json.getString("idt_job__code"));
+            sysPost.setPostName(json.getString("idt_job__name"));
+            //部门状态,启用:1,停用:0
+            String status = json.getString("idt_job__status");
+            status = status.equals("1") ? "0" : "1";
+            sysPost.setStatus("1");
+            postList.add(sysPost);
+        }
+        return postList;
+    }
+
+    public List<JSONObject> getApiData(String url,String objectName) throws IOException {
+        List<JSONObject> objectList = new ArrayList<>();
+        int page = 1;
+        int total = 1;
+        while(total >= page){
+            Request request = buildRequest(url,page);
+            // 执行请求并获取响应
+            try {
+                Response response = client.newCall(request).execute();
+                logger.info("获取建科"+objectName+"返回:" + response.body().string());
+
+                if (!response.isSuccessful()) {
+                    throw new IOException("获取建科"+objectName+"信息失败 " + response.body().string());
+                }
+                JSONObject jsonObject =JSON.parseObject(response.body().string());
+                logger.info("获取建科"+objectName+"返回信息:" + jsonObject.toJSONString());
+                //“0”为成功其余均为失败
+                String code = jsonObject.getString("code");
+                if (CODE_SUCCESS.equals(code)) {
+                    JSONObject dataObject = jsonObject.getJSONObject(DATA);
+                    objectList.add(dataObject);
+                    total = dataObject.getInteger(TOTAL);
+                    page++;
+                    continue;
+                }
+            } catch (IOException e) {
+                throw new IOException("获取建科用"+objectName+"信息失败 ", e);
+            }
+        }
+        return objectList;
+    }
+
+    public Map<String, Object> getJkToken(String code) throws IOException {
+        String token = "";
+        JSONObject userJson = null;
+        try {
+            Request request = buildTokenRequest(code);
+            Response response = client.newCall(request).execute();
+            if (!response.isSuccessful()) {
+                throw new IOException("获取建科token信息失败 " + response.toString());
+            }
+            JSONObject jsonObject =JSON.parseObject(response.body().string());
+            logger.info("获取建科token返回信息:" + jsonObject.toJSONString());
+            token = jsonObject.getString("access_token");
+            if(!StringUtils.isEmpty(token)) {
+                //token 换取用户信息
+                Request pReq = buildProfileRequest(token);
+                Response pResp = client.newCall(request).execute();
+                if (!pResp.isSuccessful()) {
+                    throw new IOException("token换取建科用户信息失败 " + pResp.toString());
+                }
+                userJson =JSON.parseObject(pResp.body().string());
+                logger.info("获取建科用户返回信息:" + userJson.toJSONString());
+            }
+        } catch (IOException e) {
+            throw new IOException(code + "获取建科token息失败 ", e);
+        }
+
+        if(userJson == null) {
+            return null;
+        }
+        JSONObject attrs = userJson.getJSONObject("attributes");
+        Map<String, Object> map = new HashMap<>();
+        map.put("userId", attrs.getString("sysadmintest"));
+        map.put("nickName", attrs.getString("sysadmintest"));
+        map.put("token", token);
+        return map;
+    }
+
+    private String createJkToken() {
+        JWTCreator.Builder builder = JWT.create().withIssuer(jkConfig.getIamAppid());
+        String sign = builder.withIssuedAt(new Date()).withJWTId(UUID.randomUUID().toString()).sign(Algorithm.HMAC256(jkConfig.getIamAppsecret()));
+        String token = String.join(" ", BEARER, sign);
+        return token;
+    }
+
+    private Request buildRequest(String url,int page) {
+        Map<String, Object> requestBodyMap = new HashMap<>();
+        requestBodyMap.put(PARAM_ST, getStartTime());
+        requestBodyMap.put(PARAM_PAGE, page);
+        requestBodyMap.put(PARAM_SIZE, DEFAULT_SIZE);
+        // 将 Map 转换为 JSON 字符串
+        String requestBodyJson = JSON.toJSONString(requestBodyMap);
+
+        // 构建请求体
+        RequestBody body = RequestBody.create(JSON_UTF8,requestBodyJson);
+        Request request = new Request.Builder()
+                .addHeader("accept", "*/*")
+                .addHeader("Authorization", createJkToken())
+                .addHeader("Content-Type", "application/json")
+                .post(body)
+                .url(url).get().build();
+        logger.info("请求head:{}", request.headers().toString());
+//        logger.info("请求body:{}", request.body().toString());
+        return request;
+    }
+
+    private Request buildTokenRequest(String code) {
+        Map<String, Object> requestBodyMap = new HashMap<>();
+        requestBodyMap.put(PARAM_GRANT_TYPE, GRANT_TYPE_AC);
+        requestBodyMap.put(PARAM_CLIENT_ID, jkConfig.getIamAppid());
+        requestBodyMap.put(PARAM_CLIENT_SECRET, jkConfig.getIamAppsecret());
+        requestBodyMap.put(PARAM_CODE, code);
+        // 将 Map 转换为 JSON 字符串
+        String requestBodyJson = JSON.toJSONString(requestBodyMap);
+
+        // 构建请求体
+        RequestBody body = RequestBody.create(JSON_UTF8,requestBodyJson);
+        Request request = new Request.Builder()
+                .addHeader("accept", "*/*")
+                .addHeader("Content-Type", "application/json")
+                .post(body)
+                .url(jkConfig.getIamTokenUrl()).get().build();
+        logger.info("请求head:{}", request.headers().toString());
+        return request;
+    }
+
+    private Request buildProfileRequest(String token) {
+        // 构建带参数的 URL
+        HttpUrl.Builder urlBuilder = HttpUrl.parse(jkConfig.getIamProfileUrl()).newBuilder();
+        urlBuilder.addQueryParameter(PARAM_ACCESS_TOKEN, token);
+        String url = urlBuilder.build().toString();
+        Request request = new Request.Builder()
+                .url(url)
+                .build();
+
+        logger.info("token获取用户信息请求url", url);
+        return request;
+    }
+
+    private String getStartTime() {
+        return String.valueOf(System.currentTimeMillis());
+    }
+
+    private boolean isJsonObject(String data) {
+        try {
+            JSON.parseObject(data);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+}

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

@@ -20,6 +20,7 @@ import com.takai.common.utils.spring.SpringUtils;
 import com.takai.system.mapper.SysDeptMapper;
 import com.takai.system.mapper.SysRoleMapper;
 import com.takai.system.service.ISysDeptService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 部门管理 服务实现
@@ -221,6 +222,33 @@ public class SysDeptServiceImpl implements ISysDeptService
         return deptMapper.insertDept(dept);
     }
 
+    /**
+     * 批量新增部门信息
+     *
+     * @param deptList 用户信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int batchDept(List<SysDept> deptList)
+    {
+        int rows = 0;
+        for(SysDept dept:deptList) {
+            if(!"0".equals(dept.getStatus())) {
+                deleteDeptById(dept.getDeptId());
+            }
+            int cnt = deptMapper.checkDeptExist(dept.getDeptId());
+            if(cnt > 0) {
+                updateDept(dept);
+                rows++;
+            } else {
+                insertDept(dept);
+                rows++;
+            }
+        }
+        return rows;
+    }
+
     /**
      * 修改保存部门信息
      * 

+ 30 - 0
takai-system/src/main/java/com/takai/system/service/impl/SysPostServiceImpl.java

@@ -1,6 +1,8 @@
 package com.takai.system.service.impl;
 
 import java.util.List;
+
+import com.takai.common.core.domain.entity.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.takai.common.constant.UserConstants;
@@ -10,6 +12,7 @@ import com.takai.system.domain.SysPost;
 import com.takai.system.mapper.SysPostMapper;
 import com.takai.system.mapper.SysUserPostMapper;
 import com.takai.system.service.ISysPostService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 岗位信息 服务层处理
@@ -175,4 +178,31 @@ public class SysPostServiceImpl implements ISysPostService
     {
         return postMapper.updatePost(post);
     }
+
+    /**
+     * 批量新增岗位信息
+     *
+     * @param postList 岗位信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int batchPost(List<SysPost> postList)
+    {
+        int rows = 0;
+        for(SysPost post:postList) {
+            if(!"0".equals(post.getStatus())) {
+                deletePostById(post.getPostId());
+            }
+            int cnt = postMapper.checkPostExist(post.getPostCode());
+            if(cnt > 0) {
+                updatePost(post);
+                rows++;
+            } else {
+                insertPost(post);
+                rows++;
+            }
+        }
+        return rows;
+    }
 }

+ 27 - 0
takai-system/src/main/java/com/takai/system/service/impl/SysUserServiceImpl.java

@@ -265,6 +265,33 @@ public class SysUserServiceImpl implements ISysUserService
         return rows;
     }
 
+    /**
+     * 批量新增用户信息
+     *
+     * @param userList 用户信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int batchUser(List<SysUser> userList)
+    {
+        int rows = 0;
+        for(SysUser user:userList) {
+            if(!"0".equals(user.getStatus())) {
+                deleteUserById(user.getUserId());
+            }
+            int cnt = userMapper.checkUserExist(user.getUserId());
+            if(cnt > 0) {
+                updateUser(user);
+                rows++;
+            } else {
+                insertUser(user);
+                rows++;
+            }
+        }
+        return rows;
+    }
+
     /**
      * 注册用户信息
      * 

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

@@ -86,6 +86,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	    <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 count(1) from sys_dept where dept_id = #{deptId}
+	</select>
     
     <insert id="insertDept" parameterType="SysDept">
  		insert into sys_dept(

+ 4 - 0
takai-system/src/main/resources/mapper/system/SysPostMapper.xml

@@ -71,6 +71,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectPostVo"/>
 		 where post_code=#{postCode} limit 1
 	</select>
+
+	<select id="checkPostExist" parameterType="String" resultType="Integer">
+		select count(1) from sys_post where post_code = #{postCode}
+	</select>
 	
 	<update id="updatePost" parameterType="SysPost">
  		update sys_post

+ 4 - 0
takai-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -141,6 +141,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
+
+	<select id="checkUserExist" parameterType="Long" resultType="Integer">
+		select count(1) from sys_user where user_id = #{userId}
+	</select>
 	
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(