S0025136190 il y a 5 mois
Parent
commit
61045c4a10
31 fichiers modifiés avec 1074 ajouts et 22 suppressions
  1. 13 0
      pom.xml
  2. 37 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. 27 1
      takai-admin/src/main/resources/application.yml
  6. 4 0
      takai-ai/pom.xml
  7. 4 0
      takai-common/pom.xml
  8. 36 0
      takai-common/src/main/java/com/takai/common/config/JkConfig.java
  9. 15 2
      takai-common/src/main/java/com/takai/common/core/domain/entity/SysUser.java
  10. 12 0
      takai-common/src/main/java/com/takai/common/core/domain/model/LoginBody.java
  11. 30 0
      takai-common/src/main/java/com/takai/common/enums/UserTypeEnum.java
  12. 12 0
      takai-common/src/main/java/com/takai/common/utils/DateUtils.java
  13. 1 1
      takai-framework/src/main/java/com/takai/framework/config/SecurityConfig.java
  14. 161 0
      takai-framework/src/main/java/com/takai/framework/web/service/JkLoginService.java
  15. 4 1
      takai-framework/src/main/java/com/takai/framework/web/service/SysPasswordService.java
  16. 49 0
      takai-quartz/src/main/java/com/takai/quartz/task/JkTask.java
  17. 18 0
      takai-system/pom.xml
  18. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysDeptMapper.java
  19. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysPostMapper.java
  20. 7 0
      takai-system/src/main/java/com/takai/system/mapper/SysUserMapper.java
  21. 40 0
      takai-system/src/main/java/com/takai/system/service/IJkApiService.java
  22. 9 0
      takai-system/src/main/java/com/takai/system/service/ISysDeptService.java
  23. 10 0
      takai-system/src/main/java/com/takai/system/service/ISysPostService.java
  24. 8 0
      takai-system/src/main/java/com/takai/system/service/ISysUserService.java
  25. 432 0
      takai-system/src/main/java/com/takai/system/service/impl/JkApiServiceImpl.java
  26. 35 6
      takai-system/src/main/java/com/takai/system/service/impl/SysDeptServiceImpl.java
  27. 30 0
      takai-system/src/main/java/com/takai/system/service/impl/SysPostServiceImpl.java
  28. 27 0
      takai-system/src/main/java/com/takai/system/service/impl/SysUserServiceImpl.java
  29. 4 0
      takai-system/src/main/resources/mapper/system/SysDeptMapper.xml
  30. 4 0
      takai-system/src/main/resources/mapper/system/SysPostMapper.xml
  31. 8 1
      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>

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

@@ -1,11 +1,18 @@
 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.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
+import java.io.IOException;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Slf4j
 @Component
 public class InitDataLoader implements CommandLineRunner {
 
@@ -14,18 +21,42 @@ public class InitDataLoader implements CommandLineRunner {
     @Autowired
     private ITakaiAiService takaiService;
 
+    @Autowired
+    private IJkApiService jkApiService;
+
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
     @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信息结束()");
+
+//        log.info("===================获取建科统一用户平台信息Job开始执行==============");
+        threadPoolTaskExecutor.execute(() -> syncJkData());
+//
+//        log.info("===================获取建科统一用户平台信息Job执行结束==============");
+    }
 
-        System.out.println("========================初始化DeepSeek信息()");
-        takaiService.initDeepseekInfo();
-        System.out.println("========================初始化DeepSeek信息结束()");
+    private void syncJkData() {
+        try {
+            log.info("===================开始获取部门信息==============");
+            jkApiService.getJkDepts();
+            log.info("===================开始获取岗位信息==============");
+//            jkApiService.getJkPosts();
+            log.info("===================开始获取用户信息==============");
+            jkApiService.getJkUsers();
+        } catch (IOException e) {
+            log.error("获取建科统一用户平台信息失败",e);
+        }
     }
 }

+ 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(),loginBody.getRedirectUrl());
+        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
             # 初始连接数

+ 27 - 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,29 @@ 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
+  #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: 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>
 
         <dependency>
             <groupId>com.takai</groupId>

+ 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>
 

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

@@ -0,0 +1,36 @@
+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 iamClientID;
+
+    private String iamClientSecret;
+
+    private String iamUserUrl;
+
+    private String iamCallbackUrl;
+
+    private String iamDeptUrl;
+
+    private String iamPostUrl;
+
+    private String iamTokenUrl;
+
+    private String  iamProfileUrl;
+
+    private String jkPsw;
+}

