Browse Source

登陆相关

liuyc 2 years ago
parent
commit
6a7250b22c

+ 37 - 1
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -141,6 +141,16 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
             if (Func.isEmpty(userInfo.getRoles())) {
                 throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_ROLE);
             }
+
+            /*校验登陆账号权限,客户端登陆userType=1,app端登陆userType=2,后管与客户端登陆userType=3*/
+            if (user.getUserType().equals(1) || user.getUserType().equals(2) || user.getUserType().equals(3)) {
+                if (!user.getUserType().equals(3)) {
+                    this.judgeLoginPermission(user);
+                }
+            } else {
+                throw new UserDeniedAuthorizationException(TokenUtil.USER_ACCOUNT_NO_TYPE);
+            }
+
             // 多部门情况下指定单部门
             if (Func.isNotEmpty(headerDept) && user.getDeptId().contains(headerDept)) {
                 user.setDeptId(headerDept);
@@ -155,7 +165,7 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
             }
             // 成功则清除登录错误次数
             delFailCount(tenantId, username);
-            return new BladeUserDetails(user.getId(),user.getPhone(),
+            return new BladeUserDetails(user.getId(), user.getPhone(),
                     user.getTenantId(), StringPool.EMPTY, user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
                     username, AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(), true, true, true, true,
                     AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())));
@@ -214,5 +224,31 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
         return true;
     }
 
+    /**
+     * 校验登陆账号权限
+     *
+     * @param user user信息
+     */
+    private void judgeLoginPermission(User user) {
+        String clientId = TokenUtil.getClientIdFromHeader();
+        Integer result = 0;
+        if (clientId != null) {
+            switch (clientId) {
+                case "client":
+                    result = 1; //WEB=客户端
+                    break;
+                case "app":
+                    result = 2; //APP=APP端
+                    break;
+                case "saber":
+                    result = 3; //OTHER=后管
+                    break;
+            }
+        }
+        if (!result.equals(user.getUserType())) {
+            throw new UserDeniedAuthorizationException(TokenUtil.USER_ACCOUNT_NO_PERMISSION);
+        }
+    }
+
 
 }

+ 142 - 140
blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java

