Просмотр исходного кода

AD域控增加手动同步组织架构接口 定时任务
前端增加按钮

Min 2 лет назад
Родитель
Сommit
7ac64c3d8b

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -1223,7 +1223,8 @@ public class ProjectController {
     }
 
     @RequestMapping("/syncProjectWithFanwei")
-    public HttpRespMsg syncProjectWithFanwei(){
+    public HttpRespMsg syncProjectWithFanwei(HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("token"));
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         String url="http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getProejct";
         JSONObject jsonObject=new JSONObject();
@@ -1257,7 +1258,8 @@ public class ProjectController {
         OperationRecord operationRecord=new OperationRecord();
         operationRecord.setCompanyId(876)
                        .setContent("同步来自泛微的项目数据,共"+needInsert.size()+"条数据")
-                       .setModuleName("项目管理").setOperationTime(LocalDateTime.now());
+                       .setModuleName("项目管理").setOperationTime(LocalDateTime.now())
+                       .setOperatorName(user.getName());
         operationRecordService.save(operationRecord);
         return httpRespMsg;
     }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -403,6 +403,12 @@ public class UserController {
         return userService.initSystemForAd(companyName);
     }
 
+
+    @RequestMapping("/syncDeptWithAD")
+    public HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception{
+        return userService.syncDeptWithAD(request);
+    }
+
     @RequestMapping("/updateUserDeptHierarchy")
     public HttpRespMsg updateUserDeptHierarchy(Integer companyId) throws Exception {
         HttpRespMsg httpRespMsg=new HttpRespMsg();

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-04-13
+ * @since 2023-06-12
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -468,6 +468,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("easy_expense")
     private Integer easyExpense;
 
+    /**
+     * 是否同步AD
+     */
+    @TableField("sync_ad")
+    private Integer syncAd;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java

@@ -101,4 +101,6 @@ public interface UserService extends IService<User> {
     List<JSONObject> getUser() throws Exception;
 
     HttpRespMsg initSystemForAd(String companyName) throws Exception;
+
+    HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception;
 }

+ 73 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -3276,6 +3276,79 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return msg;
     }
 
+    @Override
+    public HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception {
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id",companyId).eq("rolename","普通员工"));
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+//        List<JSONObject> deptArrays = ldapGetOU();
+//        for (JSONObject dept : deptArrays) {
+//            Department department=new Department();
+//            department.setDepartmentName(dept.getString("name"))
+//                    .setCompanyId(companyId);
+//            departmentMapper.insert(department);
+//        }
+//        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+//        for (JSONObject deptArray : deptArrays) {
+//            String canonicalName = deptArray.getString("canonicalName");
+//            Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(deptArray.getString("name"))).findFirst();
+//            if(first.isPresent()){
+//                String[] split = canonicalName.split("/");
+//                if(split.length>2){
+//                    String s = split[split.length - 2];
+//                    Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",companyId));
+//                    if(one!=null&&Optional.of(one).isPresent()){
+//                        first.get().setSuperiorId(one.getDepartmentId());
+//                    }
+//                }
+//                departmentMapper.updateById(first.get());
+//            }
+//        }
+        List<JSONObject> userArrays = getUser();
+        Integer[] ints = {514, 546, 66050, 66080, 66082};
+        List<Integer> disable = Arrays.asList(ints);
+        for (JSONObject user : userArrays) {
+            if(disable.contains(user.getIntValue("userAccountControl"))){
+                List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
+                Optional<User> optional = users.stream().filter(ul -> ul.getPhone() != null && ul.getPhone().equals(user.getString("userPrincipalName"))).findFirst();
+                if(optional.isPresent()){
+                    userMapper.deleteById(optional.get().getId());
+                }
+                continue;
+            }
+            if(!user.containsKey("userPrincipalName")){
+                continue;
+            }
+            User u=new User();
+            u.setId(SnowFlake.nextId()+"")
+                    .setName(user.getString("name"))
+                    .setPhone(user.getString("userPrincipalName"))
+                    .setId(SnowFlake.nextId()+"")
+                    .setRoleId(role.getId())//默认普通员工
+                    .setRoleName(role.getRolename())
+                    .setCompanyId(companyId)
+                    .setColor(ColorUtil.randomColor())
+                    .setPassword(MD5Util.getPassword("000000"));
+            String distinguishedName = user.getString("distinguishedName");
+            String[] split = distinguishedName.split(",");
+            List<String> list = Arrays.asList(split);
+            List<String> collect = list.stream().filter(l -> l.contains("OU=")).collect(Collectors.toList());
+            if(collect.size()>0){
+                String s = collect.get(0).replaceAll("OU=", "");
+                Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",companyId));
+                if(one!=null){
+                    u.setDepartmentId(one.getDepartmentId()).setDepartmentName(one.getDepartmentName()).setDepartmentCascade(convertDepartmentIdToCascade(one.getDepartmentId(),departmentList));
+                }
+            }
+            List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
+            if(!users.stream().anyMatch(ul->ul.getPhone()!=null&&ul.getPhone().equals(u.getPhone()))){
+                userMapper.insert(u);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
     public LdapContext adLogin() {
 
         LdapContext ldapContext = null;

+ 110 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -137,6 +137,10 @@ public class TimingTask {
     private TaskExecutorMapper taskExecutorMapper;
     @Resource
     private TimeTypeService timeTypeService;
+    @Resource
+    private SysRoleMapper sysRoleMapper;
+    @Resource
+    private UserService userService;
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -592,6 +596,112 @@ public class TimingTask {
         }
     }
 
+
+    @Scheduled(cron = "0 10 1 ? * *")
+    private void synAd() throws Exception {
+        if (isDev) return;
+        if(!isPrivateDeploy) return;
+        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_ad", 1));
+        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
+        if(compIds.isEmpty()){
+            return;
+        }
+        for (Integer compId : compIds) {
+            SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id",compId).eq("rolename","普通员工"));
+            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", compId));
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", compId));
+//        List<JSONObject> deptArrays = userService.ldapGetOU();
+//        for (JSONObject dept : deptArrays) {
+//            Department department=new Department();
+//            department.setDepartmentName(dept.getString("name"))
+//                    .setCompanyId(companyId);
+//            departmentMapper.insert(department);
+//        }
+//        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+//        for (JSONObject deptArray : deptArrays) {
+//            String canonicalName = deptArray.getString("canonicalName");
+//            Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(deptArray.getString("name"))).findFirst();
+//            if(first.isPresent()){
+//                String[] split = canonicalName.split("/");
+//                if(split.length>2){
+//                    String s = split[split.length - 2];
+//                    Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",companyId));
+//                    if(one!=null&&Optional.of(one).isPresent()){
+//                        first.get().setSuperiorId(one.getDepartmentId());
+//                    }
+//                }
+//                departmentMapper.updateById(first.get());
+//            }
+//        }
+            List<JSONObject> userArrays = userService.getUser();
+            Integer[] ints = {514, 546, 66050, 66080, 66082};
+            List<Integer> disable = Arrays.asList(ints);
+            for (JSONObject user : userArrays) {
+                if(disable.contains(user.getIntValue("userAccountControl"))){
+                    List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
+                    Optional<User> optional = users.stream().filter(ul -> ul.getPhone() != null && ul.getPhone().equals(user.getString("userPrincipalName"))).findFirst();
+                    if(optional.isPresent()){
+                        userMapper.deleteById(optional.get().getId());
+                    }
+                    continue;
+                }
+                if(!user.containsKey("userPrincipalName")){
+                    continue;
+                }
+                User u=new User();
+                u.setId(SnowFlake.nextId()+"")
+                        .setName(user.getString("name"))
+                        .setPhone(user.getString("userPrincipalName"))
+                        .setId(SnowFlake.nextId()+"")
+                        .setRoleId(role.getId())//默认普通员工
+                        .setRoleName(role.getRolename())
+                        .setCompanyId(compId)
+                        .setColor(ColorUtil.randomColor())
+                        .setPassword(MD5Util.getPassword("000000"));
+                String distinguishedName = user.getString("distinguishedName");
+                String[] split = distinguishedName.split(",");
+                List<String> list = Arrays.asList(split);
+                List<String> collect = list.stream().filter(l -> l.contains("OU=")).collect(Collectors.toList());
+                if(collect.size()>0){
+                    String s = collect.get(0).replaceAll("OU=", "");
+                    Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",compId));
+                    if(one!=null){
+                        u.setDepartmentId(one.getDepartmentId()).setDepartmentName(one.getDepartmentName()).setDepartmentCascade(convertDepartmentIdToCascade(one.getDepartmentId(),departmentList));
+                    }
+                }
+                List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
+                if(!users.stream().anyMatch(ul->ul.getPhone()!=null&&ul.getPhone().equals(u.getPhone()))){
+                    userMapper.insert(u);
+                }
+            }
+            OperationRecord operationRecord=new OperationRecord();
+            operationRecord.setCompanyId(compId)
+                    .setContent("同步来自LDAP的AD域控组织架构")
+                    .setOperationTime(LocalDateTime.now());
+            operationRecordService.save(operationRecord);
+        }
+    }
+
+    //将部门id转换为部门层级
+    private String convertDepartmentIdToCascade(Integer id, List<Department> allDeptList) {
+        StringBuilder cascade = new StringBuilder();
+        if (id == 0) {
+            cascade.append("0");
+        } else {
+            cascade.append(id);
+            id = findById(id, allDeptList).getSuperiorId();
+            while (id != null) {
+                cascade.append(",").append(id);
+                id = findById(id, allDeptList).getSuperiorId();
+            }
+        }
+        return cascade.toString();
+    }
+
+    private Department findById(int id, List<Department> allList) {
+        return allList.stream().filter(all->all.getDepartmentId().intValue() == id).findFirst().get();
+    }
+
     private  List<LocalDateTime> getDays(LocalDateTime start, LocalDateTime end) {
         List<LocalDateTime> result = new ArrayList();
         while (start.isBefore(end)) {

Разница между файлами не показана из-за своего большого размера
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 31 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -126,6 +126,10 @@
                         <el-link type="primary" :underline="false" @click="showCorpDDSyncDialog">{{ $t('synchronizetheaddressbook') }}</el-link>
                     </el-form-item>
 
+                    <el-form-item style="float:right;" v-if="user.timeType.syncAd==1">
+                        <el-link type="primary" :underline="false" @click="syncAd">{{ '同步AD域控通讯录'}}</el-link>
+                    </el-form-item>
+
                     <!-- <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
                         <el-link type="primary" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">模板下载</el-link>
                     </el-form-item> -->
@@ -2520,6 +2524,33 @@ export default {
       );
     },
 
+    syncAd(){
+      this.http.post(
+            "/user/syncDeptWithAD",
+            {},
+            (res) => {
+              if (res.code == "ok") {
+                this.$message({
+                  message: '同步成功',
+                  type: "success",
+                });
+              } else {
+                this.$message({
+                  message: res.msg,
+                  type: "error",
+                });
+              }
+            },
+            (error) => {
+              this.listLoading = false;
+              this.$message({
+                message: error,
+                type: "error",
+              });
+            }
+          );
+    },
+
     resetPwd(user) {
       this.$confirm(this.$t('wanttoor') + user.name + this.$t('resetyourpassword'), this.$t('saresetyourpassword'), {
         confirmButtonText: this.$t('btn.determine'),