|
|
@@ -0,0 +1,208 @@
|
|
|
+package com.inspur.customer.service.org;
|
|
|
+
|
|
|
+import com.alibaba.cola.dto.Response;
|
|
|
+import com.alibaba.cola.dto.SingleResponse;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.inspur.customer.client.keycloak.KeycloakService;
|
|
|
+import com.inspur.customer.client.org.SmsbDepartmentService;
|
|
|
+import com.inspur.customer.client.org.SmsbDepartmentUserService;
|
|
|
+import com.inspur.customer.constant.Constant;
|
|
|
+import com.inspur.customer.infrastructure.convertor.SmsbDepartmentConvertor;
|
|
|
+import com.inspur.customer.infrastructure.mapper.org.SmsbDepartmentMapper;
|
|
|
+import com.inspur.customer.infrastructure.object.org.SmsbDepartmentDO;
|
|
|
+import com.inspur.customer.object.org.*;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author wangbo13
|
|
|
+ * @Date 2022/11/25 14:58
|
|
|
+ * @Version 1.0
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@DubboService(interfaceClass = SmsbDepartmentService.class)
|
|
|
+public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper , SmsbDepartmentDO> implements SmsbDepartmentService {
|
|
|
+
|
|
|
+ @DubboReference
|
|
|
+ private SmsbDepartmentUserService departmentUserService;
|
|
|
+ @DubboReference
|
|
|
+ private KeycloakService service;
|
|
|
+ @DubboReference
|
|
|
+ private SmsbDepartmentUserService userService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response addDepartment(String userId , SmsbDepartmentAdd smsbDepartmentAdd) {
|
|
|
+ List<SmsbDepartmentDO> departments = this.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getTenant, smsbDepartmentAdd.getTenant())
|
|
|
+ .eq(SmsbDepartmentDO::getMark, smsbDepartmentAdd.getMark()));
|
|
|
+ if(!CollectionUtils.isEmpty(departments)){return Response.buildFailure("500",
|
|
|
+ "部门标识["+smsbDepartmentAdd.getMark()+"]在租户["+smsbDepartmentAdd.getTenant()+"]中已存在!");}
|
|
|
+ SmsbDepartmentDO department = SmsbDepartmentConvertor.toDataObjectForCreate(userId, smsbDepartmentAdd);
|
|
|
+ department.setPath(pathFactory(smsbDepartmentAdd.getParentId(),smsbDepartmentAdd.getMark()));
|
|
|
+ department.setOrderNo(orderNmFactory(smsbDepartmentAdd.getParentId()));
|
|
|
+ super.save(department);
|
|
|
+ return SingleResponse.of(department);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void deleteDepartment(String userId, List<Long> ids) {
|
|
|
+ super.update(new LambdaUpdateWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .set(SmsbDepartmentDO::getIsDel , 1)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateBy , userId)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateTime , LocalDateTime.now())
|
|
|
+ .in(SmsbDepartmentDO::getId , ids));
|
|
|
+ List<SmsbDepartmentDO> nextDepartment = super.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .in(SmsbDepartmentDO::getParentId, ids));
|
|
|
+ if(!CollectionUtils.isEmpty(nextDepartment)){
|
|
|
+ deleteDepartment(userId , nextDepartment.stream().map(i -> i.getId()).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response updateDepartment(String userId, SmsbDepartmentUpdate departmentUpdate) {
|
|
|
+ boolean flag = super.update(new LambdaUpdateWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .set(StringUtils.isNotBlank(departmentUpdate.getName()), SmsbDepartmentDO::getName, departmentUpdate.getName())
|
|
|
+ .set(SmsbDepartmentDO::getUpdateBy, userId)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateTime, LocalDateTime.now())
|
|
|
+ .eq(SmsbDepartmentDO::getId, departmentUpdate.getId()));
|
|
|
+ return flag ? Response.buildSuccess() : Response.buildFailure("500","部门更新失败!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前部门路径
|
|
|
+ *
|
|
|
+ * @param parentId 父节点id(可为空)
|
|
|
+ * @param mark 当前节点名称
|
|
|
+ * @return 当前路径
|
|
|
+ */
|
|
|
+ private String pathFactory(Long parentId , String mark){
|
|
|
+ if(Objects.isNull(parentId)){
|
|
|
+ return Constant.OBLIQUE_LINE.concat(mark);
|
|
|
+ }else{
|
|
|
+ SmsbDepartmentDO department = super.getById(parentId);
|
|
|
+ return pathFactory(department.getParentId() , department.getMark().concat(Constant.OBLIQUE_LINE).concat(mark));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取序号
|
|
|
+ *
|
|
|
+ * @param parentId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Integer orderNmFactory(Long parentId){
|
|
|
+ if(Objects.isNull(parentId)) return 1;
|
|
|
+ SmsbDepartmentDO department = super.getOne(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getParentId, parentId)
|
|
|
+ .orderByDesc(SmsbDepartmentDO::getOrderNo)
|
|
|
+ .last("limit 1"));
|
|
|
+ return Objects.isNull(department)?1:department.getOrderNo()+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response queryDepartmentList(String tenant) {
|
|
|
+ SmsbDepartmentDO department = super.getOne(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getTenant, tenant)
|
|
|
+ .isNull(SmsbDepartmentDO::getParentId)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ SmsbDepartmentCO smsbDepartmentCO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(department , smsbDepartmentCO);
|
|
|
+ smsbDepartmentCO.setChildren(this.getChilde(department.getId()));
|
|
|
+ return SingleResponse.of(smsbDepartmentCO);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response queryDepartmentUserList(SmsbDepartmentCmd departmentCmd) {
|
|
|
+ List<Long> departmentIds = super.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getTenant, departmentCmd.getTenant())
|
|
|
+ .eq(Objects.nonNull(departmentCmd.getDepartmentId()), SmsbDepartmentDO::getId, departmentCmd.getDepartmentId()))
|
|
|
+ .stream().map(i -> i.getId())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<String> userIds = departmentUserService.queryUserIdByDeprIds(departmentIds);
|
|
|
+ return SingleResponse.of(service.getUserListByIds(departmentCmd.getTenant() ,userIds));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<SmsbDepartmentCO> getChilde(Long id){
|
|
|
+ List<SmsbDepartmentDO> childList = this.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getParentId, id));
|
|
|
+ List<SmsbDepartmentCO> finalChilds = Lists.newArrayList();
|
|
|
+ childList.forEach(child ->{
|
|
|
+ SmsbDepartmentCO smsbDepartmentCO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(child , smsbDepartmentCO);
|
|
|
+ smsbDepartmentCO.setChildren(this.getChilde(child.getId()));
|
|
|
+ finalChilds.add(smsbDepartmentCO);
|
|
|
+ });
|
|
|
+ return finalChilds;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鉴权
|
|
|
+ *
|
|
|
+ * @param tenant
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Response checkOperationAuthority(String userId , String tenant){
|
|
|
+ String real = service.queryUserTenant(userId);
|
|
|
+ if(service.isExitTargetRole(userId ,Constant.SUPER_ADMIN) ||
|
|
|
+ (StringUtils.isNotEmpty(real) && real.equals(tenant) && service.isExitTargetRole(userId , Constant.ROLE_ADMIN))){
|
|
|
+ return Response.buildSuccess();
|
|
|
+ }
|
|
|
+ return Response.buildFailure("401","无权操作!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SmsbDepartmentCO getOneById(Long id) {
|
|
|
+ SmsbDepartmentDO department = super.getById(id);
|
|
|
+ SmsbDepartmentCO departmentDO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(department , departmentDO);
|
|
|
+ return departmentDO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response addKeyClaokUser(String userId ,SmsbUserAdd smsbUserAdd) {
|
|
|
+ // 1、keycloak新增账号
|
|
|
+ SingleResponse addUserResponse = service.addKeyClaokUser(smsbUserAdd.getUsername(),smsbUserAdd.getTenant() ,smsbUserAdd.getCredentials());
|
|
|
+ if(!addUserResponse.isSuccess()){return addUserResponse;}
|
|
|
+ String addUserId = (String)addUserResponse.getData();
|
|
|
+ log.info("new user id:{}",addUserId);
|
|
|
+ // 2、是否传递所属部门,不传递不做处理
|
|
|
+ if(Objects.nonNull(smsbUserAdd.getDepartmentId())){
|
|
|
+ // 3、保存用户与部门关系
|
|
|
+ userService.addUserDepartment(addUserId , smsbUserAdd.getDepartmentId());
|
|
|
+ // 4、将部门信息写入keucloak的attibute中
|
|
|
+ service.addAttributesByUserId(addUserId , "org" , Collections.singletonList(super.getById(smsbUserAdd.getDepartmentId()).getPath()));
|
|
|
+ }
|
|
|
+ return SingleResponse.of(addUserId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response regrouping(SmsbRegrouping smsbRegrouping) {
|
|
|
+ // 1、清空原绑定关系,建立新绑定关系
|
|
|
+ Boolean result = departmentUserService.clearAndCreateRelation(smsbRegrouping.getUserId(), smsbRegrouping.getDepartmentId());
|
|
|
+ // 2、更新attribute
|
|
|
+ if(result){
|
|
|
+ service.addAttributesByUserId(smsbRegrouping.getUserId() , "org" , Collections.singletonList(
|
|
|
+ super.getById(smsbRegrouping.getDepartmentId()).getPath()));
|
|
|
+ return Response.buildSuccess();
|
|
|
+ }else{
|
|
|
+ return Response.buildFailure("500","用户重分组失败!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|