@@ -39,145 +39,147 @@ import java.util.Date;
  */
 public class TokenUtil {
 
-	public final static String AVATAR = TokenConstant.AVATAR;
-	public final static String ACCOUNT = TokenConstant.ACCOUNT;
-	public final static String USER_NAME = TokenConstant.USER_NAME;
-	public final static String NICK_NAME = TokenConstant.NICK_NAME;
-	public final static String REAL_NAME = TokenConstant.REAL_NAME;
-	public final static String USER_ID = TokenConstant.USER_ID;
-	public final static String DEPT_ID = TokenConstant.DEPT_ID;
-	public final static String POST_ID = TokenConstant.POST_ID;
-	public final static String ROLE_ID = TokenConstant.ROLE_ID;
-	public final static String ROLE_NAME = TokenConstant.ROLE_NAME;
-	public final static String TENANT_ID = TokenConstant.TENANT_ID;
-	public final static String OAUTH_ID = TokenConstant.OAUTH_ID;
-	public final static String CLIENT_ID = TokenConstant.CLIENT_ID;
-	public final static String DETAIL = TokenConstant.DETAIL;
-	public final static String LICENSE = TokenConstant.LICENSE;
-	public final static String LICENSE_NAME = TokenConstant.LICENSE_NAME;
-
-	public final static String DEPT_HEADER_KEY = "Dept-Id";
-	public final static String ROLE_HEADER_KEY = "Role-Id";
-	public final static String CAPTCHA_HEADER_KEY = "Captcha-Key";
-	public final static String CAPTCHA_HEADER_CODE = "Captcha-Code";
-	public final static String CAPTCHA_NOT_CORRECT = "验证码不正确";
-	public final static String TENANT_HEADER_KEY = "Tenant-Id";
-	public final static String TENANT_PARAM_KEY = "tenant_id";
-	public final static String DEFAULT_TENANT_ID = "000000";
-	public final static String TENANT_NOT_FOUND = "租户ID未找到";
-	public final static String USER_TYPE_HEADER_KEY = "User-Type";
-	public final static String DEFAULT_USER_TYPE = "web";
-	public final static String TOKEN_NOT_PERMISSION = "令牌授权已过期";
-	public final static String USER_NOT_FOUND = "用户名或密码错误";
-	public final static String USER_HAS_NO_ROLE = "未获得用户的角色信息";
-	public final static String USER_HAS_NO_TENANT = "未获得用户的租户信息";
-	public final static String USER_HAS_NO_TENANT_PERMISSION = "租户授权已过期,请联系管理员";
-	public final static String USER_HAS_TOO_MANY_FAILS = "登录错误次数过多,请稍后再试";
-	public final static String HEADER_KEY = "Authorization";
-	public final static String HEADER_PREFIX = "Basic ";
-	public final static String DEFAULT_AVATAR = "";
-	public final static String PASSWORD_KEY = "password";
-	public final static String GRANT_TYPE_KEY = "grant_type";
-	public final static String REFRESH_TOKEN_KEY = "refresh_token";
-	public final static String USER_STATUS_BAN = "该用户被封禁,请联系管理员";
-
-	private static BladeTenantProperties tenantProperties;
-
-	/**
-	 * 获取租户配置
-	 *
-	 * @return tenantProperties
-	 */
-	private static BladeTenantProperties getTenantProperties() {
-		if (tenantProperties == null) {
-			tenantProperties = SpringUtil.getBean(BladeTenantProperties.class);
-		}
-		return tenantProperties;
-	}
-
-	/**
-	 * 解码
-	 */
-	@SneakyThrows
-	public static String[] extractAndDecodeHeader() {
-		String header = WebUtil.getRequest().getHeader(TokenUtil.HEADER_KEY);
-		if (header == null || !header.startsWith(TokenUtil.HEADER_PREFIX)) {
-			throw new UnapprovedClientAuthenticationException("请求头中无client信息");
-		}
-
-		byte[] base64Token = header.substring(6).getBytes(Charsets.UTF_8_NAME);
-
-		byte[] decoded;
-		try {
-			decoded = Base64.getDecoder().decode(base64Token);
-		} catch (IllegalArgumentException var7) {
-			throw new BadCredentialsException("Failed to decode basic authentication token");
-		}
-
-		String token = new String(decoded, Charsets.UTF_8_NAME);
-		int index = token.indexOf(StringPool.COLON);
-		if (index == -1) {
-			throw new BadCredentialsException("Invalid basic authentication token");
-		} else {
-			return new String[]{token.substring(0, index), token.substring(index + 1)};
-		}
-	}
-
-	/**
-	 * 获取请求头中的客户端id
-	 */
-	public static String getClientIdFromHeader() {
-		String[] tokens = extractAndDecodeHeader();
-		return tokens[0];
-	}
-
-	/**
-	 * 获取token过期时间(次日凌晨3点)
-	 *
-	 * @return expire
-	 */
-	public static int getTokenValiditySecond() {
-		Calendar cal = Calendar.getInstance();
-		cal.add(Calendar.DAY_OF_YEAR, 1);
-		cal.set(Calendar.HOUR_OF_DAY, 3);
-		cal.set(Calendar.SECOND, 0);
-		cal.set(Calendar.MINUTE, 0);
-		cal.set(Calendar.MILLISECOND, 0);
-		return (int) (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
-	}
-
-	/**
-	 * 获取refreshToken过期时间
-	 *
-	 * @return expire
-	 */
-	public static int getRefreshTokenValiditySeconds() {
-		return 60 * 60 * 24 * 15;
-	}
-
-	/**
-	 * 判断租户权限
-	 *
-	 * @param tenant 租户信息
-	 * @return boolean
-	 */
-	public static boolean judgeTenant(Tenant tenant) {
-		if (tenant == null || tenant.getId() == null) {
-			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT);
-		}
-		if (StringUtil.equalsIgnoreCase(tenant.getTenantId(), BladeConstant.ADMIN_TENANT_ID)) {
-			return false;
-		}
-		Date expireTime = tenant.getExpireTime();
-		if (getTenantProperties().getLicense()) {
-			String licenseKey = tenant.getLicenseKey();
-			String decrypt = DesUtil.decryptFormHex(licenseKey, TenantConstant.DES_KEY);
-			expireTime = JsonUtil.parse(decrypt, Tenant.class).getExpireTime();
-		}
-		if (expireTime != null && expireTime.before(DateUtil.now())) {
-			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
-		}
-		return false;
-	}
+    public final static String AVATAR = TokenConstant.AVATAR;
+    public final static String ACCOUNT = TokenConstant.ACCOUNT;
+    public final static String USER_NAME = TokenConstant.USER_NAME;
+    public final static String NICK_NAME = TokenConstant.NICK_NAME;
+    public final static String REAL_NAME = TokenConstant.REAL_NAME;
+    public final static String USER_ID = TokenConstant.USER_ID;
+    public final static String DEPT_ID = TokenConstant.DEPT_ID;
+    public final static String POST_ID = TokenConstant.POST_ID;
+    public final static String ROLE_ID = TokenConstant.ROLE_ID;
+    public final static String ROLE_NAME = TokenConstant.ROLE_NAME;
+    public final static String TENANT_ID = TokenConstant.TENANT_ID;
+    public final static String OAUTH_ID = TokenConstant.OAUTH_ID;
+    public final static String CLIENT_ID = TokenConstant.CLIENT_ID;
+    public final static String DETAIL = TokenConstant.DETAIL;
+    public final static String LICENSE = TokenConstant.LICENSE;
+    public final static String LICENSE_NAME = TokenConstant.LICENSE_NAME;
+
+    public final static String DEPT_HEADER_KEY = "Dept-Id";
+    public final static String ROLE_HEADER_KEY = "Role-Id";
+    public final static String CAPTCHA_HEADER_KEY = "Captcha-Key";
+    public final static String CAPTCHA_HEADER_CODE = "Captcha-Code";
+    public final static String CAPTCHA_NOT_CORRECT = "验证码不正确";
+    public final static String TENANT_HEADER_KEY = "Tenant-Id";
+    public final static String TENANT_PARAM_KEY = "tenant_id";
+    public final static String DEFAULT_TENANT_ID = "000000";
+    public final static String TENANT_NOT_FOUND = "租户ID未找到";
+    public final static String USER_TYPE_HEADER_KEY = "User-Type";
+    public final static String DEFAULT_USER_TYPE = "web";
+    public final static String TOKEN_NOT_PERMISSION = "令牌授权已过期";
+    public final static String USER_NOT_FOUND = "用户名或密码错误";
+    public final static String USER_HAS_NO_ROLE = "未获得用户的角色信息";
+    public final static String USER_HAS_NO_TENANT = "未获得用户的租户信息";
+    public final static String USER_HAS_NO_TENANT_PERMISSION = "租户授权已过期,请联系管理员";
+    public final static String USER_HAS_TOO_MANY_FAILS = "登录错误次数过多,请稍后再试";
+    public final static String HEADER_KEY = "Authorization";
+    public final static String HEADER_PREFIX = "Basic ";
+    public final static String DEFAULT_AVATAR = "";
+    public final static String PASSWORD_KEY = "password";
+    public final static String GRANT_TYPE_KEY = "grant_type";
+    public final static String REFRESH_TOKEN_KEY = "refresh_token";
+    public final static String USER_STATUS_BAN = "该用户账号被封禁,请联系管理员";
+    public final static String USER_ACCOUNT_NO_PERMISSION = "该用户账号没有对应权限,请联系管理员";
+    public final static String USER_ACCOUNT_NO_TYPE = "该账号的用户类型分配异常,请联系管理员";
+
+    private static BladeTenantProperties tenantProperties;
+
+    /**
+     * 获取租户配置
+     *
+     * @return tenantProperties
+     */
+    private static BladeTenantProperties getTenantProperties() {
+        if (tenantProperties == null) {
+            tenantProperties = SpringUtil.getBean(BladeTenantProperties.class);
+        }
+        return tenantProperties;
+    }
+
+    /**
+     * 解码
+     */
+    @SneakyThrows
+    public static String[] extractAndDecodeHeader() {
+        String header = WebUtil.getRequest().getHeader(TokenUtil.HEADER_KEY);
+        if (header == null || !header.startsWith(TokenUtil.HEADER_PREFIX)) {
+            throw new UnapprovedClientAuthenticationException("请求头中无client信息");
+        }
+
+        byte[] base64Token = header.substring(6).getBytes(Charsets.UTF_8_NAME);
+
+        byte[] decoded;
+        try {
+            decoded = Base64.getDecoder().decode(base64Token);
+        } catch (IllegalArgumentException var7) {
+            throw new BadCredentialsException("Failed to decode basic authentication token");
+        }
+
+        String token = new String(decoded, Charsets.UTF_8_NAME);
+        int index = token.indexOf(StringPool.COLON);
+        if (index == -1) {
+            throw new BadCredentialsException("Invalid basic authentication token");
+        } else {
+            return new String[]{token.substring(0, index), token.substring(index + 1)};
+        }
+    }
+
+    /**
+     * 获取请求头中的客户端id
+     */
+    public static String getClientIdFromHeader() {
+        String[] tokens = extractAndDecodeHeader();
+        return tokens[0];
+    }
+
+    /**
+     * 获取token过期时间(次日凌晨3点)
+     *
+     * @return expire
+     */
+    public static int getTokenValiditySecond() {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.DAY_OF_YEAR, 1);
+        cal.set(Calendar.HOUR_OF_DAY, 3);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return (int) (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
+    }
+
+    /**
+     * 获取refreshToken过期时间
+     *
+     * @return expire
+     */
+    public static int getRefreshTokenValiditySeconds() {
+        return 60 * 60 * 24 * 15;
+    }
+
+    /**
+     * 判断租户权限
+     *
+     * @param tenant 租户信息
+     * @return boolean
+     */
+    public static boolean judgeTenant(Tenant tenant) {
+        if (tenant == null || tenant.getId() == null) {
+            throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT);
+        }
+        if (StringUtil.equalsIgnoreCase(tenant.getTenantId(), BladeConstant.ADMIN_TENANT_ID)) {
+            return false;
+        }
+        Date expireTime = tenant.getExpireTime();
+        if (getTenantProperties().getLicense()) {
+            String licenseKey = tenant.getLicenseKey();
+            String decrypt = DesUtil.decryptFormHex(licenseKey, TenantConstant.DES_KEY);
+            expireTime = JsonUtil.parse(decrypt, Tenant.class).getExpireTime();
+        }
+        if (expireTime != null && expireTime.before(DateUtil.now())) {
+            throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
+        }
+        return false;
+    }
 
 }

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

