瀏覽代碼

修复wbs导入划分相关BUG

liuyc 3 年之前
父節點
當前提交
875bcb4594
共有 17 個文件被更改,包括 218 次插入40 次删除
  1. 18 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java
  2. 7 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  3. 17 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  4. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  5. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  6. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java
  7. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java
  8. 15 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml
  9. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java
  10. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  11. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  12. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java
  13. 30 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java
  14. 60 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  15. 5 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  16. 3 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  17. 40 4
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 18 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -17,6 +17,7 @@
 package org.springblade.manager.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
@@ -37,86 +38,103 @@ public class ArchiveTree extends BaseEntity {
     /**
      * 租户Id
      */
+    @ApiModelProperty(value = "租户id")
     private String tenantId;
 
     /**
      * 父主键
      */
+    @ApiModelProperty(value = "父节点id")
     private Long parentId;
 
     /**
      * 祖级列表
      */
+    @ApiModelProperty(value = "祖级列表id")
     private String ancestors;
 
     /**
      * 节点名
      */
+    @ApiModelProperty(value = "节点名")
     private String nodeName;
 
     /**
      * 节点全称
      */
+    @ApiModelProperty(value = "节点全称")
     private String fullName;
 
     /**
      * 节点类型
      */
+    @ApiModelProperty(value = "节点类型")
     private Integer nodeType;
 
     /**
      * 岗位类型
      */
+    @ApiModelProperty(value = "岗位类型")
     private String postType;
 
     /**
      * 关联类型
      */
+    @ApiModelProperty(value = "关联类型")
     private Integer associationType;
 
     /**
      * 内业资料类型
      */
+    @ApiModelProperty(value = "内业资料类型,‘使用逗号拼接’")
     private String majorDataType;
 
     /**
      * 显示层级
      */
+    @ApiModelProperty(value = "显示层级")
     private String displayHierarchy;
 
     /**
      * 是否为存储节点 '0'否 '1'是
      */
+    @ApiModelProperty(value = "是否为存储节点 '0'否 '1'是")
     private Integer isStorageNode;
 
     /**
      * 是否为竣工图 '0'否 '1'是
      */
+    @ApiModelProperty(value = "是否为竣工图 '0'否 '1'是")
     private Integer isBuiltDrawing;
 
     /**
      * 是否为接口节点 '0'否 '1'是
      */
+    @ApiModelProperty(value = "是否为接口节点 '0'否 '1'是")
     private Integer isInterfaceNode;
 
     /**
      * 接口类型
      */
+    @ApiModelProperty(value = "接口类型")
     private Integer interfaceType;
 
     /**
      * 排序
      */
+    @ApiModelProperty(value = "排序")
     private Integer sort;
 
     /**
      * 备注
      */
+    @ApiModelProperty(value = "备注")
     private String remark;
 
     /**
      * 是否配置到上传文件显示配置树 '0'否 '1'是
      */
+    @ApiModelProperty(value = "是否配置到上传文件显示配置树 '0'否 '1'是")
     private Integer isUploadFileDisplayConfigurationTree;
 
 

+ 7 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -56,6 +56,7 @@ public interface IUserClient {
     String USER_STATUS = API_PREFIX + "/user-status";
     String USER_ROLE_ID = API_PREFIX + "/user-roleId-update";
     String UPDATE_USER_ROLE_ID = API_PREFIX + "/user-roleId-update-two";
+    String UPDATE_USERS_ROLE_ID = API_PREFIX + "/user-roleId-update-three";
 
     /**
      * 获取用户信息
@@ -149,4 +150,10 @@ public interface IUserClient {
     @GetMapping(UPDATE_USER_ROLE_ID)
     boolean updateUserRoleIdTwo(@RequestParam("userId") String userId, @RequestParam("roleId") String roleId);
 
+    /**
+     * 批量删除用户RoleId
+     */
+    @GetMapping(UPDATE_USERS_ROLE_ID)
+    boolean updateUserRoleIdThree(@RequestParam("userIds") List<String> userIds, @RequestParam("roleIds") String roleIds);
+
 }

+ 17 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -75,7 +75,7 @@ import java.util.*;
 public class ContractInfoController extends BladeController {
 
     private final IContractInfoService contractInfoService;
-    private final SaveUserInfoByProjectService saveUserInfoByProject;
+    private final SaveUserInfoByProjectService saveUserInfoByProjectService;
     private final IUserClient iUserClient;
     private final IWbsTreeContractService wbsTreeContractService;
     private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
@@ -280,7 +280,7 @@ public class ContractInfoController extends BladeController {
                         Long id = SnowFlakeUtil.getId();
                         lists.setId(id);
                         lists.setStatus(1);
-                        saveUserInfoByProject.save(lists);
+                        saveUserInfoByProjectService.save(lists);
                     } else {
                         contractInfos.forEach(contractInfo -> {
                             Long row1 = saveUserInfoByProjectMapper.selectCount(
@@ -296,12 +296,12 @@ public class ContractInfoController extends BladeController {
                             lists.setId(id);
                             lists.setStatus(1);
                             lists.setContractId(String.valueOf(contractInfo.getId()));
-                            saveUserInfoByProject.save(lists);
+                            saveUserInfoByProjectService.save(lists);
                         });
                     }
                 } else {
                     //单合同段
-                    saveUserInfoByProject.saveBatch(list);
+                    saveUserInfoByProjectService.saveBatch(list);
                 }
             });
             return R.success("保存成功");
@@ -344,7 +344,7 @@ public class ContractInfoController extends BladeController {
             });
             //添加User-roleId字段
             iUserClient.updateUserRoleId(list);