+ 15 - 2
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;
 
@@ -89,8 +93,7 @@ public class SysUser extends BaseEntity
     /** 角色ID */
     private Long roleId;
 
-    /** 工号 */
-    private String workNo;
+    private String userType;
 
     public SysUser()
     {
@@ -308,6 +311,14 @@ public class SysUser extends BaseEntity
         this.workNo = workNo;
     }
 
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -315,6 +326,7 @@ public class SysUser extends BaseEntity
             .append("deptId", getDeptId())
             .append("userName", getUserName())
             .append("nickName", getNickName())
+            .append("userType", getUserType())
             .append("email", getEmail())
             .append("phonenumber", getPhonenumber())
             .append("sex", getSex())
@@ -330,6 +342,7 @@ public class SysUser extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
+            .append("workNo", getWorkNo())
             .toString();
     }
 }

+ 12 - 0
takai-common/src/main/java/com/takai/common/core/domain/model/LoginBody.java

@@ -27,6 +27,10 @@ public class LoginBody
      */
     private String uuid;
 
+
+
+    private String redirectUrl;
+
     public String getUserName() {
         return userName;
     }
@@ -64,4 +68,12 @@ public class LoginBody
     {
         this.uuid = uuid;
     }
+
+    public String getRedirectUrl() {
+        return redirectUrl;
+    }
+
+    public void setRedirectUrl(String redirectUrl) {
+        this.redirectUrl = redirectUrl;
+    }
 }

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

@@ -0,0 +1,30 @@
+package com.takai.common.enums;
+
+/**
+ * 用户状态
+ * 
+ * @author takai
+ */
+public enum UserTypeEnum
+{
+    SYS_USER("00", "系统用户"), JK_USER("01", "建科用户");
+
+    private final String code;
+    private final String info;
+
+    UserTypeEnum(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 12 - 0
takai-common/src/main/java/com/takai/common/utils/DateUtils.java

@@ -8,7 +8,10 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.util.Calendar;
 import java.util.Date;
+
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
@@ -16,6 +19,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
  * 
  * @author takai
  */
+@Slf4j
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 {
     public static String YYYY = "yyyy";
@@ -188,4 +192,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    public static long getTimeBeforeDays(int days)
+    {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DAY_OF_MONTH, -days);
+        log.info("日期:" + calendar.getTime());
+        return calendar.getTimeInMillis();
+    }
 }

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

@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage","/getToken","/**/sse-invoke","/**/application/list","/bigmodel/api/dialog/**",
+                .antMatchers("/login", "/jk_code_login","/register", "/captchaImage","/getToken","/**/sse-invoke","/**/application/list","/bigmodel/api/dialog/**",
                         "/**/completions", "/**/slice_info/**", "/**/async_result/**", "/**/assistant/**", "/getInfo",
                         "/checkToken", "/**/presets/**", "/**/index/**", "/**/createApplaction/**", "/**/createKnowledge/**",
                         "/**/updateKnowledge/**", "/**/detailKnowledge/**", "/**/delKnowledge/**", "/**/knowledgeList/**",

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

@@ -0,0 +1,161 @@
+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 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;
+
+/**
+ * 建科登录校验方法
+ * 
+ * @author takai
+ */
+@Slf4j
+@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 redirectUrl)
+    {
+        log.info("登录code:{}", code);
+        log.info("登录redirectUrl:{}", redirectUrl);
+        String username = "";
+        // 用户验证
+        Authentication authentication = null;
+        try
+        {
+            Map<String, Object> resJson = jkApiService.getJkToken(code,redirectUrl);
+            username = 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");
+    }
+}

+ 4 - 1
takai-framework/src/main/java/com/takai/framework/web/service/SysPasswordService.java

@@ -1,6 +1,9 @@
 package com.takai.framework.web.service;
 
 import java.util.concurrent.TimeUnit;
+
+import com.takai.common.enums.UserTypeEnum;
+import org.apache.xmlbeans.UserType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.Authentication;
@@ -65,7 +68,7 @@ public class SysPasswordService
             throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime);
         }
 