@@ -17,168 +17,6 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 public class WbsExcelUtil {
-    /*public static void main(String[] args) throws IOException {
-        WbsExcelUtil excelUtil = new WbsExcelUtil();
-        //读取excel数据
-        ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract("C:\\Users\\泓创开发\\Desktop\\合同段工程节点导入.xlsx");
-        ArrayList<Map<String, String>> resultNow = excelUtil.getDataListByType(result, 1);
-        List<Map<Integer, String>> resultList = new ArrayList<>();
-
-        int isSplicingNumber = 1;
-
-        //构造map
-        String str = "\\s*|\r|\n|\t";
-        for (Map<String, String> map : resultNow) {
-            Map<Integer, String> maps = new HashMap<>();
-            map.forEach((k1, value1) -> {
-                String v1 = value1.replaceAll(str, "");
-                map.forEach((k2, value2) -> {
-                    String v2 = value2.replaceAll(str, "");
-                    *//*if ("1".equals(k1) && "2".equals(k2)) {
-                        maps.put(1, v1 + ":::" + v2);
-                    } else if ("3".equals(k1) && "4".equals(k2)) {
-                        String s1 = "";
-                        if (number == 1) {
-                            if (StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(1);
-                                if (StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s1 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(2, v1 + ":::" + s1 + v2);
-
-                    } else if ("5".equals(k1) && "6".equals(k2)) {
-                        String s2 = "";
-                        if (number == 1) {
-                            if (StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(2);
-                                if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(1);
-                                }
-                                if (StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s2 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(3, v1 + ":::" + s2 + v2);
-
-                    } else if ("7".equals(k1) && "8".equals(k2)) {
-                        String s3 = "";
-                        if (number == 1) {
-                            if (StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(3);
-                                if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(2);
-                                    if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(1);
-                                    }
-                                }
-                                if (StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s3 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(4, v1 + ":::" + s3 + v2);
-
-                    } else if ("9".equals(k1) && "10".equals(k2)) {
-                        String s4 = "";
-                        if (StringUtils.isNotEmpty(v2)) {
-                            String s = maps.get(4);
-                            if (number == 1) {
-                                if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(3);
-                                    if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(2);
-                                    }
-                                    if (StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(1);
-                                    }
-                                }
-                                if (StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s4 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(5, v1 + ":::" + s4 + v2);
-                    }*//*
-
-                    if ("1".equals(k1) && "2".equals(k2)) {
-                        maps.put(1, v1 + ":::" + v2);
-                    } else if ("3".equals(k1) && "4".equals(k2)) {
-                        String s1 = "";
-                        if (isSplicingNumber == 1) {
-                            if (org.apache.commons.lang.StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(1);
-                                if (org.apache.commons.lang.StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s1 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(2, v1 + ":::" + s1 + v2);
-
-                    } else if ("5".equals(k1) && "6".equals(k2)) {
-                        String s2 = "";
-                        if (isSplicingNumber == 1) {
-                            if (org.apache.commons.lang.StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(2);
-                                if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(1);
-                                }
-                                if (org.apache.commons.lang.StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s2 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(3, v1 + ":::" + s2 + v2);
-
-                    } else if ("7".equals(k1) && "8".equals(k2)) {
-                        String s3 = "";
-                        if (isSplicingNumber == 1) {
-                            if (org.apache.commons.lang.StringUtils.isNotEmpty(v2)) {
-                                String s = maps.get(3);
-                                if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(2);
-                                    if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(1);
-                                    }
-                                }
-                                if (org.apache.commons.lang.StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s3 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(4, v1 + ":::" + s3 + v2);
-
-                    } else if ("9".equals(k1) && "10".equals(k2)) {
-                        String s4 = "";
-                        if (org.apache.commons.lang.StringUtils.isNotEmpty(v2)) {
-                            String s = maps.get(4);
-                            if (isSplicingNumber == 1) {
-                                if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                    s = maps.get(3);
-                                    if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(2);
-                                    }
-                                    if (org.apache.commons.lang.StringUtils.isEmpty(s.replaceAll(":::", ""))) {
-                                        s = maps.get(1);
-                                    }
-                                }
-                                if (org.apache.commons.lang.StringUtils.isNotEmpty(s.replaceAll(":::", ""))) {
-                                    s4 = s.split(":::")[1] + "-";
-                                }
-                            }
-                        }
-                        maps.put(5, v1 + ":::" + s4 + v2);
-                    }
-                });
-
-            });
-            resultList.add(maps);
-        }
-        resultList.forEach(System.out::println);
-    }*/
-
 
     /**
      * 读取excel数据

+ 4 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -610,7 +610,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                     updateWrapper.set(WbsTreeContract::getImportMatchingInfo, wbsTreeContractVO2.getImportMatchingInfo());
                                     baseMapper.update(null, updateWrapper);
                                     successData.add(wbsTreeContractVO2);
-                                    //nodeOld.getFullName()重新赋值用于下方条件判断
+                                    //重新赋值用于下方条件判断
                                     nodeOld.setFullName(wbsTreeContractVO2.getFullName());
                                     count = 1;
                                     break;
@@ -670,17 +670,15 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         try {
             //重复导入时删除多余节点信息
             List<WbsTreeContract> wbsTreeContractDel = baseMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()));
-            List<WbsTreeContract> collect = wbsTreeContractDel.stream().filter(f -> f.getNodeName().contains(("_copy_copy")) && f.getId().equals(f.getPKeyId())).collect(Collectors.toList());
-            List<Long> delIds = collect.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+            List<Long> delIds = wbsTreeContractDel.stream().filter(f -> f.getNodeName().contains(("_copy_copy")) && f.getId().equals(f.getPKeyId())).collect(Collectors.toList())
+                    .stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
             baseMapper.deleteByIds(delIds);
 
             //构建成功树
             List<WbsTreeContractVO> collect1 = successData.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
-                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new))
-                    .stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
-
+                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new));
             List<WbsTreeContractVO> successWbsTreeContractVOS = this.buildWbsTreeByStream(collect1, wbsTreeContractRoot.getParentId());
             List<WbsTreeContractVO> collect2 = successWbsTreeContractVOS.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
             res.setMatchedData(collect2);