Browse Source

批量更新员工部门接口

master
luoweijian 1 month ago
parent
commit
4f914f0008
  1. 56
      src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java
  2. 20
      src/main/java/com/project/base/config/MybatisPlusConfig.java
  3. 12
      src/main/java/com/project/base/mapper/BatchUpsertMapper.java
  4. 5
      src/main/java/com/project/ding/controller/DepartmentController.java
  5. 25
      src/main/java/com/project/ding/controller/SyncController.java
  6. 8
      src/main/java/com/project/ding/domain/dto/DepartmentDTO.java
  7. 12
      src/main/java/com/project/ding/domain/dto/DingUserDTO.java
  8. 8
      src/main/java/com/project/ding/domain/dto/UserDTO.java
  9. 17
      src/main/java/com/project/ding/domain/entity/DepartmentEntity.java
  10. 32
      src/main/java/com/project/ding/domain/entity/UserEntity.java
  11. 8
      src/main/java/com/project/ding/domain/service/DepartmentBaseService.java
  12. 11
      src/main/java/com/project/ding/domain/service/impl/DepartmentBaseServiceImpl.java
  13. 4
      src/main/java/com/project/ding/mapper/DepartmentMapper.java
  14. 3
      src/main/java/com/project/ding/mapper/UserMapper.java
  15. 56
      src/main/java/com/project/ding/utils/DingUserSyncUtil.java
  16. 39
      src/main/java/com/project/ding/utils/DingUtil.java
  17. 17
      src/main/resources/application.yml
  18. BIN
      src/main/resources/static/favicon.ico

56
src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java

@ -0,0 +1,56 @@
package com.project.base.config;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
import java.util.stream.Collectors;
/**
* 自定义选装件MySQL 批量 Upsert
*/
public class InsertBatchOnDuplicateKeyUpdate extends AbstractMethod {
protected InsertBatchOnDuplicateKeyUpdate() {
super("batchUpsert"); // 方法名
}
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
final String methodName = "batchUpsert";
// 1. 准备 INSERT 字段
String columnScript = "(" + tableInfo.getKeyColumn() + "," +
tableInfo.getFieldList().stream()
.map(TableFieldInfo::getColumn)
.collect(Collectors.joining(",")) + ")";
// 2. 准备 VALUES 部分 (修复重点!)
String valuesScript = "(#{item." + tableInfo.getKeyProperty() + "}," +
tableInfo.getFieldList().stream()
.map(i -> {
// 【核心修复】检查该字段是否有 TypeHandler (如 JacksonTypeHandler)
if (i.getTypeHandler() != null) {
// 生成格式如:#{item.depIdPath,typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler}
return "#{item." + i.getProperty() + ",typeHandler=" + i.getTypeHandler().getName() + "}";
}
return "#{item." + i.getProperty() + "}";
})
.collect(Collectors.joining(",")) + ")";
// 3. 准备 ON DUPLICATE KEY UPDATE 部分
String updateScript = tableInfo.getFieldList().stream()
.filter(i -> !i.getColumn().equals("create_time"))
.map(i -> i.getColumn() + " = VALUES(" + i.getColumn() + ")")
.collect(Collectors.joining(",")) + ", update_time = NOW()";
String sql = String.format("<script>INSERT INTO %s %s VALUES <foreach collection=\"list\" item=\"item\" separator=\",\">%s</foreach> ON DUPLICATE KEY UPDATE %s</script>",
tableInfo.getTableName(), columnScript, valuesScript, updateScript);
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return this.addInsertMappedStatement(mapperClass, modelClass, methodName, sqlSource, new NoKeyGenerator(), null, null);
}
}

20
src/main/java/com/project/base/config/MybatisPlusConfig.java

@ -0,0 +1,20 @@
package com.project.base.config;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class MybatisPlusConfig extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchOnDuplicateKeyUpdate()); // 确保这里添加了你的自定义方法
return methodList;
}
}

12
src/main/java/com/project/base/mapper/BatchUpsertMapper.java

@ -0,0 +1,12 @@
package com.project.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BatchUpsertMapper<T> extends BaseMapper<T> {
/**
* 自定义全局批量 Upsert
*/
int batchUpsert(@Param("list") List<T> list);
}

5
src/main/java/com/project/ding/controller/DepartmentController.java