-            boolean result = saveUserInfoByProject.saveBatch(list);
+            boolean result = saveUserInfoByProjectService.saveBatch(list);
             if (result) {
                 return R.success("保存成功");
             }
@@ -362,18 +362,19 @@ public class ContractInfoController extends BladeController {
     @Transactional(rollbackFor = Exception.class)
     public R removeUsersByIds(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
         if (StringUtils.isEmpty(ids)) {
-            throw new ServiceException("请选择要删除的数据");
-        } else if (Func.toLongList(ids).size() > 1) {
-            // TODO 未设定批量删除
-            throw new ServiceException("功能未开放");
+            throw new ServiceException("请选择要删除的用户");
+        }
+        if (Func.toLongList(ids).size() > 1) {//批量删除
+            List<Long> idsList = Func.toLongList(ids);
+            return R.status(saveUserInfoByProjectService.deleteBatchByIdsList(idsList));
+        } else {//单删除
+            //删除当前用户的RoleId
+            SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectById(ids);
+            String userId = saveUserInfoByProjectDTO.getUserId();
+            String roleId = saveUserInfoByProjectDTO.getRoleId();
+            iUserClient.updateUserRoleIdTwo(userId, roleId);
+            return R.status(saveUserInfoByProjectService.deleteLogic(Func.toLongList(ids)));
         }
-        //用户关联信息
-        SaveUserInfoByProjectDTO saveUserInfoByProjectDTO = saveUserInfoByProjectMapper.selectById(ids);
-        String userId = saveUserInfoByProjectDTO.getUserId();
-        String roleId = saveUserInfoByProjectDTO.getRoleId();
-        //删除当前用户RoleId
-        iUserClient.updateUserRoleIdTwo(userId, roleId);
-        return R.status(saveUserInfoByProject.deleteLogic(Func.toLongList(ids)));
     }
 
     /**

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -43,6 +43,7 @@ import org.springblade.manager.wrapper.ProjectInfoWrapper;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 客户级项目表 控制器

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -164,7 +164,7 @@ public class WbsTreeController extends BladeController {
         if (wbsTreePrivates.size() > 0) {
             return R.fail("当前节点已被项目引用,删除失败");
         }
-        return R.status(wbsTreeService.deleteLogic(Func.toLongList(id)));
+        return R.status(wbsTreeService.deleteLogicById(id));
     }
 
 

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java

@@ -8,6 +8,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springblade.manager.entity.WbsTree;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
@@ -17,14 +18,19 @@ public class WbsExcelUtil {
     /*public static void main(String[] args) throws IOException {
         WbsExcelUtil excelUtil = new WbsExcelUtil();
         //读取excel数据
+        int sum = 0;
         ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("D:\\Download\\WBS划分模板1.xls");
         for (Map<String, String> map : result) {
             System.out.println("输出:" + map);
+            sum++;
         }
+        System.out.println("sum" + sum);
     }*/
 
+
     /**
      * 读取excel数据
+     *
      * @param path
      */
     public ArrayList<Map<String, String>> readExcelToObj(String path) throws IOException {
@@ -45,6 +51,7 @@ public class WbsExcelUtil {
 
     /**
      * 读取excel文件
+     *
      * @param wb
      * @param sheetIndex    sheet页下标:从0开始
      * @param startReadLine 开始读取的行:从0开始
@@ -66,6 +73,7 @@ public class WbsExcelUtil {
                     String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
                     returnStr = rs;
                 } else {
+                    c.setCellType(CellType.STRING);
                     returnStr = c.getRichStringCellValue().getString();
                 }
                 if (c.getColumnIndex() == 0) {

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java

@@ -13,7 +13,9 @@ public interface SaveUserInfoByProjectMapper extends BaseMapper<SaveUserInfoByPr
 
     List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(@Param("userid") Long userId);
 
-    List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(@Param("projectId") Long projectId,@Param("contractId") Long contractId);
+    List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(@Param("projectId") Long projectId, @Param("contractId") Long contractId);
 
+    List<SaveUserInfoByProjectDTO> selectByIds(@Param("idsList") List<Long> idsList);
 
+    int deleteByIds(@Param("idsList") List<Long> idsList);
 }

+ 15 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml

@@ -26,6 +26,14 @@
         <result column="real_name" property="realName"/>
     </resultMap>
 
+    <update id="deleteByIds">
+        UPDATE m_project_assignment_user SET is_deleted = 1
+        WHERE id in
+        <foreach collection="idsList" item="idsList" open="(" close=")" separator=",">
+            #{idsList}
+        </foreach>
+    </update>
+
     <select id="findMaintenanceUser" resultMap="queryUserMap">
         select
           bu.id,
@@ -59,5 +67,12 @@
         and pau.contract_id = #{contractId}
         AND br.id is null
     </select>
+    <select id="selectByIds" resultType="org.springblade.manager.dto.SaveUserInfoByProjectDTO">
+        SELECT u.user_id,u.role_id FROM m_project_assignment_user u
+        WHERE id in
+        <foreach collection="idsList" item="idsList" open="(" close=")" separator=",">
+            #{idsList}
+        </foreach>
+    </select>
 
 </mapper>

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java

@@ -145,4 +145,5 @@ public interface WbsTreeMapper extends BaseMapper<WbsTree> {
 
     void updateByParentId(Long parentId, Long id);
 
+    int deleteLogicById(@Param("id") String id);
 }

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -169,6 +169,10 @@
         AND project_id = #{projectId}
     </delete>
 
+    <update id="deleteLogicById">
+        UPDATE  m_wbs_tree SET is_deleted = 1 WHERE id = #{id} OR project_node_id = #{id} OR ancestors like concat('%',#{id},'%')
+    </update>
+
     <update id="deleteLogicByWbsId">
         update m_wbs_tree set is_deleted = 1 where wbs_id = #{ids} and status = 1
     </update>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java

@@ -29,6 +29,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 服务类
@@ -117,4 +118,5 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     boolean importWbsTreeTableAndForm(MultipartFile excelFile, WbsTree wbsTree);
 
+    boolean deleteLogicById(String id);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/SaveUserInfoByProjectService.java

@@ -17,4 +17,7 @@ public interface SaveUserInfoByProjectService extends BaseService<SaveUserInfoBy
     List<SaveUserInfoByProjectDTO> queryProjectBusinessUser(Long projectId, Long contractId);
 
     List<SaveUserInfoByProjectDTO> selectList(String ids);
+
+    boolean deleteBatchByIdsList(List<Long> idsList);
+
 }

+ 30 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/SaveUserInfoByProjectServiceImpl.java

@@ -2,15 +2,18 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
-import org.springblade.manager.entity.SaveUserInfoByProject;
 import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 服务实现类
@@ -23,6 +26,8 @@ public class SaveUserInfoByProjectServiceImpl
         extends BaseServiceImpl<SaveUserInfoByProjectMapper, SaveUserInfoByProjectDTO>
         implements SaveUserInfoByProjectService {
 
+    private final IUserClient iUserClient;
+
     @Override
     public List<User> findMaintenanceUser() {
         return this.baseMapper.findMaintenanceUser();
@@ -40,6 +45,29 @@ public class SaveUserInfoByProjectServiceImpl
 
     @Override
     public List<SaveUserInfoByProjectDTO> selectList(String ids) {
-        return baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId,ids));
+        return baseMapper.selectList(Wrappers.<SaveUserInfoByProjectDTO>query().lambda().eq(SaveUserInfoByProjectDTO::getProjectId, ids));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class) //Todo
+    public boolean deleteBatchByIdsList(List<Long> idsList) {
+        //删除项目合同段关联用户信息
+        int row = baseMapper.deleteBatchIds(idsList);
+        /*删除用户的RoleId,因当前合同段下每个用户角色只能是一种,即当前合同段下userId不一样,roleId一样的批量删除*/
+        //获取该idsList信息
+        List<SaveUserInfoByProjectDTO> list = baseMapper.selectByIds(idsList);
+        //获取userIdList
+        List<String> userIds = list.stream().map(SaveUserInfoByProjectDTO::getUserId).collect(Collectors.toList());
+        //roleIds可以看做是同一个roleId
+        List<String> collect = list.stream().map(SaveUserInfoByProjectDTO::getRoleId).collect(Collectors.toList());
+        String roleIds = "";
+        for (String s : collect) {
+            roleIds = s;
+        }
+        boolean b = iUserClient.updateUserRoleIdThree(userIds, roleIds);
+        if (!b || row <= 0) {
+            throw new ServiceException("操作异常,请重新尝试");
+        }
+        return true;
     }
 }

+ 60 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -179,6 +179,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             wbsTree.setAncestors(ancestors);
             wbsTree.setType(2);
             wbsTree.setIsDeleted(BladeConstant.DB_NOT_DELETED);
+            wbsTree.setStatus(1);
             maps.stream().forEach(map -> {
                 String deptName = map.get("表名");
                 wbsTree.setDeptName(deptName);
@@ -241,6 +242,11 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         }
     }
 
+    @Override
+    public boolean deleteLogicById(String id) {
+        return baseMapper.deleteLogicById(id) > 0;
+    }
+
 
     private Boolean initTable(String tableName) {
         //建表
@@ -383,19 +389,23 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean importWbsTree(MultipartFile excelFile, WbsTree wbsTreeFu, WbsTree wbsTree1) throws IOException {
-        //赋值
+        //初始化赋值
         wbsTreeFu.setAncestors("0");
         wbsTree1.setProjectNodeId(wbsTree1.getId());
         File file = WbsExcelUtil.convert(excelFile);
         String canonicalPath = file.getCanonicalPath();
+
         try {
-            //解析
+            //解析excel
             WbsExcelUtil excelUtil = new WbsExcelUtil();
             ArrayList<Map<String, String>> result = excelUtil.readExcelToObj(canonicalPath);
+
+            //导入excel
             return importExcel(result, wbsTreeFu, wbsTree1);
         } catch (Exception e) {
-            throw new ServiceException("导入失败,请确认模板是否正确");
+            throw new ServiceException("导入失败,请确认模板格式内容是否正确");
         } finally {
+            //资源删除
             File file2 = new File(canonicalPath);
             if (file2.isFile() && file2.exists()) {
                 file2.delete();
@@ -405,11 +415,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
     private boolean importExcel(ArrayList<Map<String, String>> result, WbsTree wbsTreeFu, WbsTree wbsTree1) {
+        //解析list-map
         result.stream().forEach(map -> {
             map.forEach((nodeType, nodeName) -> {
-                WbsTree wbsTreeZi = new WbsTree();
                 if (StringUtils.isNotEmpty(nodeName)) {
-                    //初始化
+                    //初始化节点参数
+                    WbsTree wbsTreeZi = new WbsTree();
                     wbsTreeZi.setTenantId(AuthUtil.getTenantId());
                     wbsTreeZi.setDeptName(nodeName);
                     wbsTreeZi.setDeptCategory(Integer.valueOf(nodeType));
@@ -417,19 +428,22 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     wbsTreeZi.setParentId(wbsTreeFu.getParentId());
                     wbsTreeZi.setAncestors(wbsTreeFu.getAncestors());
                     wbsTreeZi.setProjectNodeId(wbsTree1.getProjectNodeId());
-                    //新增节点返回未创建成功查询出来的wbsTree对象、创建成功后的wbsTreeZi对象
+
+                    //新增节点返回未创建成功查询出来的wbsTree对象、成功后的wbsTreeZi对象
                     WbsTree wbsTree = importTree(wbsTreeZi);
-                    //后置初始化
+
                     if (wbsTree == null) {
+                        //后置赋值
                         Long id = wbsTreeZi.getId();
-                        //初始化ancestors
                         StringBuilder stringBuffer = new StringBuilder();
                         StringBuilder appendStr = stringBuffer.append(",").append(wbsTreeZi.getParentId());
                         String ancestors = wbsTreeZi.getAncestors() + appendStr;
-                        //修改ancestors
+
+                        //修改节点ancestors
                         updateData(ancestors, id);
                         wbsTreeFu.setParentId(id);
                         wbsTreeFu.setAncestors(ancestors);
+
                     } else {
                         wbsTreeFu.setParentId(wbsTree.getId());
                         wbsTreeFu.setAncestors(wbsTree.getAncestors());
@@ -438,21 +452,23 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             });
         });
 
-        //修改ProjectNodeId
+        //修改projectNodeId
         int i = baseMapper.updateById(wbsTree1);
         return i > 0;
     }
 
     private WbsTree importTree(WbsTree wbsTreeZi) {
+        //判断节点名称是否重复
         QueryWrapper<WbsTree> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("wbs_id", wbsTreeZi.getWbsId());
         queryWrapper.eq("dept_name", wbsTreeZi.getDeptName());
         queryWrapper.eq("dept_category", wbsTreeZi.getDeptCategory());
         queryWrapper.eq("project_node_id", wbsTreeZi.getProjectNodeId());
         queryWrapper.ne("ancestors", wbsTreeZi.getAncestors());
-        WbsTree wbsTrees = baseMapper.selectOne(queryWrapper);
-        if (wbsTrees == null) {
-            //初始化
+        List<WbsTree> wbsTrees = baseMapper.selectList(queryWrapper);
+        WbsTree wbsTree = null;
+
+        if (wbsTrees.size() <= 0) { //不重复-直接新增
             wbsTreeZi.setStatus(1);
             wbsTreeZi.setType(1);
             wbsTreeZi.setMajorDataType(0);
@@ -461,9 +477,27 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 wbsTreeZi.setIsExpernode(0);
             }
             baseMapper.insert(wbsTreeZi);
+
+        } else { //重复-判断是否同级,同级跳过,不同级新增
+
+            //获取当前相同节点对象信息
+            wbsTree = wbsTrees.stream().findFirst().orElse(wbsTrees.get(wbsTrees.size() - 1));
+
+            //只判断4 5 6级节点类型的名称是否重复,后续可根据实际情况更改控制的层级
+            if (wbsTreeZi.getDeptCategory() == 4 || wbsTreeZi.getDeptCategory() == 5 || wbsTreeZi.getDeptCategory() == 6) {
+                if (wbsTreeZi.getDeptName().equals(wbsTree.getDeptName()) && !wbsTreeZi.getParentId().equals(wbsTree.getParentId())) {
+                    wbsTreeZi.setStatus(1);
+                    wbsTreeZi.setType(1);
+                    wbsTreeZi.setMajorDataType(0);
+                    if (wbsTreeZi.getDeptCategory() == 6) {
+                        wbsTreeZi.setIsConcrete(0);
+                        wbsTreeZi.setIsExpernode(0);
+                    }
+                    baseMapper.insert(wbsTreeZi);
+                }
+            }
         }
-        //TODO 暂未处理重复条新增问题
-        return wbsTrees;
+        return wbsTree;
     }
 
     @Override
@@ -488,6 +522,17 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     @Override
     public List<SaveUserInfoByProjectVO2> findProjectAndContractList(Long userId) {
         List<SaveUserInfoByProjectVO2> list = baseMapper.selectListByUserId(userId);
+
+        //TODO 合并projectName返回
+        Map<String, List<SaveUserInfoByProjectVO2>> collect = list.stream().collect(Collectors.groupingBy(SaveUserInfoByProjectVO2::getProjectName));
+        List<Map> collect1 = collect.entrySet().stream().map(entity -> {
+            Map resultMap = new HashMap();
+            resultMap.put("projectName", entity.getKey());
+            resultMap.put("dataInfo", entity.getValue());
+            return resultMap;
+        }).collect(Collectors.toList());
+
+
         return list;
     }
 
@@ -502,7 +547,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         int number = 1;
         for (WbsTreeDTO2 wbsTree : wbsTreeList) {
             wbsTree.setSort(number);
-            //修改sort
             baseMapper.updateSortById(wbsTree.getId(), wbsTree.getSort());
             number++;
         }

+ 5 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -110,4 +110,9 @@ public class UserClient implements IUserClient {
         return service.updateUserRoleIdTwo(userId, roleId);
     }
 
+    @Override
+    public boolean updateUserRoleIdThree(List<String> userIds, String roleIds) {
+        return service.updateUserRoleIdThree(userIds, roleIds);
+    }
+
 }

+ 3 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -234,5 +234,8 @@ public interface IUserService extends BaseService<User> {
 
     boolean updateUserRoleIdTwo(String userId, String roleId);
 
+    boolean updateUserRoleIdThree(List<String> userIds, String roleIds);
+
     List<UserVO> selectUserListByCondition();
+
 }

+ 40 - 4
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -574,11 +574,11 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         User user = baseMapper.selectById(id);
         String roleId2 = user.getRoleId();
         boolean b = false;
-        if (roleId2.contains(roleId1)) {
+        if (roleId2 != null && roleId2.contains(roleId1)) {
             //存在
             b = false;
         } else {
-            if (StringUtils.isEmpty(roleId2)) {
+            if (StringUtils.isEmpty(roleId2) || ("").equals(roleId2)) {
                 //第一次新增
                 int row = baseMapper.updateRoleId(id, roleId1);
                 if (row > 0) {
@@ -614,8 +614,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     replace = user.getRoleId().replace("," + roleId, "");
                 }
                 /*
-                    如果当前用户不同合同段引用相同角色,还存在至少一个正在使用的项目合同段角色,那么就保留User对应的RoleId
-                    例如:一个用户项目合同1、合同2下都使用administrator角色,那么删除合同2的administrator角色,对应UserRoleId字段保留administrator角色
+                如果当前用户不同合同段引用相同角色,还存在至少一个正在使用的项目合同段角色,那么就保留User对应的RoleId
+                例如:一个用户项目合同1、合同2下都使用administrator角色,那么删除合同2的administrator角色,对应UserRoleId字段保留administrator角色
                 */
                 //查询当前项目不同合同段中删除的角色是否存在多条引用同种角色,RoleId相同
                 List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectClient.searchUserInfoAndProject(id, roleId);
@@ -633,6 +633,42 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         return false;
     }
 
+    @Override
+    public boolean updateUserRoleIdThree(List<String> userIds, String roleIds) {
+        //获取userList
+        List<User> userList = baseMapper.selectBatchIds(userIds);
+        userList.stream().forEach(user -> {
+            if ((user.getRoleId() != null) && (!user.getRoleId().equals(""))) {
+                if (user.getRoleId().contains(roleIds)) {
+                    String[] split = user.getRoleId().split(",");
+                    String replace = "";
+                    if (split[0].equals(roleIds)) {
+                        replace = user.getRoleId().replace(roleIds, "");
+                    } else {
+                        replace = user.getRoleId().replace("," + roleIds, "");
+                    }
+                        /*
+                        如果当前用户不同合同段引用相同角色,还存在至少一个正在使用的项目合同段角色,那么就保留User对应的RoleId
+                        例如:一个用户项目合同1、合同2下都使用administrator角色,那么删除合同2的administrator角色,对应UserRoleId字段保留administrator角色
+                        */
+                    //查询当前项目不同合同段中删除的角色是否存在多条引用同种角色,RoleId相同
+                    List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectClient.searchUserInfoAndProject(String.valueOf(user.getId()), roleIds);
+                    if (list.size() >= 2) {
+                        //不删除,还有合同段引用中
+                        return;
+                    } else {
+                        //删除
+                        int i = baseMapper.updateRoleIdByIdTwo(String.valueOf(user.getId()), replace);
+                        if (i > 0) {
+                            return;
+                        }
+                    }
+                }
+            }
+        });
+        return true;
+    }
+
     @Override
     public List<UserVO> selectUserListByCondition() {
         return baseMapper.selectUserListByCondition();