package com.ycl.timer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.util.StringUtils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.common.dingding.DingCommon; import com.ycl.entity.depart.UmsDepart; import com.ycl.entity.dingding.DingUserInfo; import com.ycl.entity.user.UmsAdmin; import com.ycl.entity.user.UmsAdminRoleRelation; import com.ycl.entity.user.UmsDepartManage; import com.ycl.entity.user.UmsRole; import com.ycl.service.depart.UmsDepartService; import com.ycl.service.user.UmsAdminRoleRelationService; import com.ycl.service.user.UmsAdminService; import com.ycl.service.user.UmsDepartManageService; import com.ycl.service.user.UmsRoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; @Slf4j @Component public class GetDingUserOrgTimer implements ApplicationRunner, ApplicationListener { @Autowired private DingCommon dingCommon; private static final String TAG = "【浙政钉】用户体系:"; protected Thread.UncaughtExceptionHandler handler = (t, e) -> log.error("ding token parse events has an error", e); @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { if (contextRefreshedEvent.getApplicationContext().getParent() == null) { Thread thread = new Thread(this::run); thread.setUncaughtExceptionHandler(handler); thread.start(); } } @Autowired private UmsDepartService umsDepartService; @Autowired private UmsAdminService umsAdminService; @Autowired private UmsDepartManageService departManageService; @Autowired private UmsRoleService roleService; @Autowired private PasswordEncoder passwordEncoder; @Autowired private UmsAdminRoleRelationService umsAdminRoleRelationService; // @Scheduled(cron = "0 0 00 * * ?") @Transactional(rollbackFor = Exception.class) public void run() { //获取全部部门code JSONObject topObj = dingCommon.getBookAuthority(); //顶级部门id JSONArray deptTopArr = topObj.getJSONArray("deptVisibleScopes"); List dingOrgList = dingCommon.getOrgInfo(deptTopArr); //查询数据库中的部门 List dataOrgList = umsDepartService.list(); Iterator removeIterOrg = dingOrgList.iterator(); while (removeIterOrg.hasNext()) { UmsDepart dingOrg = removeIterOrg.next(); if (dingOrg.getCode().equals(deptTopArr.getString(0))) { dingOrg.setParentId(0L); } //判断 for (UmsDepart org : dataOrgList) { if (ObjectUtil.equals(org.getId(), dingOrg.getId()) && ObjectUtil.equals(org.getDepartName(), dingOrg.getDepartName()) && ObjectUtil.equals(org.getParentId(), dingOrg.getParentId())) { removeIterOrg.remove(); } } } //此时 dingOrgList 中剩下的就是新的组织机构了。 dingOrgList.forEach(dingOrg -> { if (dingOrg.getCode().equals(deptTopArr.getString(0))) { dingOrg.setParentId(0L); } //umsDepartService.fillPids(dingOrg); dingOrg.setStatus((short) 1); umsDepartService.saveOrUpdate(dingOrg); }); // log.info(TAG + "update organization size " + dingOrgList.size()); TimeInterval timer = DateUtil.timer(); /** // * 根据组织code 查询 通讯录人员信息 // */ Set dingList = dingCommon.getPersonInfoByOrgCode(); //查询所有用户 List userList = umsAdminService.list(); //查询用户组织关联表 List empOrgList = departManageService.list(); Iterator iterator = dingList.iterator(); while (iterator.hasNext()) { DingUserInfo dingUserInfo = iterator.next(); //判断用户是否存在,输出新用户 for (UmsAdmin user : userList) { //判断姓名 if (ObjectUtil.equals(user.getId(), dingUserInfo.getUserId()) ) { iterator.remove(); //判断组织 // for (UmsDepartManage emp : empOrgList) { // if (ObjectUtil.equals(user.getId(), emp.getUserId()) && ObjectUtil.equals(dingUserInfo.getOrgId(), emp.getDepartId())) { // iterator.remove(); // break; // } // } } } } ArrayList relations = new ArrayList<>(); // log.info(TAG + " elapsed time:" + timer.interval()); for (DingUserInfo dingUserInfo : dingList) { //1.添加用户 UmsAdmin user = new UmsAdmin(); //账号 user.setUsername(dingUserInfo.getEmployeeName()); //昵称 if (StringUtils.isNotBlank(dingUserInfo.getNickNameCn())) { user.setNickName(dingUserInfo.getNickNameCn()); } else { user.setNickName(dingUserInfo.getEmployeeName()); } //code //头像 user.setIcon(dingUserInfo.getGovEmpAvatar()); //姓名 //性别 user.setSex(dingUserInfo.getEmpGender().byteValue()); //密码 获取初始密码 //将密码进行加密操作 String encodePassword = passwordEncoder.encode("123456"); user.setPassword(encodePassword); user.setIsDy(Byte.parseByte("0")); user.setMobile(""); user.setOpenid(dingUserInfo.getOpenid()); //id user.setId(dingUserInfo.getUserId()); //状态为停用(不可用状态)点击登录后才能使用 user.setStatus(1); umsAdminService.save(user); //员工信息,关联组织 UmsDepartManage departManage = new UmsDepartManage(); departManage.setDepartId(dingUserInfo.getOrgId()); departManage.setIsLeader(0); departManage.setUserId(dingUserInfo.getUserId()); departManageService.saveOrUpdate(departManage); //角色信息 List roleCode = dingUserInfo.getRoleCodeList(); if (CollectionUtils.isNotEmpty(roleCode)) { List roleList = roleService.getRoleListByCodes(roleCode); roleList.forEach(item -> { UmsAdminRoleRelation relation = new UmsAdminRoleRelation(); relation.setAdminId(dingUserInfo.getUserId()); relation.setRoleId(item.getId()); relations.add(relation); }); } } if (CollUtil.isNotEmpty(relations)) { umsAdminRoleRelationService.saveBatch(relations, IService.DEFAULT_BATCH_SIZE); } // log.info(TAG + "update user size " + dingList.size()); // getEmployeeAvatar(); } /** * 获取用户头像 */ private void getEmployeeAvatar() { // List users = sysUserService.list(); // for (SysUser user : users) { // String mediaId = user.getDingAvatar(); // if (StrUtil.isNotBlank(mediaId)) { // dingCommon.downloadEmployeeAvatar(mediaId); // } // } } @Override public void run(ApplicationArguments args) throws Exception { run(); } }