@ -2,8 +2,7 @@ package com.project.ding.controller;
import com.github.tingyugetc520.ali.dingtalk.api.DtService; import com.github.tingyugetc520.ali.dingtalk.api.DtService;
import com.github.tingyugetc520.ali.dingtalk.bean.department.DtDepart; import com.project.ding.domain.dto.DepartmentDTO;
import com.github.tingyugetc520.ali.dingtalk.bean.user.DtUser;
import com.project.ding.domain.dto.DingUserDTO; import com.project.ding.domain.dto.DingUserDTO;
import com.project.ding.utils.DingUtil; import com.project.ding.utils.DingUtil;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -25,7 +24,7 @@ public class DepartmentController {
private DtService dtService; private DtService dtService;
@GetMapping("/test") @GetMapping("/test")
public void test(HttpServletResponse response) throws Exception { public void test(HttpServletResponse response) throws Exception {
List<DtDepart> list = dingUtil.getAllDepartment(); List<DepartmentDTO> list = dingUtil.getAllDepartment();
List<DingUserDTO> userList = new ArrayList<>(); List<DingUserDTO> userList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {

25
src/main/java/com/project/ding/controller/SyncController.java

@ -0,0 +1,25 @@
package com.project.ding.controller;
import com.project.ding.utils.DingUserSyncUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ding")
public class SyncController {
@Autowired
private DingUserSyncUtil dingUserSyncUtil;
/**
* 手动触发同步接口
* 强刷/sync/all?force=true
*/
@GetMapping("/sync")
public String triggerSync(@RequestParam(defaultValue = "false") boolean force) {
return dingUserSyncUtil.triggerSync(force);
}
}

8
src/main/java/com/project/ding/domain/dto/DepartmentDTO.java

@ -4,10 +4,18 @@ package com.project.ding.domain.dto;
import com.project.base.domain.dto.BaseDTO; import com.project.base.domain.dto.BaseDTO;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class DepartmentDTO extends BaseDTO { public class DepartmentDTO extends BaseDTO {
private String name; private String name;
private Long parentId; private Long parentId;
private List<DepartmentDTO> childrenList;
private Boolean leaf = Boolean.TRUE;
private List<Long> deptIdPath;
} }

12
src/main/java/com/project/ding/domain/dto/DingUserDTO.java

@ -64,4 +64,16 @@ public class DingUserDTO {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date hiredDate; private Date hiredDate;
@JsonProperty("active")
private Boolean active;
@JsonProperty("admin")
private Boolean admin;
@JsonProperty("boss")
private Boolean boss;
@JsonProperty("leader")
private Boolean leader;
} }

8
src/main/java/com/project/ding/domain/dto/UserDTO.java

@ -32,6 +32,14 @@ public class UserDTO extends BaseDTO {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date hiredDate; private Date hiredDate;
private Boolean active;
private Boolean admin;
private Boolean boss;
private Boolean leader;
/** /**
* 需要参与考试任务数 * 需要参与考试任务数
*/ */

17
src/main/java/com/project/ding/domain/entity/DepartmentEntity.java

@ -1,7 +1,10 @@
package com.project.ding.domain.entity; package com.project.ding.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.project.base.domain.entity.BaseEntity; import com.project.base.domain.entity.BaseEntity;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
@ -9,14 +12,20 @@ import jakarta.persistence.Index;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import java.util.List;
@Data @Data
@Table(name = "evaluator_department" , indexes = {@Index(name = "Idx_parentId", columnList = "parent_id")}) @Table(name = "evaluator_department" , indexes = {@Index(name = "Idx_parentId", columnList = "parent_id")})
@Entity @Entity
@TableName("evaluator_department") @TableName(value = "evaluator_department" , autoResultMap = true)
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DepartmentEntity extends BaseEntity { public class DepartmentEntity extends BaseEntity {
@TableId(type = IdType.INPUT)
private Long id;
@Column(name = "name" , columnDefinition="varchar(255) comment '部门名称'") @Column(name = "name" , columnDefinition="varchar(255) comment '部门名称'")
private String name; private String name;
@ -24,4 +33,10 @@ public class DepartmentEntity extends BaseEntity {
@TableField("parent_id") @TableField("parent_id")
@Column(name = "parent_id" , columnDefinition="bigint(20) comment '父部门id'") @Column(name = "parent_id" , columnDefinition="bigint(20) comment '父部门id'")
private Long parentId; private Long parentId;
@TableField(typeHandler = JacksonTypeHandler.class)
@Column(name = "dept_id_path", columnDefinition = "json comment '部门ID全路径'")
@JdbcTypeCode(SqlTypes.JSON)
private List<Long> deptIdPath;
} }

32
src/main/java/com/project/ding/domain/entity/UserEntity.java

@ -1,6 +1,10 @@
package com.project.ding.domain.entity; package com.project.ding.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.project.base.domain.entity.BaseEntity; import com.project.base.domain.entity.BaseEntity;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
@ -8,16 +12,22 @@ import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import java.util.Date; import java.util.Date;
import java.util.List;
@Data @Data
@Table(name = "evaluator_user" ) @Table(name = "evaluator_user" )
@Entity @Entity
@TableName("evaluator_user") @TableName(value = "evaluator_user", autoResultMap = true) // 必须开启 autoResultMap 才能让 TypeHandler 生效
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class UserEntity extends BaseEntity { public class UserEntity extends BaseEntity {
@TableId(type = IdType.INPUT)
private Long id;
@Column(name = "union_id" , columnDefinition="varchar(255) comment '企业架构内唯一标识'") @Column(name = "union_id" , columnDefinition="varchar(255) comment '企业架构内唯一标识'")
private String unionId; private String unionId;
@ -39,7 +49,27 @@ public class UserEntity extends BaseEntity {
@Column(name = "dept_id_str" , columnDefinition="varchar(2000) comment '部门id集合'") @Column(name = "dept_id_str" , columnDefinition="varchar(2000) comment '部门id集合'")
private String deptIdStr; private String deptIdStr;
/**
* 存储为 JSON 数组: [1, 10, 101]
*/
@TableField(typeHandler = JacksonTypeHandler.class)
@Column(name = "dept_id_list", columnDefinition = "json comment '部门ID列表'")
@JdbcTypeCode(SqlTypes.JSON)
private List<Long> deptIdList;
@Column(name = "hired_date") @Column(name = "hired_date")
@Comment("入职时间") @Comment("入职时间")
private Date hiredDate; private Date hiredDate;
@Column(name = "active", columnDefinition = "tinyint(1) default 1 comment '是否激活钉钉: 1-已激活, 0-未激活'")
private Boolean active;
@Column(name = "admin", columnDefinition = "tinyint(1) default 0 comment '是否为企业管理员: 1-是, 0-不是'")
private Boolean admin;
@Column(name = "boss", columnDefinition = "tinyint(1) default 0 comment '是否为企业老板: 1-是, 0-不是'")
private Boolean boss;
@Column(name = "leader", columnDefinition = "tinyint(1) default 0 comment '是否为部门主管: 1-是, 0-不是'")
private Boolean leader;
} }

8
src/main/java/com/project/ding/domain/service/DepartmentBaseService.java

@ -0,0 +1,8 @@
package com.project.ding.domain.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.project.ding.domain.entity.DepartmentEntity;
import com.project.ding.domain.entity.UserEntity;
public interface DepartmentBaseService extends IService<DepartmentEntity> {
}

11
src/main/java/com/project/ding/domain/service/impl/DepartmentBaseServiceImpl.java

@ -0,0 +1,11 @@
package com.project.ding.domain.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.ding.domain.entity.DepartmentEntity;
import com.project.ding.domain.service.DepartmentBaseService;
import com.project.ding.mapper.DepartmentMapper;
import org.springframework.stereotype.Service;
@Service
public class DepartmentBaseServiceImpl extends ServiceImpl<DepartmentMapper, DepartmentEntity> implements DepartmentBaseService {
}

4
src/main/java/com/project/ding/mapper/DepartmentMapper.java

@ -1,9 +1,11 @@
package com.project.ding.mapper; package com.project.ding.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.project.base.mapper.BatchUpsertMapper;
import com.project.ding.domain.entity.DepartmentEntity; import com.project.ding.domain.entity.DepartmentEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface DepartmentMapper extends BaseMapper<DepartmentEntity> { public interface DepartmentMapper extends BaseMapper<DepartmentEntity>, BatchUpsertMapper<DepartmentEntity> {
} }

3
src/main/java/com/project/ding/mapper/UserMapper.java

@ -1,7 +1,8 @@
package com.project.ding.mapper; package com.project.ding.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.project.base.mapper.BatchUpsertMapper;
import com.project.ding.domain.entity.UserEntity; import com.project.ding.domain.entity.UserEntity;
public interface UserMapper extends BaseMapper<UserEntity> { public interface UserMapper extends BaseMapper<UserEntity> , BatchUpsertMapper<UserEntity> {
} }

56
src/main/java/com/project/ding/utils/DingUserSyncUtil.java

@ -1,19 +1,24 @@
package com.project.ding.utils; package com.project.ding.utils;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import com.project.base.domain.utils.TreeUtils;
import com.project.ding.domain.dto.DepartmentDTO;
import com.project.ding.domain.dto.UserDTO; import com.project.ding.domain.dto.UserDTO;
import com.project.ding.domain.entity.DepartmentEntity;
import com.project.ding.domain.entity.SyncLogEntity; import com.project.ding.domain.entity.SyncLogEntity;
import com.project.ding.domain.entity.UserEntity; import com.project.ding.domain.entity.UserEntity;
import com.project.ding.domain.service.UserBaseService; import com.project.ding.mapper.DepartmentMapper;
import com.project.ding.mapper.SyncLogMapper; import com.project.ding.mapper.SyncLogMapper;
import com.project.ding.mapper.UserMapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.*;
import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -29,7 +34,10 @@ public class DingUserSyncUtil {
private StringRedisTemplate redisTemplate; private StringRedisTemplate redisTemplate;
@Autowired @Autowired
private UserBaseService userBaseService; private UserMapper userMapper;
@Autowired
private DepartmentMapper departmentMapper;
@Autowired @Autowired
private DingUtil dingUtil; private DingUtil dingUtil;
@ -85,10 +93,44 @@ public class DingUserSyncUtil {
// 开始同步 // 开始同步
try { try {
List<DepartmentDTO> allDepartment = dingUtil.getAllDepartment();
allDepartment.forEach(dto -> dto.setDeptIdPath(new ArrayList<>(Collections.singletonList(dto.getId()))));
// 转树
List<DepartmentDTO> departmentDTOtreeList = TreeUtils.buildLongTree(allDepartment, DepartmentDTO::getId, DepartmentDTO::getParentId, (parentDTO, childrenList) -> {
parentDTO.setChildrenList(childrenList);
parentDTO.setLeaf(Boolean.FALSE);
childrenList.forEach(childDTO -> childDTO.getDeptIdPath().addAll(0, parentDTO.getDeptIdPath()));
});
// 树转回列表
List<DepartmentDTO> departmentDTOList = TreeUtils.tree2List(departmentDTOtreeList, DepartmentDTO::getChildrenList);
Map<String , List<Long>> depIdPathMap = new HashMap<>();
departmentDTOList.forEach(dto -> depIdPathMap.put(dto.getId().toString() , dto.getDeptIdPath()));
List<List<DepartmentDTO>> departmentPartitions = ListUtil.partition(departmentDTOList, 300);
for (List<DepartmentDTO> batch : departmentPartitions) {
departmentMapper.batchUpsert(batch.stream()
.map(dto -> dto.toEntity(DepartmentEntity::new))
.collect(Collectors.toList()));
}
List<UserDTO> allUserDTOList = dingUtil.getAllUserDTO(); List<UserDTO> allUserDTOList = dingUtil.getAllUserDTO();
userBaseService.saveOrUpdateBatch(allUserDTOList.stream() allUserDTOList.forEach(user -> {
.map(dto -> dto.toEntity(UserEntity::new)) Set<Long> depIdPathSet = new HashSet<>();
.collect(Collectors.toList()) , 300); if (StrUtil.isNotBlank(user.getDeptIdStr())) {
for (String idStr : user.getDeptIdStr().split(",")) {
depIdPathSet.addAll(depIdPathMap.get(idStr));
}
}
user.setDeptIdList(depIdPathSet.stream().toList());
});
List<List<UserDTO>> userPartitions = ListUtil.partition(allUserDTOList, 300);
for (List<UserDTO> batch : userPartitions) {
userMapper.batchUpsert(batch.stream()
.map(dto -> dto.toEntity(UserEntity::new))
.collect(Collectors.toList()));
}
syncLogEntity.setStatus(1); syncLogEntity.setStatus(1);
syncLogEntity.setEndTime(new Date()); syncLogEntity.setEndTime(new Date());
syncLogMapper.updateById(syncLogEntity); syncLogMapper.updateById(syncLogEntity);

39
src/main/java/com/project/ding/utils/DingUtil.java

@ -1,5 +1,6 @@
package com.project.ding.utils; package com.project.ding.utils;
import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.tingyugetc520.ali.dingtalk.api.DtService; import com.github.tingyugetc520.ali.dingtalk.api.DtService;
@ -7,6 +8,7 @@ import com.github.tingyugetc520.ali.dingtalk.bean.department.DtDepart;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
import com.project.ding.domain.dto.DepartmentDTO;
import com.project.ding.domain.dto.DingUserDTO; import com.project.ding.domain.dto.DingUserDTO;
import com.project.ding.domain.dto.UserDTO; import com.project.ding.domain.dto.UserDTO;
import io.vavr.control.Try; import io.vavr.control.Try;
@ -14,7 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@ -24,12 +28,19 @@ public class DingUtil {
public List<DtDepart> getAllDepartment() throws Exception { public List<DepartmentDTO> getAllDepartment() throws Exception {
return dtService.getDepartmentService().list(null , true); List<DtDepart> list = dtService.getDepartmentService().list(null, true);
List<DepartmentDTO> res = new ArrayList<>();
for (DtDepart dtDepart : list) {
DepartmentDTO departmentDTO = new DepartmentDTO();
BeanUtil.copyProperties(dtDepart , departmentDTO);
res.add(departmentDTO);
}
return res;
} }
public List<DingUserDTO> getAllDingUserDTO() throws Exception { public List<DingUserDTO> getAllDingUserDTO() throws Exception {
List<DtDepart> list = getAllDepartment(); List<DepartmentDTO> list = getAllDepartment();
List<DingUserDTO> userList = new ArrayList<>(); List<DingUserDTO> userList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
@ -40,16 +51,34 @@ public class DingUtil {
} }
public List<UserDTO> getAllUserDTO() throws Exception { public List<UserDTO> getAllUserDTO() throws Exception {
List<DtDepart> list = getAllDepartment(); List<DepartmentDTO> list = getAllDepartment();
List<UserDTO> userList = new ArrayList<>(); List<UserDTO> userList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
List<DingUserDTO> userInDepartment = getUserIdInDepartment(list.get(i).getId()); List<DingUserDTO> userInDepartment = getUserIdInDepartment(list.get(i).getId());
userList.addAll(userInDepartment.stream() userList.addAll(userInDepartment.stream()
.map(UserDTO::fromDingUserDTO) .map(UserDTO::fromDingUserDTO)
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
return userList; return userList.stream()
.collect(Collectors.toMap(
UserDTO::getId,
u -> u,
this::mergeUser
))
.values()
.stream()
.toList();
}
/**
* 定义合并规则处理权限逻辑
*/
private UserDTO mergeUser(UserDTO u1, UserDTO u2) {
// 权限合并:只要其中一个是 true,结果就是 true
u1.setLeader(Boolean.logicalOr(Boolean.TRUE.equals(u1.getLeader()), Boolean.TRUE.equals(u2.getLeader())));
return u1;
} }
public List<DingUserDTO> getUserIdInDepartment(Long id) throws Exception { public List<DingUserDTO> getUserIdInDepartment(Long id) throws Exception {

17
src/main/resources/application.yml

@ -1,5 +1,6 @@
server: server:
port: 7088 port: 7088
spring: spring:
datasource: datasource:
dynamic: dynamic:
@ -8,8 +9,22 @@ spring:
master: master:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
password: Itc@123456 password: Itc@123456
url: jdbc:mysql://172.16.204.50:3306/proposal_workshop?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true url: jdbc:mysql://172.16.204.50:3306/ai_evaluator?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
username: root username: root
# Redis
data:
redis:
host: 172.16.204.50
port: 6379
password: 123456
database: 3
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-idle: 30
max-wait: 10000
min-idle: 10
jpa: jpa:
hibernate: hibernate:
ddl-auto: update ddl-auto: update

BIN
src/main/resources/static/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Loading…
Cancel
Save