-        if (!matches(user, password))
+        if (!UserTypeEnum.JK_USER.getCode().equals(user.getUserType()) && !matches(user, password))
         {
             retryCount = retryCount + 1;
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,

+ 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, String redirectUrl) 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);
+
     /**
      * 注册用户信息
      * 

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

@@ -0,0 +1,432 @@
+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.enums.UserTypeEnum;
+import com.takai.common.utils.DateUtils;
+import com.takai.common.utils.SecurityUtils;
+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_REDIRECT_URI = "redirect_uri";
+
+    public static final String PARAM_ACCESS_TOKEN = "access_token";
+
+    public static final String PARAM_IDS = "ids";
+
+    public static final String PARAM_ERRORS = "errors";
+
+    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 INTERFACE_USER = "用户";
+
+    public static final String GRANT_TYPE_AC = "authorization_code";
+
+    public static final int BEFORE_DAYS = 1000;
+
+    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(),INTERFACE_USER);
+        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(status);
+            sysUser.setPhonenumber(json.getString("idt_user__mobile"));
+            sysUser.setWorkNo(json.getString("idt_user__work_no"));
+            sysUser.setEmail(json.getString("idt_user__email"));
+            sysUser.setUserType(UserTypeEnum.JK_USER.getCode());//建科用户
+            sysUser.setPassword(SecurityUtils.encryptPassword(jkConfig.getJkPsw()));
+            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__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();
+                String responseBody = response.body().string();
+                logger.info("获取建科"+objectName+"返回:" + responseBody);
+
+                if (!response.isSuccessful()) {
+                    throw new IOException("获取建科"+objectName+"信息失败 " + responseBody);
+                }
+                JSONObject jsonObject =JSON.parseObject(responseBody);
+                logger.info("获取建科"+objectName+"返回信息:" + jsonObject.toJSONString());
+                //“0”为成功其余均为失败
+                String code = jsonObject.getString("code");
+                if (CODE_SUCCESS.equals(code)) {
+                    JSONObject dataObject = jsonObject.getJSONObject(DATA);
+                    //如果是用户接口,调用回调函数
+                    if(INTERFACE_USER.equals(objectName)) {
+                        doUserCallback(dataObject);
+                    }
+                    objectList.add(dataObject);
+                    total = dataObject.getInteger(TOTAL);
+                    page++;
+                    continue;
+                }
+            } catch (IOException e) {
+                throw new IOException("获取建科用"+objectName+"信息失败 ", e);
+            }
+        }
+        return objectList;
+    }
+
+    private boolean doUserCallback(JSONObject dataObject) {
+        String ids = "";
+        JSONArray jsonArray = dataObject.getJSONArray(LIST);
+        for(int i = 0; i < jsonArray.size(); i++) {
+            SysUser sysUser = new SysUser();
+            JSONObject json = jsonArray.getJSONObject(i);
+            if(!"".equals(ids)) {
+                ids += ",";
+            }
+            ids += json.getString("request_log__id");
+        }
+        Request request = buildCallbackRequest(ids);
+        int i = 0;
+        while(i < 3) {//重试3次
+            try {
+                if(i > 0) {
+                    Thread.sleep(i*1000);
+                }
+                Response response = client.newCall(request).execute();
+                String responseBody = response.body().string();
+                logger.info("回调建科用户接口返回:" + responseBody);
+
+                if (!response.isSuccessful()) {
+                    logger.error("回调建科用户接口失败 " + responseBody);
+                    i++;
+                    continue;
+                }
+                JSONObject jsonObject =JSON.parseObject(responseBody);
+                //“0”为成功其余均为失败
+                String code = jsonObject.getString("code");
+                if (CODE_SUCCESS.equals(code)) {
+                    return true;
+                }
+            } catch (Exception e) {
+                logger.error("回调建科用户接口息失败 ", e);
+                i++;
+            }
+        }
+        return false;
+    }
+
+    public Map<String, Object> getJkToken(String code, String redirectUrl) throws IOException {
+        String token = "";
+        JSONObject userJson = null;
+        try {
+            Request request = buildTokenRequest(code, redirectUrl);
+            Response response = client.newCall(request).execute();
+            String responseBody = response.body().string();
+            logger.info("获取建科token返回信息:" + responseBody);
+            if (!response.isSuccessful()) {
+                throw new IOException("获取建科token信息失败 " + responseBody);
+            }
+            JSONObject jsonObject =JSON.parseObject(responseBody);
+
+            token = jsonObject.getString("access_token");
+            if(!StringUtils.isEmpty(token)) {
+                //token 换取用户信息
+                Request pReq = buildProfileRequest(token);
+                Response pResp = client.newCall(pReq).execute();
+                String pRespBody = pResp.body().string();
+                if (!pResp.isSuccessful()) {
+                    throw new IOException("token换取建科用户信息失败 " + pRespBody);
+                }
+                userJson =JSON.parseObject(pRespBody);
+                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("account_no"));
+        map.put("nickName", attrs.getString("account_no"));
+        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, getStartTimeBeforeDays(BEFORE_DAYS));
+        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).build();
+        logger.info("请求head:{}", request.headers().toString());
+        logger.info("请求body:{}", requestBodyJson);
+        return request;
+    }
+
+    private Request buildTokenRequest(String code, String redirectUrl) {
+        String completeUrl = jkConfig.getIamTokenUrl() + "?" +PARAM_GRANT_TYPE + "=" + GRANT_TYPE_AC
+                + "&" +PARAM_CLIENT_ID + "=" + jkConfig.getIamClientID()
+                + "&" +PARAM_CLIENT_SECRET + "=" + jkConfig.getIamClientSecret()
+                + "&" +PARAM_CODE + "=" + code
+                + "&" +PARAM_REDIRECT_URI + "=" + redirectUrl;
+
+        // 构建请求体
+        RequestBody body = RequestBody.create(JSON_UTF8,"");
+        Request request = new Request.Builder()
+                .addHeader("accept", "*/*")
+                .addHeader("Content-Type", "application/json")
+                .post(body)
+                .url(completeUrl).build();
+        logger.info("code换取token接口请求head:{}", request.headers().toString());
+        logger.info("code换取token接口请求url:{}", completeUrl);
+        return request;
+    }
+
+    private Request buildCallbackRequest(String ids) {
+        Map<String, Object> requestBodyMap = new HashMap<>();
+        requestBodyMap.put(PARAM_IDS, ids);
+        requestBodyMap.put(PARAM_ERRORS, new ArrayList<>());
+        // 将 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(jkConfig.getIamCallbackUrl()).build();
+        logger.info("回调接口请求head:{}", request.headers().toString());
+        logger.info("回调接口请求body:{}", requestBodyJson);
+        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)
+                .get()
+                .build();
+
+        logger.info("token获取用户信息请求url", url);
+        return request;
+    }
+
+    private String getStartTimeBeforeDays(int days) {
+        //7天内数据
+        return String.valueOf(DateUtils.getTimeBeforeDays(days));
+    }
+
+    private boolean isJsonObject(String data) {
+        try {
+            JSON.parseObject(data);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+}

+ 35 - 6
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;
 
 /**
  * 部门管理 服务实现
@@ -212,15 +213,43 @@ public class SysDeptServiceImpl implements ISysDeptService
     public int insertDept(SysDept dept)
     {
         SysDept info = deptMapper.selectDeptById(dept.getParentId());
-        // 如果父节点不为正常状态,则不允许新增子节点
-        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
-        {
-            throw new ServiceException("部门停用,不允许新增");
-        }
-        dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+//        if(info != null) {
+//            // 如果父节点不为正常状态,则不允许新增子节点
+//            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
+//                throw new ServiceException("部门停用,不允许新增");
+//            }
+//            dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+//        }
         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

+ 8 - 1
takai-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deptId"       column="dept_id"      />
         <result property="userName"     column="user_name"    />
         <result property="nickName"     column="nick_name"    />
+		<result property="userType"     column="user_type"    />
         <result property="email"        column="email"        />
         <result property="phonenumber"  column="phonenumber"  />
         <result property="sex"          column="sex"          />
@@ -48,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 	
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name, u.nick_name, 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, 
+        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,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status, u.work_no
         from sys_user u
@@ -142,6 +143,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(
@@ -149,6 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="deptId != null and deptId != 0">dept_id,</if>
  			<if test="userName != null and userName != ''">user_name,</if>
  			<if test="nickName != null and nickName != ''">nick_name,</if>
+		    <if test="userType != null and userType != ''">user_type,</if>
  			<if test="email != null and email != ''">email,</if>
  			<if test="avatar != null and avatar != ''">avatar,</if>
  			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
@@ -164,6 +170,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="deptId != null and deptId != ''">#{deptId},</if>
  			<if test="userName != null and userName != ''">#{userName},</if>
  			<if test="nickName != null and nickName != ''">#{nickName},</if>
+		   <if test="userType != null and userType != ''">#{userType},</if>
  			<if test="email != null and email != ''">#{email},</if>
  			<if test="avatar != null and avatar != ''">#{avatar},</if>
  			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>