Преглед изворни кода

Merge remote-tracking branch 'origin/master' into master

yangyj пре 3 година
родитељ
комит
3e2b9a344b
79 измењених фајлова са 2542 додато и 1176 уклоњено
  1. 162 153
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 1 0
      blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
  3. 4 0
      blade-ops-api/blade-resource-api/pom.xml
  4. 2 3
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IOSSClient.java
  5. 1 13
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/OssClient.java
  6. 31 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsFormElementDTO2.java
  7. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsInfoDTO.java
  8. 19 4
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeContractDTO.java
  9. 38 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeDTO2.java
  10. 25 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreePrivateDTO2.java
  11. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelTab.java
  12. 101 95
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java
  13. 65 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SaveUserInfoByProject.java
  14. 10 12
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsInfo.java
  15. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  16. 26 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java
  17. 48 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO2.java
  18. 50 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SaveUserInfoByProjectVO.java
  19. 12 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java
  20. 52 42
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java
  21. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO2.java
  22. 8 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java
  23. 6 0
      blade-service-api/blade-user-api/pom.xml
  24. 7 8
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/UserDTO.java
  25. 60 56
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
  26. 6 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  27. 50 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  28. 46 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  29. 33 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  30. 23 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java
  31. 15 24
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsInfoController.java
  32. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  33. 41 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  34. 9 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java
  35. 6 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsTreeExcel.java
  36. 51 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java
  37. 2 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  38. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java
  39. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  40. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.java
  41. 11 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml
  42. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.java
  43. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml
  44. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsInfoMapper.java
  45. 13 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsInfoMapper.xml
  46. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  47. 33 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  48. 12 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java
  49. 62 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  50. 21 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  51. 102 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  52. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  53. 7 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java
  54. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java
  55. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsInfoService.java
  56. 9 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  57. 12 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  58. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java
  59. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  60. 46 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java
  61. 21 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  62. 53 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsInfoServiceImpl.java
  63. 20 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  64. 86 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  65. 97 48
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  66. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java
  67. 104 91
      blade-service/blade-system/src/main/java/org/springblade/system/controller/PostController.java
  68. 9 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java
  69. 51 1
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml
  70. 8 7
      blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java
  71. 3 2
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java
  72. 31 29
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PostServiceImpl.java
  73. 5 0
      blade-service/blade-user/pom.xml
  74. 284 262
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  75. 10 5
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  76. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  77. 191 170
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  78. 91 9
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
  79. 3 3
      doc/nacos/blade-dev.yaml

+ 162 - 153
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -54,159 +54,168 @@ import java.util.List;
 @AllArgsConstructor
 public class BladeUserDetailsServiceImpl implements UserDetailsService {
 
-	public static final Integer FAIL_COUNT = 5;
-	public static final String FAIL_COUNT_VALUE = "account.failCount";
-
-	private final IUserClient userClient;
-	private final ISysClient sysClient;
-
-	private final BladeRedis bladeRedis;
-	private final JwtProperties jwtProperties;
-
-	@Override
-	@SneakyThrows
-	public BladeUserDetails loadUserByUsername(String username) {
-		HttpServletRequest request = WebUtil.getRequest();
-		// 获取用户绑定ID
-		String headerDept = request.getHeader(TokenUtil.DEPT_HEADER_KEY);
-		String headerRole = request.getHeader(TokenUtil.ROLE_HEADER_KEY);
-		// 获取租户ID
-		String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
-		String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
-		String password = request.getParameter(TokenUtil.PASSWORD_KEY);
-		String grantType = request.getParameter(TokenUtil.GRANT_TYPE_KEY);
-		// 判断租户请求头
-		if (StringUtil.isAllBlank(headerTenant, paramTenant)) {
-			throw new UserDeniedAuthorizationException(TokenUtil.TENANT_NOT_FOUND);
-		}
-		// 判断令牌合法性
-		if (!judgeRefreshToken(grantType, request)) {
-			throw new UserDeniedAuthorizationException(TokenUtil.TOKEN_NOT_PERMISSION);
-		}
-
-		// 指定租户ID
-		String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
-		// 判断登录是否锁定
-		int count = getFailCount(tenantId, username);
-		int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
-		if (count >= failCount) {
-			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
-		}
-
-		// 获取租户信息
-		R<Tenant> tenant = sysClient.getTenant(tenantId);
-		if (tenant.isSuccess()) {
-			if (TokenUtil.judgeTenant(tenant.getData())) {
-				throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
-			}
-		} else {
-			throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT);
-		}
-
-		// 获取用户类型
-		String userType = Func.toStr(request.getHeader(TokenUtil.USER_TYPE_HEADER_KEY), TokenUtil.DEFAULT_USER_TYPE);
-
-		// 远程调用返回数据
-		R<UserInfo> result;
-		// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
-		if (userType.equals(UserEnum.WEB.getName())) {
-			result = userClient.userInfo(tenantId, username, UserEnum.WEB.getName());
-		} else if (userType.equals(UserEnum.APP.getName())) {
-			result = userClient.userInfo(tenantId, username, UserEnum.APP.getName());
-		} else {
-			result = userClient.userInfo(tenantId, username, UserEnum.OTHER.getName());
-		}
-
-		// 判断返回信息
-		if (result.isSuccess()) {
-			UserInfo userInfo = result.getData();
-			User user = userInfo.getUser();
-			// 用户不存在,但提示用户名与密码错误并锁定账号
-			if (user == null || user.getId() == null) {
-				setFailCount(tenantId, username, count);
-				throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
-			}
-			// 用户存在但密码错误,超过次数则锁定账号
-			if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(DigestUtil.hex(password))) {
-				setFailCount(tenantId, username, count);
-				throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
-			}
-			// 用户角色不存在
-			if (Func.isEmpty(userInfo.getRoles())) {
-				throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_ROLE);
-			}
-			// 多部门情况下指定单部门
-			if (Func.isNotEmpty(headerDept) && user.getDeptId().contains(headerDept)) {
-				user.setDeptId(headerDept);
-			}
-			// 多角色情况下指定单角色
-			if (Func.isNotEmpty(headerRole) && user.getRoleId().contains(headerRole)) {
-				R<List<String>> roleResult = sysClient.getRoleAliases(headerRole);
-				if (roleResult.isSuccess()) {
-					userInfo.setRoles(roleResult.getData());
-				}
-				user.setRoleId(headerRole);
-			}
-			// 成功则清除登录错误次数
-			delFailCount(tenantId, username);
-			return new BladeUserDetails(user.getId(),
-				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())));
-		} else {
-			throw new UsernameNotFoundException(result.getMsg());
-		}
-	}
-
-	/**
-	 * 获取账号错误次数
-	 *
-	 * @param tenantId 租户id
-	 * @param username 账号
-	 * @return int
-	 */
-	private int getFailCount(String tenantId, String username) {
-		return Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username)), 0);
-	}
-
-	/**
-	 * 设置账号错误次数
-	 *
-	 * @param tenantId 租户id
-	 * @param username 账号
-	 * @param count    次数
-	 */
-	private void setFailCount(String tenantId, String username, int count) {
-		bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(30));
-	}
-
-	/**
-	 * 清空账号错误次数
-	 *
-	 * @param tenantId 租户id
-	 * @param username 账号
-	 */
-	private void delFailCount(String tenantId, String username) {
-		bladeRedis.del(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username));
-	}
-
-	/**
-	 * 校验refreshToken合法性
-	 *
-	 * @param grantType 认证类型
-	 * @param request   请求
-	 */
-	private boolean judgeRefreshToken(String grantType, HttpServletRequest request) {
-		if (jwtProperties.getState() && jwtProperties.getSingle() && StringUtil.equals(grantType, TokenUtil.REFRESH_TOKEN_KEY)) {
-			String refreshToken = request.getParameter(TokenUtil.REFRESH_TOKEN_KEY);
-			Claims claims = JwtUtil.parseJWT(refreshToken);
-			String tenantId = String.valueOf(claims.get("tenant_id"));
-			String userId = String.valueOf(claims.get("user_id"));
-			String token = JwtUtil.getRefreshToken(tenantId, userId, refreshToken);
-			return StringUtil.equalsIgnoreCase(token, refreshToken);
-		}
-		return true;
-	}
+    public static final Integer FAIL_COUNT = 5;
+    public static final String FAIL_COUNT_VALUE = "account.failCount";
+
+    private final IUserClient userClient;
+    private final ISysClient sysClient;
+
+    private final BladeRedis bladeRedis;
+    private final JwtProperties jwtProperties;
+
+    @Override
+    @SneakyThrows
+    public BladeUserDetails loadUserByUsername(String username) {
+        HttpServletRequest request = WebUtil.getRequest();
+        // 获取用户绑定ID
+        String headerDept = request.getHeader(TokenUtil.DEPT_HEADER_KEY);
+        String headerRole = request.getHeader(TokenUtil.ROLE_HEADER_KEY);
+        // 获取租户ID
+        String headerTenant = request.getHeader(TokenUtil.TENANT_HEADER_KEY);
+        String paramTenant = request.getParameter(TokenUtil.TENANT_PARAM_KEY);
+        String password = request.getParameter(TokenUtil.PASSWORD_KEY);
+        String grantType = request.getParameter(TokenUtil.GRANT_TYPE_KEY);
+        // 判断租户请求头
+        if (StringUtil.isAllBlank(headerTenant, paramTenant)) {
+            throw new UserDeniedAuthorizationException(TokenUtil.TENANT_NOT_FOUND);
+        }
+        // 判断令牌合法性
+        if (!judgeRefreshToken(grantType, request)) {
+            throw new UserDeniedAuthorizationException(TokenUtil.TOKEN_NOT_PERMISSION);
+        }
+
+        // 指定租户ID
+        String tenantId = StringUtils.isBlank(headerTenant) ? paramTenant : headerTenant;
+        // 判断登录是否锁定
+        int count = getFailCount(tenantId, username);
+        int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
+        if (count >= failCount) {
+            throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
+        }
+
+        // 获取租户信息
+        R<Tenant> tenant = sysClient.getTenant(tenantId);
+        if (tenant.isSuccess()) {
+            if (TokenUtil.judgeTenant(tenant.getData())) {
+                throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
+            }
+        } else {
+            throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_TENANT);
+        }
+
+        // 获取用户类型
+        String userType = Func.toStr(request.getHeader(TokenUtil.USER_TYPE_HEADER_KEY), TokenUtil.DEFAULT_USER_TYPE);
+
+        // 远程调用返回数据
+        R<UserInfo> result;
+        // 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
+        if (userType.equals(UserEnum.WEB.getName())) {
+            result = userClient.userInfo(tenantId, username, UserEnum.WEB.getName());
+        } else if (userType.equals(UserEnum.APP.getName())) {
+            result = userClient.userInfo(tenantId, username, UserEnum.APP.getName());
+        } else {
+            result = userClient.userInfo(tenantId, username, UserEnum.OTHER.getName());
+        }
+
+        // 判断返回信息
+        if (result.isSuccess()) {
+            UserInfo userInfo = result.getData();
+            User user = userInfo.getUser();
+            // 用户不存在,但提示用户名与密码错误并锁定账号
+            if (user == null || user.getId() == null) {
+                setFailCount(tenantId, username, count);
+                throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
+            }
+            /**
+             *	用户存在但为封禁状态status=0,禁止登陆
+             *  @since 2022-06-08
+             *  @author liuyc
+             */
+            if (user.getStatus() == 0) {
+                throw new UserDeniedAuthorizationException(TokenUtil.USER_STATUS_BAN);
+            }
+
+            // 用户存在但密码错误,超过次数则锁定账号
+            if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(DigestUtil.hex(password))) {
+                setFailCount(tenantId, username, count);
+                throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
+            }
+            // 用户角色不存在
+            if (Func.isEmpty(userInfo.getRoles())) {
+                throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_ROLE);
+            }
+            // 多部门情况下指定单部门
+            if (Func.isNotEmpty(headerDept) && user.getDeptId().contains(headerDept)) {
+                user.setDeptId(headerDept);
+            }
+            // 多角色情况下指定单角色
+            if (Func.isNotEmpty(headerRole) && user.getRoleId().contains(headerRole)) {
+                R<List<String>> roleResult = sysClient.getRoleAliases(headerRole);
+                if (roleResult.isSuccess()) {
+                    userInfo.setRoles(roleResult.getData());
+                }
+                user.setRoleId(headerRole);
+            }
+            // 成功则清除登录错误次数
+            delFailCount(tenantId, username);
+            return new BladeUserDetails(user.getId(),
+                    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())));
+        } else {
+            throw new UsernameNotFoundException(result.getMsg());
+        }
+    }
+
+    /**
+     * 获取账号错误次数
+     *
+     * @param tenantId 租户id
+     * @param username 账号
+     * @return int
+     */
+    private int getFailCount(String tenantId, String username) {
+        return Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username)), 0);
+    }
+
+    /**
+     * 设置账号错误次数
+     *
+     * @param tenantId 租户id
+     * @param username 账号
+     * @param count    次数
+     */
+    private void setFailCount(String tenantId, String username, int count) {
+        bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username), count + 1, Duration.ofMinutes(30));
+    }
+
+    /**
+     * 清空账号错误次数
+     *
+     * @param tenantId 租户id
+     * @param username 账号
+     */
+    private void delFailCount(String tenantId, String username) {
+        bladeRedis.del(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username));
+    }
+
+    /**
+     * 校验refreshToken合法性
+     *
+     * @param grantType 认证类型
+     * @param request   请求
+     */
+    private boolean judgeRefreshToken(String grantType, HttpServletRequest request) {
+        if (jwtProperties.getState() && jwtProperties.getSingle() && StringUtil.equals(grantType, TokenUtil.REFRESH_TOKEN_KEY)) {
+            String refreshToken = request.getParameter(TokenUtil.REFRESH_TOKEN_KEY);
+            Claims claims = JwtUtil.parseJWT(refreshToken);
+            String tenantId = String.valueOf(claims.get("tenant_id"));
+            String userId = String.valueOf(claims.get("user_id"));
+            String token = JwtUtil.getRefreshToken(tenantId, userId, refreshToken);
+            return StringUtil.equalsIgnoreCase(token, refreshToken);
+        }
+        return true;
+    }
 
 
 }

+ 1 - 0
blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java

@@ -79,6 +79,7 @@ public class TokenUtil {
 	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;
 

+ 4 - 0
blade-ops-api/blade-resource-api/pom.xml

@@ -23,6 +23,10 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-tenant</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-oss</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 2 - 3
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IOSSClient.java

@@ -17,12 +17,11 @@
 package org.springblade.resource.feign;
 
 import org.springblade.core.launch.constant.AppConstant;
-import org.springblade.core.sms.model.SmsResponse;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -45,6 +44,6 @@ public interface IOSSClient {
 	 * @return R
 	 */
 	@PostMapping(value = SEND_MESSAGE ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-	R addFileInfo(@RequestPart MultipartFile file);
+	R<BladeFile> addFileInfo(@RequestPart MultipartFile file);
 
 }

+ 1 - 13
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/OssClient.java

@@ -18,25 +18,13 @@ package org.springblade.resource.feign;
 
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
-import org.springblade.core.oss.AliossTemplate;
 import org.springblade.core.oss.model.BladeFile;
-import org.springblade.core.sms.model.SmsCode;
-import org.springblade.core.sms.model.SmsData;
-import org.springblade.core.sms.model.SmsResponse;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.jackson.JsonUtil;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.resource.builder.oss.OssBuilder;
-import org.springblade.resource.builder.sms.SmsBuilder;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Map;
-
-import static org.springblade.resource.utils.SmsUtil.*;
-
 /**
  * 短信远程调用服务
  *
@@ -55,7 +43,7 @@ public class OssClient implements IOSSClient {
 
 	@SneakyThrows
 	@Override
-	public R addFileInfo(MultipartFile file) {
+	public R<BladeFile> addFileInfo(MultipartFile file) {
 		BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream());
 		/*BladeFile bladeFile1 = aliossTemplate.putFile(file.getOriginalFilename(), file.getInputStream());
 		System.out.println(aliossTemplate.getUploadToken());*/

+ 31 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsFormElementDTO2.java

@@ -0,0 +1,31 @@
+package org.springblade.manager.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WbsFormElementDTO2 implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * wbs表单节点id
+     */
+    @JsonProperty(value = "id")
+    private String id;
+
+    /**
+     * wbs表单名
+     */
+    @JsonProperty(value = "deptName")
+    private String deptName;
+
+    /**
+     * wbs表单sort
+     */
+    @JsonProperty(value = "sort")
+    private Integer sort;
+
+}

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsInfoDTO.java

@@ -42,7 +42,7 @@ public class WbsInfoDTO extends WbsInfo {
 	/**
 	 * wsb属性
 	 */
-	@ApiModelProperty(value = "wbs类型")
+	@ApiModelProperty(value = "wbs划分类型")
 	private Integer wbsType;
 
 	/**

+ 19 - 4
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeContractDTO.java

@@ -31,10 +31,25 @@ public class WbsTreeContractDTO extends WbsTreeContract {
     private String wbsTreeIds;
 
     /**
-     * 引用其他项目私有WBS库的ID
+     * 引用类型
      */
-    @JsonProperty(value = "templateProjectId")
-    @ApiModelProperty(name = "templateProjectId", value = "如果引用的是其他WBS私有库,那么必传该引用的私有库的项目id", required = false)
-    private String templateProjectId;
+    @JsonProperty(value = "referenceType")
+    @ApiModelProperty(name = "referenceType", value = "引用类型 : public / private ", required = true)
+    private String referenceType;
+
+    /**
+     * 引用私有库项目id
+     */
+    @JsonProperty(value = "referencePrivateWbsProjectId")
+    @ApiModelProperty(name = "referencePrivateWbsProjectId", value = "引用的私有库项目id", required = true)
+    private String referencePrivateWbsProjectId;
+
+    /**
+     * 私有库的根节点primaryKeyId
+     */
+    @JsonProperty(value = "primaryKeyId")
+    @ApiModelProperty(name = "primaryKeyId", value = "私有库的根节点primaryKeyId", required = true)
+    private String primaryKeyId;
+
 
 }

+ 38 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreeDTO2.java

@@ -0,0 +1,38 @@
+package org.springblade.manager.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * wbs节点排序dto
+ *
+ * @author liuyc
+ * @since 2022-06-08
+ */
+@Data
+public class WbsTreeDTO2 implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * wbs节点树id
+     */
+    @JsonProperty(value = "id")
+    private String id;
+
+    /**
+     * 节点名
+     */
+    @JsonProperty(value = "deptName")
+    private String deptName;
+
+    /**
+     * wbs节点sort
+     */
+    @JsonProperty(value = "sort")
+    private Integer sort;
+
+
+}

+ 25 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/WbsTreePrivateDTO2.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WbsTreePrivateDTO2 implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * p_key_id 主键id
+     */
+    private Long pKeyId;
+
+    /**
+     * 节点名称
+     */
+    private String deptName;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+}

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelTab.java

@@ -80,6 +80,14 @@ public class ExcelTab extends BaseEntity {
 	*/
 	@ApiModelProperty(value = "附件名")
 		private String extension;
+
+	/**
+	 * html路径
+	 */
+	@ApiModelProperty(value = "html路径")
+	private String htmlUrl;
+
+
 	/**
 	* 附件大小
 	*/

+ 101 - 95
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -38,101 +38,107 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class ProjectInfo extends BaseEntity {
 
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-	/**
-	 * 项目名称
-	 */
-	@ApiModelProperty(value = "项目名称")
-	private String projectName;
-	/**
-	 * 项目别名
-	 */
-	@ApiModelProperty(value = "项目别名")
-	private String projectAlias;
-	/**
-	 * 项目编号
-	 */
-	@ApiModelProperty(value = "项目编号")
-	private String projectNumber;
-	/**
-	 * 项目大概
-	 */
-	@ApiModelProperty(value = "项目大概")
-	private String projectGist;
-	/**
-	 * 工程等级
-	 */
-	@ApiModelProperty(value = "工程等级")
-	private String projectGrade;
-	/**
-	 * 计划开始时间
-	 */
-	@ApiModelProperty(value = "计划开始时间")
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
-	private LocalDateTime planStartTime;
-	/**
-	 * 计划完成时间
-	 */
-	@ApiModelProperty(value = "计划完成时间")
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
-	private LocalDateTime planEndTime;
-	/**
-	 * 实际开始时间
-	 */
-	@ApiModelProperty(value = "实际开始时间")
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
-	private LocalDateTime actualStartTime;
-	/**
-	 * 实际完工时间
-	 */
-	@ApiModelProperty(value = "实际完工时间")
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
-	private LocalDateTime actualEndTime;
-	/**
-	 * 施工期
-	 */
-	@ApiModelProperty(value = "施工期")
-	private Integer construcetionDate;
-	/**
-	 * 建设合同金额
-	 */
-	@ApiModelProperty(value = "建设合同金额")
-	private BigDecimal estimatedAmount;
-	/**
-	 * 项目总里程
-	 */
-	@ApiModelProperty(value = "项目总里程")
-	private BigDecimal projectAllMileage;
-	/**
-	 * 项目路面
-	 */
-	@ApiModelProperty(value = "项目路面")
-	private BigDecimal projectPavement;
-	/**
-	 * 项目路基
-	 */
-	@ApiModelProperty(value = "项目路基")
-	private BigDecimal projectSubgrade;
-	/**
-	 * 项目备注
-	 */
-	@ApiModelProperty(value = "项目备注")
-	private String projectRemark;
-	/**
-	 * 节点状态
-	 */
-	@ApiModelProperty(value = "节点状态")
-	private Integer state;
-	/**
-	 * 是否开启电签
-	 */
-	@ApiModelProperty(value = "是否开启电签")
-	private Integer isOpenSign;
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+    /**
+     * 项目别名
+     */
+    @ApiModelProperty(value = "项目别名")
+    private String projectAlias;
+    /**
+     * 项目编号
+     */
+    @ApiModelProperty(value = "项目编号")
+    private String projectNumber;
+    /**
+     * 项目大概
+     */
+    @ApiModelProperty(value = "项目大概")
+    private String projectGist;
+    /**
+     * 工程等级
+     */
+    @ApiModelProperty(value = "工程等级")
+    private String projectGrade;
+    /**
+     * 计划开始时间
+     */
+    @ApiModelProperty(value = "计划开始时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime planStartTime;
+    /**
+     * 计划完成时间
+     */
+    @ApiModelProperty(value = "计划完成时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime planEndTime;
+    /**
+     * 实际开始时间
+     */
+    @ApiModelProperty(value = "实际开始时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actualStartTime;
+    /**
+     * 实际完工时间
+     */
+    @ApiModelProperty(value = "实际完工时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actualEndTime;
+    /**
+     * 施工期
+     */
+    @ApiModelProperty(value = "施工期")
+    private Integer construcetionDate;
+    /**
+     * 建设合同金额
+     */
+    @ApiModelProperty(value = "建设合同金额")
+    private BigDecimal estimatedAmount;
+    /**
+     * 项目总里程
+     */
+    @ApiModelProperty(value = "项目总里程")
+    private BigDecimal projectAllMileage;
+    /**
+     * 项目路面
+     */
+    @ApiModelProperty(value = "项目路面")
+    private BigDecimal projectPavement;
+    /**
+     * 项目路基
+     */
+    @ApiModelProperty(value = "项目路基")
+    private BigDecimal projectSubgrade;
+    /**
+     * 项目备注
+     */
+    @ApiModelProperty(value = "项目备注")
+    private String projectRemark;
+    /**
+     * 节点状态
+     */
+    @ApiModelProperty(value = "节点状态")
+    private Integer state;
+    /**
+     * 是否开启电签
+     */
+    @ApiModelProperty(value = "是否开启电签")
+    private Integer isOpenSign;
 
-	/**
-	 * wbs私有树引用wbs模板id
-	 */
-	@ApiModelProperty(value = "wbs私有树引用wbs模板id")
-	private Long referenceWbsTemplateId;
+    /**
+     * wbs私有树引用wbs模板id
+     */
+    @ApiModelProperty(value = "wbs私有树引用wbs模板id")
+    private Long referenceWbsTemplateId;
+
+    /**
+     * wbs私有树引用wbs模板类型
+     */
+    @ApiModelProperty(value = "wbs私有树引用wbs模板类型")
+    private String referenceWbsTemplateType;
 }

+ 65 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SaveUserInfoByProject.java

@@ -0,0 +1,65 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.io.Serializable;
+
+/**
+ * 项目合同人员分配传输对象实体类
+ *
+ * @author liuyc
+ * @since 2022-05-09
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("m_project_assignment_user")
+public class SaveUserInfoByProject extends BaseEntity{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 项目id
+     */
+    @JsonProperty(value = "projectId")
+    @ApiModelProperty(value = "projectId",required = true)
+    private String projectId;
+
+    /**
+     * 合同id
+     */
+    @JsonProperty(value = "contractId")
+    @ApiModelProperty(value = "contractId",required = true)
+    private String contractId;
+
+    /**
+     * 角色id
+     */
+    @JsonProperty(value = "roleId")
+    @ApiModelProperty(value = "roleId",required = true)
+    private String roleId;
+
+    /**
+     * 岗位id
+     */
+    @JsonProperty(value = "postId")
+    @ApiModelProperty(value = "postId",required = true)
+    private String postId;
+
+    /**
+     * 用户id
+     */
+    @JsonProperty(value = "userId")
+    @ApiModelProperty(value = "userId",required = true)
+    private String userId;
+
+
+
+
+
+}

+ 10 - 12
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsInfo.java

@@ -32,18 +32,16 @@ import org.springblade.core.mp.base.BaseEntity;
 @EqualsAndHashCode(callSuper = true)
 public class WbsInfo extends BaseEntity {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	* wsb名称
-	*/
-		private String wbsName;
-	/**
-	* wsb属性
-	*/
-
-		private Integer wbsType;
-
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * wsb名称
+     */
+    private String wbsName;
+    /**
+     * wsb属性
+     */
+    private Integer wbsType;
 
 
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -39,6 +39,12 @@ public class WbsTreePrivate extends BaseEntity {
      */
     @ApiModelProperty(value = "wbs库id")
     private String wbsId;
+    /**
+     * wbsType
+     */
+    @ApiModelProperty(value = "wbs库Type")
+    private String wbsType;
+
     /**
      * 租户id
      */

+ 26 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java

@@ -1,15 +1,21 @@
 package org.springblade.manager.feign;
 
+
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
-@FeignClient(value = APPLICATION_NAME_PREFIX +  "manager")
+@FeignClient(value = APPLICATION_NAME_PREFIX + "manager")
 public interface ContractClient {
 
     /**
@@ -19,10 +25,29 @@ public interface ContractClient {
 
     /**
      * 根据项目ID获取合同段
+     *
      * @param ids ID集合
      * @return 结果集
      */
     @GetMapping(API_PREFIX + "/queryContractListByIds")
     List<ContractInfo> queryContractListByIds(@RequestParam List<Long> ids);
 
+
+    /**
+     * 项目分配用户批量保存-项目合同分配人员
+     */
+    @PostMapping(API_PREFIX + "/saveUserInfoByProjectTow")
+    @Transactional(rollbackFor = Exception.class)
+    R saveUserInfoByProjectTow(@RequestBody List<SaveUserInfoByProjectDTO> list);
+
+
+
+    /**
+     * 项目分配用户批量保存-项目合同分配人员
+     */
+    @PostMapping(API_PREFIX + "/saveUserInfoByProjectThree")
+    @Transactional(rollbackFor = Exception.class)
+    R saveUserInfoByProjectThree(@RequestBody List<SaveUserInfoByProjectDTO> list);
+
+
 }

+ 48 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ProjectInfoVO2.java

@@ -0,0 +1,48 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.entity.ProjectInfo;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 客户级项目表视图实体类
+ *
+ * @author liuyc
+ * @since 2022-04-13
+ */
+@Data
+public class ProjectInfoVO2 implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * projectInfo
+	 */
+	private ProjectInfo projectInfo;
+
+	/**
+	 * 引用的wbsType
+	 */
+	private Integer wbsType;
+
+
+}

+ 50 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SaveUserInfoByProjectVO.java

@@ -0,0 +1,50 @@
+package org.springblade.manager.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.io.Serializable;
+
+/**
+ * 项目合同人员分配视图层
+ *
+ * @author liuyc
+ * @since 2022-06-07
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SaveUserInfoByProjectVO extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 项目id
+     */
+    @JsonProperty(value = "projectName")
+    private String projectName;
+
+    /**
+     * 合同id
+     */
+    @JsonProperty(value = "contractName")
+    private String contractName;
+
+    /**
+     * 岗位名字
+     */
+    @JsonProperty(value = "postName")
+    private String postName;
+
+    /**
+     * 岗位类型
+     */
+    @JsonProperty(value = "postType")
+    private String postType;
+
+
+}

+ 12 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java

@@ -2,6 +2,7 @@ package org.springblade.manager.vo;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.models.auth.In;
 import org.springblade.core.tool.node.BaseNode;
 import org.springblade.core.tool.node.TreeNode;
 
@@ -27,9 +28,19 @@ public class TreeNodeVO extends BaseNode<TreeNode> {
 
     private Integer wbsType;
 
+    private Integer deptCategory;
+
     public TreeNodeVO() {
     }
 
+    public Integer getDeptCategory() {
+        return deptCategory;
+    }
+
+    public void setDeptCategory(Integer deptCategory) {
+        this.deptCategory = deptCategory;
+    }
+
     public Integer getWbsType() {
         return wbsType;
     }
@@ -79,7 +90,7 @@ public class TreeNodeVO extends BaseNode<TreeNode> {
     }
 
     public String toString() {
-        return "TreeNode(wbsType=" + this.getWbsType() + ", primaryKeyId=" + this.getPrimaryKeyId() + ", type=" + this.getType() + ", title=" + this.getTitle() + ", key=" + this.getKey() + ", value=" + this.getValue() + ")";
+        return "TreeNode(deptCategory=" + this.getDeptCategory() + ",wbsType=" + this.getWbsType() + ", primaryKeyId=" + this.getPrimaryKeyId() + ", type=" + this.getType() + ", title=" + this.getTitle() + ", key=" + this.getKey() + ", value=" + this.getValue() + ")";
     }
 
     public boolean equals(final Object o) {

+ 52 - 42
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java

@@ -14,47 +14,57 @@ import java.io.Serializable;
 @Data
 public class WbsNodeTableVO implements Serializable {
 
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * id
-	 */
-	private String id;
-
-	/**
-	 * 表单名称
-	 */
-	private String tableName;
-
-	/**
-	 * 表单类型
-	 */
-	private String tableType;
-
-	/**
-	 * 元素总数
-	 */
-	private Integer elementTotal;
-
-	/**
-	 * 是否创建表
-	 */
-	private Boolean isCreateTable = true;
-
-	/**
-	 * 所属方
-	 */
-	private String tableOwner;
-
-	/**
-	 *是否关联清表 '1'否 '2'是
-	 */
-	@ApiModelProperty(value = "是否关联清表 '1'否 '2'是")
-	private Integer isLinkTable;
-
-	/**
-	 * 初始化实体表名
-	 */
-	private String initTableName;
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * pKeyId 主键id
+     */
+    private Long pKeyId;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * 表单名称
+     */
+    private String tableName;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 表单类型
+     */
+    private String tableType;
+
+    /**
+     * 元素总数
+     */
+    private Integer elementTotal;
+
+    /**
+     * 是否创建表
+     */
+    private Boolean isCreateTable = true;
+
+    /**
+     * 所属方
+     */
+    private String tableOwner;
+
+    /**
+     * 是否关联清表 '1'否 '2'是
+     */
+    @ApiModelProperty(value = "是否关联清表 '1'否 '2'是")
+    private Integer isLinkTable;
+
+    /**
+     * 初始化实体表名
+     */
+    private String initTableName;
 
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateVO2.java

@@ -17,6 +17,10 @@ public class WbsTreePrivateVO2 implements Serializable {
      * wbsId
      */
     private String wbsId;
+    /**
+     * wbsType
+     */
+    private String wbsType;
     /**
      * 项目id
      */

+ 8 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java

@@ -146,6 +146,14 @@ public class Menu implements Serializable {
 	@ApiModelProperty(value = "提示语")
 	private String textInfo;
 
+	/**
+	 * 提示视频路径
+	 */
+	@ApiModelProperty(value = "提示视频路径")
+	private String videoUrl;
+
+
+
 
 	@Override
 	public boolean equals(Object obj) {

+ 6 - 0
blade-service-api/blade-user-api/pom.xml

@@ -19,6 +19,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-cache</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-manager-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 7 - 8
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/UserDTO.java

@@ -3,21 +3,20 @@ package org.springblade.system.user.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.system.user.entity.User;
 
+import java.util.List;
+
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class UserDTO extends User {
     private static final long serialVersionUID = 1L;
 
     /**
-     * 项目id
-     */
-    @ApiModelProperty(name = "项目id",value = "项目id")
-    private String projectId;
-    /**
-     * 合同id
+     * 用户关联项目List
      */
-    @ApiModelProperty(name = "合同id",value = "合同id")
-    private String contractId;
+    @ApiModelProperty(value = "用户关联项目List")
+    private List<SaveUserInfoByProjectDTO> projectAndUserList;
+
 }

+ 60 - 56
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java

@@ -35,62 +35,66 @@ public class User extends TenantEntity {
 
 	private static final long serialVersionUID = 1L;
 
-	/**
-	 * 用户编号
-	 */
-	private String code;
-	/**
-	 * 用户平台
-	 */
-	private Integer userType;
-	/**
-	 * 账号
-	 */
-	private String account;
-	/**
-	 * 密码
-	 */
-	private String password;
-	/**
-	 * 昵称
-	 */
-	private String name;
-	/**
-	 * 真名
-	 */
-	private String realName;
-	/**
-	 * 头像
-	 */
-	private String avatar;
-	/**
-	 * 邮箱
-	 */
-	private String email;
-	/**
-	 * 手机
-	 */
-	private String phone;
-	/**
-	 * 生日
-	 */
-	private Date birthday;
-	/**
-	 * 性别
-	 */
-	private Integer sex;
-	/**
-	 * 角色id
-	 */
-	private String roleId;
-	/**
-	 * 部门id
-	 */
-	private String deptId;
-	/**
-	 * 岗位id
-	 */
-	private String postId;
+    /**
+     * 用户编号
+     */
+    private String code;
+    /**
+     * 用户平台
+     */
+    private Integer userType;
+    /**
+     * 账号
+     */
+    private String account;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 昵称
+     */
+    private String name;
+    /**
+     * 真名
+     */
+    private String realName;
+    /**
+     * 身份证号
+     */
+    private String idNumber;
+    /**
+     * 头像
+     */
+    private String avatar;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 手机
+     */
+    private String phone;
+    /**
+     * 生日
+     */
+    private Date birthday;
+    /**
+     * 性别
+     */
+    private Integer sex;
+    /**
+     * 角色id
+     */
+    private String roleId;
+    /**
+     * 部门id
+     */
+    private String deptId;
+    /**
+     * 岗位id
+     */
+    private String postId;
 
 
 }

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

@@ -50,6 +50,7 @@ public interface IUserClient {
 	String SAVE_USER = API_PREFIX + "/save-user";
 	String REMOVE_USER = API_PREFIX + "/remove-user";
 	String RESET_USER = API_PREFIX + "/reset-password";
+	String USER_STATUS = API_PREFIX + "/user-status";
 
 	/**
 	 * 获取用户信息
@@ -125,5 +126,10 @@ public interface IUserClient {
 	@PostMapping(RESET_USER)
 	R resetPassword(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds);
 
+	/**
+	 * 获取用户状态
+	 */
+	@GetMapping(USER_STATUS)
+	User getUserStatus(@ApiParam(value = "userName", required = true) @RequestParam String userName);
 
 }

+ 50 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -18,6 +18,7 @@ package org.springblade.manager.controller;
 
 import com.alibaba.nacos.common.utils.MD5Utils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -25,14 +26,17 @@ import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
 import org.apache.commons.lang.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
+import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springblade.manager.vo.CRolePostVO;
@@ -40,6 +44,7 @@ import org.springblade.manager.vo.WbsTreeContractTreeVO;
 import org.springblade.manager.vo.WbsTreeVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -70,6 +75,7 @@ public class ContractInfoController extends BladeController {
     private final SaveUserInfoByProjectService saveUserInfoByProject;
     private final IUserClient iUserClient;
     private final IWbsTreeContractService wbsTreeContractService;
+    private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
 
     /**
      * 详情
@@ -83,7 +89,7 @@ public class ContractInfoController extends BladeController {
     }
 
     /**
-     * 根据项目名称查询当前所有合同
+     * 根据项目id查询当前所有合同
      */
     @GetMapping("/findContractInfoByPid")
     @ApiOperationSupport(order = 8)
@@ -184,24 +190,19 @@ public class ContractInfoController extends BladeController {
                                                 @RequestParam("id") String id) {
         List<CRolePostVO> list = contractInfoService.findJobByRoleId(id);
         if (list.size() <= 0) {
-            return R.fail("未查询到信息");
+            return R.data(list, "未查询到信息");
         }
         return R.data(list);
     }
 
     /**
-     * 根据项目id、合同id、角色id、岗位id查询当前分配的用户
+     * 根据项目id、合同id、岗位id查询当前分配的用户
      */
     @PostMapping("/findAllUserByCondition")
     @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "查询当前项目合同角色岗位下的用户", notes = "传入项目id、合同id、角色id、岗位id")
+    @ApiOperation(value = "查询当前项目合同岗位下的用户", notes = "传入项目id、合同id、岗位id")
     public R<List<User>> findAllUserByCondition(@RequestBody FindAllUserByConditionDTO values) {
         List<User> users = contractInfoService.findAllUserByCondition(values);
-        //密码明文解码
-        /*for (User user : users) {
-            String password = user.getPassword();
-            DigestUtils.md5DigestAsHex(password.getBytes());
-        }*/
         if (users.size() > 0) {
             return R.data(users);
         }
@@ -212,7 +213,7 @@ public class ContractInfoController extends BladeController {
      * 根据项目id、合同id、角色id查询当前运维的用户
      */
     @PostMapping("/findUserListByCondition")
-    @ApiOperationSupport(order = 9)
+    @ApiOperationSupport(order = 10)
     @ApiOperation(value = "查询当前项目角色下的运维用户列表", notes = "传入项目id、角色id、合同id(非必传)")
     public R<List<User>> findUserListByCondition(@RequestBody FindAllUserByConditionDTO values) {
         List<User> users = contractInfoService.findUserListByCondition(values);
@@ -227,7 +228,7 @@ public class ContractInfoController extends BladeController {
      * 根据姓名查询用户
      */
     @GetMapping("/findUserByName")
-    @ApiOperationSupport(order = 14)
+    @ApiOperationSupport(order = 11)
     @ApiOperation(value = "根据姓名模糊查询用户", notes = "传入用户姓名")
     public R<List<User>> findUserByName(@RequestParam("name") String name) {
         List<User> userByName = contractInfoService.findUserByName(name);
@@ -239,15 +240,44 @@ public class ContractInfoController extends BladeController {
 
 
     /**
-     * 项目分配用户批量保存
+     * 项目分配用户批量保存-项目分配维护人员
      */
     @PostMapping("/saveUserInfoByProject")
-    @ApiOperationSupport(order = 11)
+    @ApiOperationSupport(order = 12)
     @ApiOperation(value = "保存当前用户与合同段关联信息", notes = "传入项目id、合同id、角色id、岗位id、用户id List集合")
     public R saveUserInfoByProject(@RequestBody List<SaveUserInfoByProjectDTO> list) {
-//        list.stream().forEach(System.out::print);
+        //list.stream().forEach(System.out::print);
+        if (list.size() > 0) {
+            boolean result = saveUserInfoByProject.saveBatch(list);
+            if (result) {
+                return R.success("保存成功");
+            }
+        }
+        return R.fail("保存失败");
+    }
+
+    /**
+     * 项目分配用户批量保存-项目合同分配人员
+     */
+    @PostMapping("/saveUserInfoByProjectTow")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "保存-项目合同分配人员", notes = "传入项目id、合同id、岗位id、用户id")
+    @Transactional(rollbackFor = Exception.class)
+    public R saveUserInfoByProjectTow(@RequestBody List<SaveUserInfoByProjectDTO> list) {
         if (list.size() > 0) {
-            Boolean result = saveUserInfoByProject.saveBatch(list);
+            //判重
+            list.forEach((lists) -> {
+                Long row = saveUserInfoByProjectMapper.selectCount(
+                        Wrappers.<SaveUserInfoByProjectDTO>query().lambda().
+                                eq(SaveUserInfoByProjectDTO::getProjectId, lists.getProjectId()).
+                                eq(SaveUserInfoByProjectDTO::getContractId, lists.getContractId()).
+                                eq(SaveUserInfoByProjectDTO::getPostId, lists.getPostId()).
+                                eq(SaveUserInfoByProjectDTO::getUserId, lists.getUserId()));
+                if (row > 0L) {
+                    throw new ServiceException(StringUtil.format("当前用户岗位已存在,请重新选择"));
+                }
+            });
+            boolean result = saveUserInfoByProject.saveBatch(list);
             if (result) {
                 return R.success("保存成功");
             }
@@ -255,11 +285,12 @@ public class ContractInfoController extends BladeController {
         return R.fail("保存失败");
     }
 
+
     /**
      * 项目分配用户逻辑删除
      */
     @PostMapping("/removeUsersByIds")
-    @ApiOperationSupport(order = 12)
+    @ApiOperationSupport(order = 14)
     @ApiOperation(value = "逻辑删除", notes = "传入当前列表用户的记录ids")
     public R removeUsersByIds(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
         return R.status(saveUserInfoByProject.deleteLogic(Func.toLongList(ids)));
@@ -269,7 +300,7 @@ public class ContractInfoController extends BladeController {
      * 重置密码
      */
     @PostMapping("/resetPasswordByUserId")
-    @ApiOperationSupport(order = 13)
+    @ApiOperationSupport(order = 15)
     @ApiOperation(value = "重置密码", notes = "传入当前用户的userId,默认重置密码123456")
     public R updatePasswordByUserId(@ApiParam(value = "用户userId", required = true) @RequestParam String userId) {
         if (StringUtils.isNotEmpty(userId)) {
@@ -283,7 +314,7 @@ public class ContractInfoController extends BladeController {
      * 分配合同段wbs节点树保存或者修改
      */
     @PostMapping("/submitWbsTreeInContract")
-    @ApiOperationSupport(order = 13)
+    @ApiOperationSupport(order = 16)
     @ApiOperation(value = "分配合同段wbs节点树保存或修改", notes = "传入ids,wbsId,项目id,合同段id")
     public R submitWbsTreeInContract(@RequestBody WbsTreeContractDTO wbsTreeContractDTO) {
         String s = wbsTreeContractService.submitWbsTreeInContract(wbsTreeContractDTO);
@@ -304,7 +335,7 @@ public class ContractInfoController extends BladeController {
      * 查询合同段私有Wbs节点树形结构
      */
     @GetMapping("/tree")
-    @ApiOperationSupport(order = 14)
+    @ApiOperationSupport(order = 17)
     @ApiOperation(value = "查询合同段私有Wbs节点树形结构", notes = "传入wbsId,项目id,合同段id")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),

+ 46 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -16,6 +16,9 @@
  */
 package org.springblade.manager.controller;
 
+import com.alibaba.fastjson.JSONObject;
+import com.spire.xls.Workbook;
+import com.spire.xls.Worksheet;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
@@ -26,6 +29,7 @@ import lombok.SneakyThrows;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
@@ -172,17 +176,10 @@ public class ExcelTabController extends BladeController {
 
 		ExcelTab detail = excelTabService.getById(nodeId);
 		// 删除excel文件
-		//R bladeFile = iossClient.addFileInfo(file);
-
-		R bladeFile = iossClient.addFileInfo(file);
-
-		System.out.println(bladeFile);
-
-		/*detail.setExtension(bladeFile.getOriginalName());
-		detail.setFileUrl(bladeFile.getLink());
-		detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
-		excelTabService.saveOrUpdate(detail);
+		R<BladeFile> bladeFile = iossClient.addFileInfo(file);
+		BladeFile bladeFile1 = bladeFile.getData();
 
+		System.out.println(bladeFile1.getLink());
 		String thmlUrl = "/Users/hongchuangyanfa/Desktop/ToHtml.html";
 		// 解析excel
 		Workbook wb = new Workbook();
@@ -193,6 +190,16 @@ public class ExcelTabController extends BladeController {
 		Worksheet sheet = wb.getWorksheets().get(0);
 		sheet.saveToHtml(thmlUrl);
 
+		detail.setExtension(bladeFile1.getOriginalName());
+		detail.setFileUrl(bladeFile1.getLink());
+		detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
+		detail.setHtmlUrl(thmlUrl);
+
+		excelTabService.saveOrUpdate(detail);
+
+
+
+/*
 		//解析数据
 		Thread.sleep(200);
 		String htmlString =  readfile(thmlUrl);
@@ -334,4 +341,33 @@ public class ExcelTabController extends BladeController {
 		int e = val.indexOf(end);
 		return val.substring(s, e);
 	}
+
+
+	/**
+	 * 关联清表树
+	 */
+	@GetMapping("/tab-lazytree-all")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "关联清表树all", notes = "关联清表树all")
+	public R<List<ExceTabTreVO>> tabLazyTreeall(Long modeId,String name, BladeUser bladeUser) {
+		List<ExceTabTreVO> tree = excelTabService.tabLazyTreeAll( bladeUser.getTenantId(), modeId, name);
+		return R.data(tree);
+	}
+
+
+	/**
+	 * 关联清表-保存
+	 */
+	@GetMapping("/save-linkTab")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "关联清表-保存", notes = "关联清表-保存")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "exceTabId", value = "清表id", required = true),
+			@ApiImplicitParam(name = "tabId", value = "表Id", required = true)
+	})
+	public R<List<ExceTabTreVO>> saveLinkeTab(Long exceTabId,Long tabId, BladeUser bladeUser) {
+
+		return R.success("关联成功");
+	}
+
 }

+ 33 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java

@@ -27,6 +27,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.dto.ProjectInfoDTO;
 import org.springblade.manager.service.IWbsTreePrivateService;
@@ -62,13 +63,33 @@ public class ProjectInfoController extends BladeController {
      */
     @GetMapping("/detail")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "详情", notes = "传入projectInfo")
+    @ApiOperation(value = "详情", notes = "传入projectInfoId")
     @ApiImplicitParam(value = "id", name = "id", required = true)
     public R<ProjectInfoVO> detail(ProjectInfo projectInfo) {
-        ProjectInfo detail = projectInfoService.getOne(Condition.getQueryWrapper(projectInfo));
+        ProjectInfo detail = projectInfoService.getOne(projectInfo.getId());
         return R.data(ProjectInfoWrapper.build().entityVO(detail));
     }
 
+
+    /**
+     * 详情
+     */
+    @GetMapping("/detail2")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "详情2", notes = "传入projectInfoId、ReferenceWbsTemplateId、ReferenceWbsTemplateType")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "id", name = "id", required = true),
+            @ApiImplicitParam(value = "ReferenceWbsTemplateId", name = "ReferenceWbsTemplateId", required = true),
+            @ApiImplicitParam(value = "ReferenceWbsTemplateType", name = "ReferenceWbsTemplateType", required = true)
+    })
+    public R<ProjectInfoVO2> detail2(ProjectInfo projectInfo) {
+        ProjectInfoVO2 detail = projectInfoService.getOneByCondition(projectInfo.getId(),
+                projectInfo.getReferenceWbsTemplateId(),
+                projectInfo.getReferenceWbsTemplateType());
+        return R.data(detail);
+    }
+
+
     /**
      * 分页 客户级项目表
      */
@@ -215,5 +236,14 @@ public class ProjectInfoController extends BladeController {
 
     }
 
-
+    /**
+     * 根据用户id查询项目合同岗位列表信息(用于展示在用户编辑、详情中)
+     */
+    @GetMapping("/findProjectAndContractList")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "根据用户id查询项目合同岗位列表信息", notes = "传入用户id")
+    public R<List<SaveUserInfoByProjectVO>> findProjectAndContractList(Long userId) {
+        List<SaveUserInfoByProjectVO> result = wbsTreeService.findProjectAndContractList(userId);
+        return R.data(result);
+    }
 }

+ 23 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java

@@ -28,6 +28,8 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.WbsFormElementDTO;
+import org.springblade.manager.dto.WbsFormElementDTO2;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.excel.WbsFormElementExcel;
@@ -142,5 +144,26 @@ public class WbsFormElementController extends BladeController {
         return R.data(list, "操作成功");
     }
 
+    /**
+     * 查询当前节点下所有表单
+     */
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "查询当前节点下所有表单", notes = "传入该节点id")
+    @RequestMapping(value = "/findWbsTreeTableSameLevel", method = RequestMethod.GET)
+    public R<List<WbsFormElementDTO2>> findWbsTreeTableSameLevel(@RequestParam("id") String id) {
+        List<WbsFormElementDTO2> trees = wbsFormElementService.findWbsTreeTableSameLevel(id);
+        return R.data(trees);
+    }
+
+    /**
+     * wbs树节点手动排序
+     */
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "wbs树节点手动排序", notes = "WbsFormElementDTO2集合,id=表单id")
+    @RequestMapping(value = "/wbsTreeTableSort", method = RequestMethod.POST)
+    public R wbsTreeTableSort(@RequestBody List<WbsFormElementDTO2> wbsTreeDTO) {
+        boolean b = wbsFormElementService.wbsTreeTableSort(wbsTreeDTO);
+        return R.status(b);
+    }
 
 }

+ 15 - 24
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsInfoController.java

@@ -64,9 +64,9 @@ public class WbsInfoController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "详情", notes = "传入id")
     @ApiImplicitParam(name = "id", value = "id", required = true)
-    public R<WbsInfoVO> detail(WbsInfoDTO wbsInfo) {
-        WbsInfo detail = wbsInfoService.getOne(Condition.getQueryWrapper(wbsInfo));
-        return R.data(WbsInfoWrapper.build().entityVO(detail));
+    public R<WbsInfo> detail(WbsInfoDTO wbsInfo) {
+        WbsInfo detail = wbsInfoService.findById(wbsInfo.getId());
+        return R.data(detail);
     }
 
     /**
@@ -118,34 +118,21 @@ public class WbsInfoController extends BladeController {
     }
 
     /**
-     * 新增wbs动态库信息
+     * 新增或者修改wbs动态库信息
      */
     @PostMapping("/submit")
     @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "新增", notes = "传入wbsInfo")
+    @ApiOperation(value = "新增或修改", notes = "传入wbsInfo")
     @ApiImplicitParam(value = "id", name = "id", required = true)
     @Transactional(rollbackFor = Exception.class)
     public R submit(@Valid @RequestBody WbsInfoDTO wbsInfo) {
-        boolean result1 = wbsInfoService.saveOrUpdate(wbsInfo);
-        if (result1) {
-            Long wbsId = wbsInfo.getId();
-            String nodeName = wbsInfo.getWbsName();
-            //初始化wbs动态库树的根节点
-            WbsTree wbsTree = new WbsTree();
-            wbsTree.setWbsId(String.valueOf(wbsId));
-            wbsTree.setTenantId(AuthUtil.getTenantId());
-            wbsTree.setParentId(0L);
-            wbsTree.setAncestors("0");
-            wbsTree.setDeptCategory(1);
-            wbsTree.setDeptName(nodeName);
-            wbsTree.setFullName(nodeName);
-            wbsTree.setType(1);
-            boolean result2 = wbsTreeService.save(wbsTree);
-            if (result2) {
-                return R.data(wbsInfo, "操作成功");
-            }
+        boolean b = wbsInfoService.submit(wbsInfo);
+        if (b) {
+            return R.success("成功");
         }
-        return R.fail("操作失败");
+        return R.fail("失败");
+
+
     }
 
 
@@ -156,6 +143,10 @@ public class WbsInfoController extends BladeController {
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        List<WbsTree> list = wbsTreeService.findByWbsTreeNode(ids);
+        if (list.size() > 0) {
+            return R.fail("请先删除Wbs树下的节点");
+        }
         return R.status(wbsInfoService.deleteLogic(Func.toLongList(ids)));
     }
 

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

@@ -34,6 +34,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsTreeDTO;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.excel.WbsExcelUtil;
@@ -296,6 +297,29 @@ public class WbsTreeController extends BladeController {
         }
     }
 
+    /**
+     * 查询当前节点所有同级节点
+     */
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "查询当前节点所有同级节点", notes = "传入该节点parentId")
+    @RequestMapping(value = "/findWbsTreeSameLevel", method = RequestMethod.GET)
+    public R<List<WbsTreeDTO2>> findWbsTreeSameLevel(@RequestParam("parentId") String parentId) {
+        List<WbsTreeDTO2> trees = wbsTreeService.findWbsTreeSameLevel(parentId);
+        return R.data(trees);
+    }
+
+    /**
+     * wbs树节点手动排序
+     */
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "wbs树节点手动排序", notes = "WbsTreeDTO2集合,id=节点id,sort=节点顺序")
+    @RequestMapping(value = "/wbsTreeSort", method = RequestMethod.POST)
+    public R wbsTreeSort(@RequestBody List<WbsTreeDTO2> wbsTreeDTO) {
+        boolean b = wbsTreeService.wbsTreeSort(wbsTreeDTO);
+        return R.status(b);
+    }
+
+
 }
 
 

+ 41 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -13,6 +13,8 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.WbsTreeDTO2;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.IWbsTreePrivateService;
@@ -40,7 +42,7 @@ public class WbsTreePrivateController extends BladeController {
     private final IWbsTreePrivateService wbsTreePrivateService;
 
     /**
-     * wbs私有库新增节点接口
+     * wbs私有库新增节点接口 同步合同段wbs库
      */
     @PostMapping("/submit")
     @ApiOperationSupport(order = 1)
@@ -49,8 +51,7 @@ public class WbsTreePrivateController extends BladeController {
         if (wbsTreePrivateService.submit(wbsTreePrivate)) {
             CacheUtil.clear(SYS_CACHE);
             // 返回懒加载树更新节点所需字段
-            Kv kv = Kv.create().set("id", String.valueOf(wbsTreePrivate.getId())).set("tenantId", wbsTreePrivate.getTenantId())
-                    .set("deptCategoryName", DictCache.getValue(DictEnum.ORG_CATEGORY, wbsTreePrivate.getDeptCategory()));
+            Kv kv = Kv.create().set("id", String.valueOf(wbsTreePrivate.getId()));
             return R.data(kv);
         }
         return R.fail("操作失败");
@@ -128,4 +129,41 @@ public class WbsTreePrivateController extends BladeController {
     }
 
 
+    /**
+     * 查询当前节点所有同级节点
+     */
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "查询当前节点所有同级节点", notes = "传入项目id、当前节点parentId")
+    @RequestMapping(value = "/findWbsTreePrivateSameLevel", method = RequestMethod.GET)
+    public R<List<WbsTreePrivateDTO2>> findWbsTreePrivateSameLevel(@RequestParam("projectId") String projectId,
+                                                                   @RequestParam("parentId") String parentId,
+                                                                   @RequestParam("wbsId") String wbsId) {
+        List<WbsTreePrivateDTO2> trees = wbsTreePrivateService.findWbsTreePrivateSameLevel(projectId, parentId, wbsId);
+        return R.data(trees);
+    }
+
+    /**
+     * wbs树节点手动排序
+     */
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "wbs私有树节点手动排序", notes = "WbsTreeDTO2集合,pKeyId=节点pKeyId")
+    @RequestMapping(value = "/wbsTreePrivateSort", method = RequestMethod.POST)
+    public R wbsTreePrivateSort(@RequestBody List<WbsTreePrivateDTO2> wbsTreeDTO) {
+        boolean b = wbsTreePrivateService.wbsTreePrivateSort(wbsTreeDTO);
+        return R.status(b);
+    }
+
+
+    /**
+     * wbs树节点下表单手动排序
+     */
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "wbs私有树表单手动排序", notes = "WbsTreeDTO2集合,pKeyId=表单pKeyId")
+    @RequestMapping(value = "/wbsTreePrivateTableSort", method = RequestMethod.POST)
+    public R wbsTreePrivateTableSort(@RequestBody List<WbsTreePrivateDTO2> wbsTreeDTO) {
+        boolean b = wbsTreePrivateService.wbsTreePrivateTableSort(wbsTreeDTO);
+        return R.status(b);
+    }
+
+
 }

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

@@ -14,14 +14,14 @@ import java.io.*;
 import java.util.*;
 
 public class WbsExcelUtil {
-//    public static void main(String[] args) throws IOException {
-//        WbsExcelUtil excelUtil = new WbsExcelUtil();
-//        //读取excel数据
-//        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("D:\\Download\\WBS划分模板1.xls");
-//        for (Map<String, String> map : result) {
-//            System.out.println("输出:" + map);
-//        }
-//    }
+    public static void main(String[] args) throws IOException {
+        WbsExcelUtil excelUtil = new WbsExcelUtil();
+        //读取excel数据
+        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("D:\\Download\\WBS划分模板1.xls");
+        for (Map<String, String> map : result) {
+            System.out.println("输出:" + map);
+        }
+    }
 
     /**
      * 读取excel数据
@@ -38,7 +38,7 @@ public class WbsExcelUtil {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             wb.close();
         }
         return result;

+ 6 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsTreeExcel.java

@@ -23,36 +23,35 @@ import java.io.Serializable;
 public class WbsTreeExcel implements Serializable {
     private static final long serialVersionUID = 1L;
     /**
-     * wbs库id
+     * 单位工程
      */
     @ExcelProperty(value = "单位工程")
     private String deptCategory1;
     /**
-     * 租户id
+     * 分部工程
      */
     @ExcelProperty(value = "分部工程")
     private String deptCategory2;
 
     /**
-     * 父主键
+     * 子分部工程
      */
     @ExcelProperty(value = "子分部工程")
     private String deptCategory3;
 
     /**
-     * '1'节点 '2'表单
+     * 分项工程
      */
     @ExcelProperty(value = "分项工程")
-    @ExcelIgnore
     private String deptCategory4;
 
     /**
-     * 部门名
+     * 子分项工程
      */
     @ExcelProperty(value = "子分项工程")
     private String deptCategory5;
     /**
-     * 部门全称
+     * 工序
      */
     @ExcelProperty(value = "工序")
     private String deptCategory6;

+ 51 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java

@@ -1,9 +1,18 @@
 package org.springblade.manager.feign;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.service.impl.SaveUserInfoByProjectServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RestController;
+
 import java.util.List;
 
 @RestController
@@ -11,9 +20,51 @@ import java.util.List;
 public class ContractClientImpl implements ContractClient {
 
     private final IContractInfoService contractInfoService;
+    private final SaveUserInfoByProjectMapper saveUserInfoByProjectMapper;
+    private final SaveUserInfoByProjectServiceImpl saveUserInfoByProject;
 
     @Override
     public List<ContractInfo> queryContractListByIds(List<Long> ids) {
         return this.contractInfoService.selectContractByProjectIds(ids);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R saveUserInfoByProjectTow(List<SaveUserInfoByProjectDTO> list) {
+        if (list.size() > 0) {
+            //判重
+            list.forEach((lists) -> {
+                Long row = saveUserInfoByProjectMapper.selectCount(
+                        Wrappers.<SaveUserInfoByProjectDTO>query().lambda().
+                                eq(SaveUserInfoByProjectDTO::getProjectId, lists.getProjectId()).
+                                eq(SaveUserInfoByProjectDTO::getContractId, lists.getContractId()).
+                                eq(SaveUserInfoByProjectDTO::getPostId, lists.getPostId()).
+                                eq(SaveUserInfoByProjectDTO::getUserId, lists.getUserId()));
+
+                if (row > 0L) {
+                    throw new ServiceException(StringUtil.format("当前用户已存在该合同段下,请重新选择"));
+                }
+            });
+            boolean result = saveUserInfoByProject.saveBatch(list);
+            if (result) {
+                return R.success("保存成功");
+            }
+        }
+        return R.fail("保存失败");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R saveUserInfoByProjectThree(List<SaveUserInfoByProjectDTO> list) {
+        if (list.size() > 0) {
+            boolean result = saveUserInfoByProject.saveBatch(list);
+            if (result) {
+                return R.success("保存成功");
+            }
+        }
+        return R.fail("保存失败");
+    }
+
+
+
 }

+ 2 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -75,7 +75,8 @@
     </select>
 
     <select id="selectContractInfoPageByPid" resultMap="contractInfoResultMap">
-        select c.*,p.project_name as project_name  from m_contract_info c INNER JOIN m_project_info p on c.p_id=p.id where p.id = #{pid} and c.is_deleted = 0
+        select c.*,p.project_name as project_name  from m_contract_info c
+        INNER JOIN m_project_info p on c.p_id=p.id where p.id = #{pid} and c.is_deleted = 0
     </select>
 
     <select id="findJobByRoleId" resultType="org.springblade.manager.vo.CRolePostVO">
@@ -91,7 +92,6 @@
         blade_user u
         INNER JOIN m_project_assignment_user mpau ON u.id = mpau.user_id
         INNER JOIN blade_post p ON p.id = mpau.post_id
-        INNER JOIN blade_role r ON r.id = mpau.role_id
         INNER JOIN m_contract_info ci ON ci.id = mpau.contract_id
         INNER JOIN m_project_info pi ON pi.id = mpau.project_id
         WHERE mpau.is_deleted = 0 AND mpau.`status` = 1
@@ -99,9 +99,6 @@
         <if test="Values.cId != null and Values.cId != '' ">
             AND ci.id = #{Values.cId}
         </if>
-        <if test="Values.rId != null and Values.rId !='' ">
-            AND r.id = #{Values.rId}
-        </if>
         <if test="Values.postId !=null and Values.postId !='' ">
             AND p.id = #{Values.postId}
         </if>

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

@@ -52,6 +52,8 @@ public interface ExcelTabMapper extends BaseMapper<ExcelTab> {
 	 */
 	List<ExceTabTreVO> tabLazyTree(String tenantId, Long modeId);
 
+	List<ExceTabTreVO> tabLazyTreeAll(String tenantId, Long modeId,String name);
+
 	List<ExcelTabWbsTypeVO> getWbsTypeList();
 
 	List<WbsTreeVO> lazyTree(@Param("wbsId") String wbsId,

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml

@@ -107,4 +107,36 @@
         AND status = 1
         ORDER BY dept.sort
     </select>
+
+
+    <select id="tabLazyTreeAll" resultMap="treeNodeResultMap" >
+        SELECT
+        dept.id,
+        dept.parent_id,
+        dept.name,
+        dept.file_type,
+        (
+        SELECT
+        CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+        FROM
+        m_excel_tab
+        WHERE
+        parent_id = dept.id and is_deleted = 0
+        ) AS "has_children"
+        FROM
+        m_excel_tab dept
+        WHERE
+         dept.is_deleted = 0
+        <!--<if test="param1!=null and param1!=''">
+            and dept.tenant_id = #{param1}
+        </if>
+        <if test="param2!=null and param2!=''">
+            and dept.tenant_id = #{param2}
+        </if>-->
+
+        <if test="param3!=null and param3!=''">
+            and dept.name like concat(concat('%', #{param3}),'%')
+        </if>
+        ORDER BY dept.create_time
+    </select>
 </mapper>

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

@@ -43,5 +43,7 @@ public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
 	List<ProjectInfoVO> selectProjectInfoPage(IPage page, ProjectInfoVO projectInfo);
 
 
-    void updateTemplateIdById(String projectId, String wbsId);
+    void updateTemplateIdById(String projectId, String referencePrivateWbsProjectId,String type);
+
+    ProjectInfo selectOneAndWbsTypeById(Long id);
 }

+ 11 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml

@@ -30,6 +30,7 @@
         <result column="state" property="state"/>
         <result column="is_open_sign" property="isOpenSign"/>
         <result column="reference_wbs_template_id" property="referenceWbsTemplateId"/>
+        <result column="reference_wbs_template_type" property="referenceWbsTemplateType"/>
     </resultMap>
 
     <select id="selectProjectList" resultMap="projectInfoResultMap">
@@ -40,7 +41,10 @@
     </select>
 
     <update id="updateTemplateIdById">
-        UPDATE  m_project_info SET reference_wbs_template_id = #{wbsId} WHERE
+        UPDATE  m_project_info
+        SET reference_wbs_template_id = #{referencePrivateWbsProjectId},
+            reference_wbs_template_type = #{type}
+        WHERE
         id = #{projectId}
         AND is_deleted = 0
         AND status = 1
@@ -50,5 +54,11 @@
     <select id="selectProjectInfoPage" resultMap="projectInfoResultMap">
         select * from m_project_info where is_deleted = 0
     </select>
+    <select id="selectOneAndWbsTypeById" resultType="org.springblade.manager.entity.ProjectInfo">
+        SELECT *,
+        (select wbs_type from m_wbs_info )
+        FROM m_project_info
+        WHERE id = #{id}
+    </select>
 
 </mapper>

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

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.dto.WbsFormElementDTO;
+import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.vo.WbsFormElementVO;
 
@@ -54,4 +55,7 @@ public interface WbsFormElementMapper extends BaseMapper<WbsFormElement> {
 
     int judgeFiled(String eKey, String tableName);
 
+    List<WbsFormElementDTO2> selectWbsTreeTableListByParentId(String parentId);
+
+    void updateSortById(String id, Integer sort);
 }

+ 19 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml

@@ -41,6 +41,15 @@
         ALTER TABLE ${initTableName} MODIFY ${eKey} ${eType}(${eLength})
     </update>
 
+    <update id="updateSortById">
+        UPDATE m_wbs_tree
+        SET sort = #{sort}
+        WHERE id = #{id}
+        AND type = 2
+        AND status = 1
+        AND is_deleted = 0
+    </update>
+
 
     <select id="selectWbsFormElementPage" resultMap="wbsFormElementResultMap">
         select * from m_wbs_form_element where is_deleted = 0
@@ -49,4 +58,14 @@
      select count(*) from information_schema.columns where table_name = &quot;${tableName}&quot; and column_name = &quot;${eKey}&quot;
     </select>
 
+    <select id="selectWbsTreeTableListByParentId" resultType="org.springblade.manager.dto.WbsFormElementDTO2">
+        SELECT id,dept_name AS "deptName",sort
+        FROM m_wbs_tree
+        WHERE parent_id = #{parentId}
+        AND status = 1
+        AND is_deleted = 0
+        AND type = 2
+        ORDER BY sort
+    </select>
+
 </mapper>

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

@@ -42,4 +42,6 @@ public interface WbsInfoMapper extends BaseMapper<WbsInfo> {
 	List<WbsInfo> selectWbsInfoPage(IPage page, WbsInfo wbsInfo);
 
     List<WbsInfo> selectAll(Integer type);
+
+    WbsInfo selectById2(Long id);
 }

+ 13 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsInfoMapper.xml

@@ -23,24 +23,29 @@
     </resultMap>
 
     <select id="selectWbsInfoPage" resultMap="wbsInfoResultMap">
-        select * from m_wbs_info where is_deleted = 0 and status = 1
+        select * from m_wbs_info where is_deleted = 0
     </select>
     <select id="selectAll" resultMap="resultMap2">
         SELECT
-            id,
-            wbs_name,
-            wbs_type,
-            `STATUS`
+        id,
+        wbs_name,
+        wbs_type,
+        `STATUS`
         FROM
-            m_wbs_info
+        m_wbs_info
         WHERE
-            is_deleted = 0
+        is_deleted = 0
         AND `STATUS` = 1
         <if test="type != null and type != ''">
             AND wbs_type = #{type}
         </if>
         GROUP BY
-            wbs_name
+        wbs_name
+    </select>
+
+    <select id="selectById2" resultMap="wbsInfoResultMap">
+        SELECT * FROM m_wbs_info
+        WHERE id = #{id}
     </select>
 
 </mapper>

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -45,4 +45,12 @@ public interface WbsTreeContractMapper extends BaseMapper<WbsTreeContract> {
                                        @Param("wbsId") String wbsId);
 
 
+    WbsTreePrivate selectParent(String projectId, String wbsId, Long parentId);
+
+    void updateByCondition1(@Param("wbsTP") WbsTreePrivate wbsTP);
+
+    void insertByCondition(@Param("wbsTree") WbsTreePrivate wbsTreePrivate,
+                           @Param("contractId") Long contractId,
+                           @Param("pKeyId") Long pKeyId,
+                           @Param("wbsType") Integer wbsType);
 }

+ 33 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -58,6 +58,19 @@
             #{wbsTree.tableOwner},#{wbsTree.majorDataType},#{wbsTree.initTableName},#{wbsTree.isLinkTable})
     </insert>
 
+    <insert id="insertByCondition">
+            INSERT INTO m_wbs_tree_contract(
+            p_key_id,id,wbs_id,wbs_type,project_id,contract_id,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
+            table_type,create_time,create_user,create_dept,update_user,update_time,`STATUS`,is_deleted,
+            unique_code,partition_code,is_expernode,is_concrete,table_owner,major_data_type,init_table_name,is_link_table)
+            VALUES(
+            #{pKeyId},#{wbsTree.id},#{wbsTree.wbsId},#{wbsType},#{wbsTree.projectId},#{contractId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
+            #{wbsTree.deptCategory},#{wbsTree.deptName},#{wbsTree.fullName},#{wbsTree.sort},#{wbsTree.remark},#{wbsTree.type},
+            #{wbsTree.tableType},#{wbsTree.createTime},#{wbsTree.createUser},#{wbsTree.createDept},#{wbsTree.updateUser},#{wbsTree.updateTime},
+            #{wbsTree.status},#{wbsTree.isDeleted},#{wbsTree.uniqueCode},#{wbsTree.partitionCode},#{wbsTree.isExpernode},#{wbsTree.isConcrete},
+            #{wbsTree.tableOwner},#{wbsTree.majorDataType},#{wbsTree.initTableName},#{wbsTree.isLinkTable})
+    </insert>
+
     <update id="deleteByCondition">
             UPDATE m_wbs_tree_contract
             SET is_deleted = 1
@@ -76,6 +89,19 @@
             AND contract_id = #{contractId}
     </update>
 
+    <update id="updateByCondition1">
+        UPDATE m_wbs_tree_contract
+        SET dept_category = #{wbsTP.deptCategory},
+            dept_name = #{wbsTP.deptName},
+            unique_code = #{wbsTP.uniqueCode},
+            partition_code = #{wbsTP.partitionCode},
+            major_data_type = #{wbsTP.majorDataType}
+        WHERE
+            project_id = #{wbsTP.projectId}
+        AND id = #{wbsTP.id}
+        AND wbs_id = #{wbsTP.wbsId}
+    </update>
+
 
     <select id="selectAll" resultMap="resultMap2">
         SELECT
@@ -133,6 +159,13 @@
         AND STATUS = 1
         AND is_deleted = 0
     </select>
+    <select id="selectParent" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT dept_name FROM m_wbs_tree_private
+        WHERE
+        project_id = #{projectId}
+        AND wbs_id = #{wbsId}
+        AND id = #{parentId}
+    </select>
 
 
 </mapper>

+ 12 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java

@@ -19,12 +19,12 @@ package org.springblade.manager.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.vo.SaveUserInfoByProjectVO;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeVO;
-import org.springframework.web.bind.annotation.PostMapping;
 
 import java.util.List;
 
@@ -105,7 +105,7 @@ public interface WbsTreeMapper extends BaseMapper<WbsTree> {
 
     Integer insertWbsTreePrivate(@Param("projectId") String projectId, @Param("wbsTree") WbsTree wbsTree);
 
-    Boolean insertWbsTreeContract(@Param("projectId")String projectId,@Param("contractId") String contractId,@Param("wbsTree")  WbsTree wbsTree);
+    Boolean insertWbsTreeContract(@Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsTree") WbsTree wbsTree);
 
     Integer selectRepeatByProjectId(String projectId);
 
@@ -115,4 +115,13 @@ public interface WbsTreeMapper extends BaseMapper<WbsTree> {
 
     int deleteBatchProjectNodeId(Long projectNodeId);
 
+    WbsTree selectByWbsId(Long id);
+
+    int updateByCondition(@Param("id") Long id, @Param("wbsName") String wbsName, @Param("status") Integer status);
+
+    List<SaveUserInfoByProjectVO> selectListByUserId(Long userId);
+
+    List<WbsTreeDTO2> selectWbsTreeListByParentId(String parentId);
+
+    void updateSortById(String id, Integer sort);
 }

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

@@ -41,6 +41,7 @@
         <result column="key" property="key"/>
         <result column="has_children" property="hasChildren"/>
         <result column="type" property="type"/>
+        <result column="deptCategory" property="deptCategory"/>
     </resultMap>
 
     <resultMap id="selectByNodeTableMap" type="org.springblade.manager.vo.WbsNodeTableVO">
@@ -51,6 +52,7 @@
         <result column="elementTotal" property="elementTotal"/>
         <result column="tableOwner" property="tableOwner"/>
         <result column="initTableName" property="initTableName"/>
+        <result column="sort" property="sort"/>
     </resultMap>
 
     <resultMap id="wbsFormElementMap" type="org.springblade.manager.entity.WbsFormElement">
@@ -112,6 +114,30 @@
         create table ${tableName} as select * from m_wbs_tree WHERE 1=2
     </update>
 
+    <update id="updateByCondition">
+        UPDATE m_wbs_tree
+        <trim prefix="set" suffixOverrides=",">
+            <if test="wbsName != null and wbsName != '' ">
+                `dept_name` = #{wbsName},
+            </if>
+            <if test="status != null and status != '' ">
+                `status` = #{status}
+            </if>
+        </trim>
+        WHERE wbs_id = #{id}
+        AND parent_id = 0
+        AND is_deleted = 0
+    </update>
+
+    <update id="updateSortById">
+        UPDATE m_wbs_tree
+        SET sort = #{sort}
+        WHERE id = #{id}
+        AND type = 1
+        AND status = 1
+        AND is_deleted = 0
+    </update>
+
     <delete id="deleteBatchProjectNodeId">
         delete from m_wbs_tree where project_node_id = #{projectNodeId} and id &lt;&gt; #{projectNodeId}
     </delete>
@@ -140,6 +166,7 @@
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
         dept.type AS "type",
+        dept.dept_category AS "deptCategory",
         dept.table_type,
         dept.id,
         dept.parent_id,
@@ -171,6 +198,7 @@
         SELECT
             wt.id AS id,
             wt.dept_name AS tableName,
+            wt.sort AS sort,
             wt.table_type AS tableType,
             wt.`status` AS isCreateTable ,
             wt.table_owner as tableOwner,
@@ -183,6 +211,7 @@
             wt.type = 2
         AND wt.is_deleted = 0
         AND wt.parent_id = #{id}
+        ORDER BY wt.sort
     </select>
 
     <select id="selectByElementsTotal" resultType="java.lang.String">
@@ -225,5 +254,38 @@
             AND parent_id = #{tableParentId}
     </select>
 
+    <select id="selectByWbsId" resultType="org.springblade.manager.entity.WbsTree">
+        SELECT * FROM m_wbs_tree
+        WHERE wbs_id = #{id}
+        AND status = 1
+        AND is_deleted = 0
+        AND parent_id = 0
+        AND type = 1
+    </select>
+
+    <select id="selectListByUserId" resultType="org.springblade.manager.vo.SaveUserInfoByProjectVO">
+        SELECT
+            pi.project_name as "projectName"
+            ,ci.contract_name as "contractName"
+            ,p.category as "postType"
+            ,p.post_name as "postName"
+        FROM
+            m_project_assignment_user mpau
+        INNER JOIN blade_post p ON p.id = mpau.post_id
+        INNER JOIN m_contract_info ci ON ci.id = mpau.contract_id
+        INNER JOIN m_project_info pi ON pi.id = mpau.project_id
+        WHERE mpau.is_deleted = 0 AND mpau.`status` = 1
+        AND mpau.user_id = #{userId}
+    </select>
+    <select id="selectWbsTreeListByParentId" resultType="org.springblade.manager.dto.WbsTreeDTO2">
+        SELECT id,dept_name AS "deptName",sort
+        FROM m_wbs_tree
+        WHERE parent_id = #{parentId}
+        AND status = 1
+        AND is_deleted = 0
+        AND type = 1
+        ORDER BY sort
+    </select>
+
 
 </mapper>

+ 21 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -2,6 +2,7 @@ package org.springblade.manager.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.WbsNodeTableVO;
@@ -28,7 +29,8 @@ public interface WbsTreePrivateMapper extends BaseMapper<WbsTreePrivate> {
 
 
     WbsTreePrivate selectByCondition(@Param("id") String id,
-                                     @Param("projectId") String projectId);
+                                     @Param("projectId") String projectId,
+                                     @Param("wbsId") String wbsId);
 
     void deleteByCondition(String id, String wbsId, String projectId);
 
@@ -44,6 +46,7 @@ public interface WbsTreePrivateMapper extends BaseMapper<WbsTreePrivate> {
 
     Integer insertCombination1(@Param("snowId") Long snowId,
                                @Param("wbsTree") WbsTree wbsTree,
+                               @Param("wbsType") Integer wbsType,
                                @Param("projectId") String projectId);
 
     Integer insertCombination2(@Param("snowId") Long snowId,
@@ -52,12 +55,27 @@ public interface WbsTreePrivateMapper extends BaseMapper<WbsTreePrivate> {
 
     WbsTreePrivate selectByCondition1(String id, String templateProjectId);
 
-    List<WbsTree> selectIsTable(Long tableParentId);
-
+    List<WbsTree> selectIsTable(Long tableId, String projectId);
 
     List<WbsNodeTableVO> selectByNodeTable(String id, String wbsId, String projectId);
 
     int updateByCondition1(String id, String wbsId, String projectId);
 
     List<WbsTreePrivateVO> lazyTree(String wbsId, String tenantId, Long parentId, String projectId);
+
+    int updateByPKeyId(@Param("pKeyId") Long pKeyId, @Param("wbsTP") WbsTreePrivate wbsTP);
+
+    WbsTreePrivate getByCondition(Long parentId, String projectId, String wbsId);
+
+    WbsTreePrivate getByPKeyId(Long pKeyId);
+
+    WbsTreePrivate selectByCondition3(String id, String wbsId, String referencePrivateWbsProjectId);
+
+    WbsTreePrivate selectByPKeyId(Long referenceWbsTemplateId);
+
+    List<WbsTreePrivateDTO2> selectNodeListByCondition(String projectId, String parentId, String wbsId);
+
+    void updateSortById(Long pKeyId, Integer sort);
+
+    void updateSortById2(Long pKeyId, Integer sort);
 }

+ 102 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -38,6 +38,7 @@
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreePrivateVO2">
         <result column="pKeyId" property="pKeyId"/>
         <result column="wbs_id" property="wbsId"/>
+        <result column="wbs_type" property="wbsType"/>
         <result column="project_id" property="projectId"/>
         <result column="project_name" property="projectName"/>
     </resultMap>
@@ -51,14 +52,16 @@
         <result column="has_children" property="hasChildren"/>
         <result column="type" property="type"/>
         <result column="wbsType" property="wbsType"/>
+        <result column="primaryKeyId" property="primaryKeyId"/>
+        <result column="deptCategory" property="deptCategory"/>
     </resultMap>
     <insert id="insertCombination1">
         INSERT INTO m_wbs_tree_private(
-        p_key_id,id,wbs_id,project_id,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
+        p_key_id,id,wbs_id,wbs_type,project_id,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
         table_type,create_time,create_user,create_dept,update_user,update_time,`STATUS`,is_deleted,
         unique_code,partition_code,is_expernode,is_concrete,table_owner,major_data_type,init_table_name,is_link_table)
         VALUES(
-        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
+        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{wbsType},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
         #{wbsTree.deptCategory},#{wbsTree.deptName},#{wbsTree.fullName},#{wbsTree.sort},#{wbsTree.remark},#{wbsTree.type},
         #{wbsTree.tableType},#{wbsTree.createTime},#{wbsTree.createUser},#{wbsTree.createDept},#{wbsTree.updateUser},#{wbsTree.updateTime},
         #{wbsTree.status},#{wbsTree.isDeleted},#{wbsTree.uniqueCode},#{wbsTree.partitionCode},#{wbsTree.isExpernode},#{wbsTree.isConcrete},
@@ -67,11 +70,11 @@
 
     <insert id="insertCombination2">
         INSERT INTO m_wbs_tree_private(
-        p_key_id,id,wbs_id,project_id,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
+        p_key_id,id,wbs_id,wbs_type,project_id,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
         table_type,create_time,create_user,create_dept,update_user,update_time,`STATUS`,is_deleted,
         unique_code,partition_code,is_expernode,is_concrete,table_owner,major_data_type,init_table_name,is_link_table)
         VALUES(
-        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
+        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{wbsTree.wbsType},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
         #{wbsTree.deptCategory},#{wbsTree.deptName},#{wbsTree.fullName},#{wbsTree.sort},#{wbsTree.remark},#{wbsTree.type},
         #{wbsTree.tableType},#{wbsTree.createTime},#{wbsTree.createUser},#{wbsTree.createDept},#{wbsTree.updateUser},#{wbsTree.updateTime},
         #{wbsTree.status},#{wbsTree.isDeleted},#{wbsTree.uniqueCode},#{wbsTree.partitionCode},#{wbsTree.isExpernode},#{wbsTree.isConcrete},
@@ -118,14 +121,53 @@
         AND project_id = #{projectId}
     </update>
 
+    <update id="updateByPKeyId">
+    update m_wbs_tree_private
+    set
+    tenant_id = #{wbsTP.tenantId},
+    parent_id = #{wbsTP.parentId},
+    dept_category = #{wbsTP.deptCategory},
+    dept_name = #{wbsTP.deptName},
+    ancestors = #{wbsTP.ancestors},
+    unique_code = #{wbsTP.uniqueCode},
+    partition_code = #{wbsTP.partitionCode},
+    major_data_type = #{wbsTP.majorDataType},
+    create_user = #{wbsTP.createUser},
+    create_dept = #{wbsTP.createDept},
+    create_time = #{wbsTP.createTime},
+    update_user = #{wbsTP.updateUser},
+    update_time = #{wbsTP.updateTime},
+    status = 1 ,is_deleted = 0
+    where p_key_id = #{pKeyId}
+    </update>
+
+    <update id="updateSortById">
+        UPDATE m_wbs_tree_private
+        SET sort = #{sort}
+        WHERE p_key_id = #{pKeyId}
+        AND type = 1
+        AND status = 1
+        AND is_deleted = 0
+    </update>
+    <update id="updateSortById2">
+        UPDATE m_wbs_tree_private
+        SET sort = #{sort}
+        WHERE p_key_id = #{pKeyId}
+        AND type = 2
+        AND status = 1
+        AND is_deleted = 0
+    </update>
+
 
     <select id="lazyTree" resultMap="treeNodeResultMap">
         SELECT
+        dept.p_key_id as "primaryKeyId",
         dept.type AS "type",
         dept.table_type,
         dept.id,
         dept.parent_id,
         dept.dept_name AS title,
+        dept.dept_category AS "deptCategory",
         dept.id AS "value",
         dept.id AS "key",
         (
@@ -155,6 +197,7 @@
         SELECT
         wtp.p_key_id AS "pKeyId",
         wtp.wbs_id,
+        wtp.wbs_type,
         wtp.project_id,
         ( SELECT project_name FROM m_project_info pi WHERE wtp.project_id = pi.id ) AS project_name
         FROM
@@ -168,7 +211,8 @@
     </select>
 
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, dept_name as title,type as "type", id as "value", id as "key" ,
+        select p_key_id as "primaryKeyId",
+        id, parent_id, dept_name as title,type as "type", id as "value", id as "key" ,
         (select wbs_type from m_wbs_info where id = #{wbsId}) as "wbsType"
         from m_wbs_tree_private
         where
@@ -183,6 +227,7 @@
         </if>
         ORDER BY sort
     </select>
+
     <select id="selectByCondition" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT
             *
@@ -191,9 +236,12 @@
         WHERE
             id = #{id}
             AND project_id = #{projectId}
+            AND wbs_id = #{wbsId}
             AND STATUS = 1
             AND is_deleted = 0
+            AND type = 1
     </select>
+
     <select id="selectByCondition2" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT
             *
@@ -219,17 +267,20 @@
             type = 2
             AND is_deleted = 0
             AND `status` = 1
-            AND parent_id = #{tableParentId}
+            AND parent_id = #{tableId}
+            AND project_id = #{projectId}
     </select>
     <select id="selectByNodeTable" resultType="org.springblade.manager.vo.WbsNodeTableVO">
         SELECT
+            wt.p_key_id AS "pKeyId",
             wt.id AS id,
             wt.dept_name AS tableName,
             wt.table_type AS tableType,
             wt.`status` AS isCreateTable ,
             wt.table_owner as tableOwner,
             wt.is_link_table,
-            wt.init_table_name
+            wt.init_table_name,
+            wt.sort
         FROM
             m_wbs_tree_private AS wt
         WHERE
@@ -238,6 +289,50 @@
         AND wt.parent_id = #{id}
         AND wt.wbs_id = #{wbsId}
         AND wt.project_id = #{projectId}
+        ORDER BY wt.sort
+    </select>
+    <select id="getByCondition" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT * FROM m_wbs_tree_private
+        WHERE project_id = #{projectId}
+        AND id = #{parentId}
+        AND wbs_id = #{wbsId}
+        AND is_deleted = 0
+        AND status = 1
+        AND type = 1
+    </select>
+    <select id="getByPKeyId" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT * FROM m_wbs_tree_private
+        WHERE p_key_id = #{pKeyId}
+    </select>
+
+    <select id="selectByCondition3" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT
+            *
+        FROM
+            m_wbs_tree_private
+        WHERE
+            id = #{id}
+            AND project_id = #{referencePrivateWbsProjectId}
+            AND wbs_id = #{wbsId}
+            AND STATUS = 1
+            AND is_deleted = 0
+            AND type = 1
+            AND parent_id = 0
+    </select>
+    <select id="selectByPKeyId" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        SELECT * FROM m_wbs_tree_private WHERE p_key_id = #{referenceWbsTemplateId}
+    </select>
+
+    <select id="selectNodeListByCondition" resultType="org.springblade.manager.dto.WbsTreePrivateDTO2">
+        SELECT p_key_id as "pKeyId",dept_name AS "deptName",sort
+        FROM m_wbs_tree_private
+        WHERE project_id = #{projectId}
+        AND parent_id = #{parentId}
+        AND wbs_id = #{wbsId}
+        AND status = 1
+        AND is_deleted = 0
+        AND type = 1
+        ORDER BY sort
     </select>
 
 </mapper>

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

@@ -55,6 +55,9 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 	List<ExceTabTreVO> tabLazyTree(String tenantId, Long modeId);
 
 
+	List<ExceTabTreVO> tabLazyTreeAll(String tenantId, Long modeId,String name);
+
+
 	/**
 	 * 获取wbs类型
 	 */

+ 7 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java

@@ -21,6 +21,7 @@ import org.springblade.manager.vo.ContractlnfoCountVO;
 import org.springblade.manager.vo.ProjectInfoVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.vo.ProjectInfoVO2;
 
 import java.util.List;
 
@@ -51,7 +52,12 @@ public interface IProjectInfoService extends BaseService<ProjectInfo> {
 	 * 查询业务条数
 	 * @return
 	 */
-	public List<ContractlnfoCountVO> selectContractInfoCount();
+	List<ContractlnfoCountVO> selectContractInfoCount();
+
+	ProjectInfo getOne(Long id);
+
+	ProjectInfoVO2 getOneByCondition(Long id, Long referenceWbsTemplateId, String referenceWbsTemplateType);
+
 
 
 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsFormElementService.java

@@ -21,6 +21,7 @@ import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.WbsFormElementDTO;
+import org.springblade.manager.dto.WbsFormElementDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.excel.WbsFormElementExcel;
 import org.springblade.manager.vo.WbsFormElementVO;
@@ -53,4 +54,8 @@ public interface IWbsFormElementService extends BaseService<WbsFormElement> {
 
     String updateAndSyn(List<WbsFormElement> wbsFormElementList,String initTableName);
 
+    List<WbsFormElementDTO2> findWbsTreeTableSameLevel(String parentId);
+
+    boolean wbsTreeTableSort(List<WbsFormElementDTO2> wbsTreeDTO);
+
 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsInfoService.java

@@ -19,6 +19,7 @@ package org.springblade.manager.service;
 
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.manager.dto.WbsInfoDTO;
 import org.springblade.manager.entity.WbsInfo;
 import org.springblade.manager.vo.WbsInfoVO;
 
@@ -42,4 +43,8 @@ public interface IWbsInfoService extends BaseService<WbsInfo> {
 	IPage<WbsInfo> selectWbsInfoPage(IPage<WbsInfo> page, WbsInfo wbsInfo);
 
     List<WbsInfo> findByWbsType(String type);
+
+    boolean submit(WbsInfoDTO wbsInfo);
+
+    WbsInfo findById(Long id);
 }

+ 9 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.service;
 
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
@@ -15,14 +16,20 @@ import java.util.List;
  * @since 2022-05-24
  */
 public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
-    List<WbsTreePrivateVO> tree(String wbsId,String projectId);
+    List<WbsTreePrivateVO> tree(String wbsId, String projectId);
 
     boolean submit(WbsTreePrivate wbsTreePrivate);
 
     List<WbsNodeTableVO> selectByNodeTable(String id, String wbsId, String projectId);
 
-
     boolean removeTableByCondition(String id, String wbsId, String projectId);
 
     List<WbsTreePrivateVO> lazyTree(String wbsId, String tenantId, Long parentId, String projectId);
+
+    List<WbsTreePrivateDTO2> findWbsTreePrivateSameLevel(String projectId, String parentId, String wbsId);
+
+    boolean wbsTreePrivateSort(List<WbsTreePrivateDTO2> wbsTreeDTO);
+
+    boolean wbsTreePrivateTableSort(List<WbsTreePrivateDTO2> wbsTreeDTO);
+
 }

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

@@ -21,8 +21,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.vo.SaveUserInfoByProjectVO;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeAllListVO;
 import org.springblade.manager.vo.WbsTreeVO;
@@ -97,4 +99,14 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
     R saveFormElement(FormElementDTO formElementDTO);
 
     int deleteBatchByProjectNodeId(Long projectNodeId);
+
+    WbsTree selectGenNodeByWbsId(Long id);
+
+    List<WbsTree> findByWbsTreeNode(String ids);
+
+    List<SaveUserInfoByProjectVO> findProjectAndContractList(Long userId);
+
+    List<WbsTreeDTO2> findWbsTreeSameLevel(String parentId);
+
+    boolean wbsTreeSort(List<WbsTreeDTO2> wbsTreeList);
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -46,7 +46,7 @@ public class ArchiveTreeServiceImpl
 
     @Override
     public boolean submit(ArchiveTreeDTO archiveTreeDTO) {
-        //TODO 条件判断有误,当parentid=0时,Ancestors会为null
+        //TODO 条件判断有误,当parentId=0时,Ancestors为null
         if (Func.isEmpty(archiveTreeDTO.getParentId())) {
             archiveTreeDTO.setTenantId(AuthUtil.getTenantId());
             archiveTreeDTO.setParentId(BladeConstant.TOP_PARENT_ID);

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -54,6 +54,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 		return ForestNodeMerger.merge(baseMapper.tabLazyTree(tenantId, modeId));
 	}
 
+	@Override
+	public List<ExceTabTreVO> tabLazyTreeAll(String tenantId, Long modeId,String name) {
+		if (AuthUtil.isAdministrator()) {
+			tenantId = StringPool.EMPTY;
+		}
+		return ForestNodeMerger.merge(baseMapper.tabLazyTreeAll(tenantId, modeId,name));
+	}
+
 	@Override
 	public List<ExcelTabWbsTypeVO> getWbsTypeList() {
 		return baseMapper.getWbsTypeList();

+ 46 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java

@@ -17,12 +17,14 @@
 package org.springblade.manager.service.impl;
 
 import org.springblade.manager.entity.ProjectInfo;
-import org.springblade.manager.mapper.ContractInfoMapper;
+import org.springblade.manager.entity.WbsInfo;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.mapper.*;
 import org.springblade.manager.vo.ContractlnfoCountVO;
 import org.springblade.manager.vo.ProjectInfoVO;
-import org.springblade.manager.mapper.ProjectInfoMapper;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.ProjectInfoVO2;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
@@ -38,26 +40,53 @@ import java.util.List;
 @Service
 public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, ProjectInfo> implements IProjectInfoService {
 
-	@Resource
-	private ContractInfoMapper contractInfoMapper;
+    @Resource
+    private ContractInfoMapper contractInfoMapper;
+    @Resource
+    private WbsInfoMapper wbsInfoMapper;
+    @Resource
+    private WbsTreePrivateMapper wbsTreePrivateMapper;
 
-	@Override
-	public List<ProjectInfo> selectProjectList(List<String> projectIds) {
-		return this.baseMapper.selectProjectList(projectIds);
-	}
+    @Override
+    public List<ProjectInfo> selectProjectList(List<String> projectIds) {
+        return this.baseMapper.selectProjectList(projectIds);
+    }
 
-	@Override
-	public IPage<ProjectInfoVO> selectProjectInfoPage(IPage<ProjectInfoVO> page, ProjectInfoVO projectInfo) {
-		return page.setRecords(baseMapper.selectProjectInfoPage(page, projectInfo));
-	}
 
-	@Override
-	public List<ContractlnfoCountVO> selectContractInfoCount() {
-		List<ContractlnfoCountVO> contractlnfoCountVO = contractInfoMapper.selectContractInfoCount();
-		return contractlnfoCountVO;
-	}
+    @Override
+    public IPage<ProjectInfoVO> selectProjectInfoPage(IPage<ProjectInfoVO> page, ProjectInfoVO projectInfo) {
+        return page.setRecords(baseMapper.selectProjectInfoPage(page, projectInfo));
+    }
 
+    @Override
+    public List<ContractlnfoCountVO> selectContractInfoCount() {
+        List<ContractlnfoCountVO> contractlnfoCountVO = contractInfoMapper.selectContractInfoCount();
+        return contractlnfoCountVO;
+    }
 
 
+    @Override
+    public ProjectInfo getOne(Long id) {
+        return baseMapper.selectById(id);
+    }
+
+    @Override
+    public ProjectInfoVO2 getOneByCondition(Long id, Long referenceWbsTemplateId, String referenceWbsTemplateType) {
+        ProjectInfoVO2 projectInfoVO2 = new ProjectInfoVO2();
+        ProjectInfo projectInfo = baseMapper.selectById(id);
+        if ("public".equals(referenceWbsTemplateType) && referenceWbsTemplateId != (-1)) {
+            WbsInfo wbsInfo = wbsInfoMapper.selectById(referenceWbsTemplateId);
+            projectInfoVO2.setWbsType(wbsInfo.getWbsType());
+            projectInfoVO2.setProjectInfo(projectInfo);
+        } else if (("private").equals(referenceWbsTemplateType) && referenceWbsTemplateId != (-1)) {
+            WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectByPKeyId(referenceWbsTemplateId);
+            projectInfoVO2.setWbsType(Integer.valueOf(wbsTreePrivate.getWbsType()));
+            projectInfoVO2.setProjectInfo(projectInfo);
+        } else {
+            projectInfoVO2.setProjectInfo(projectInfo);
+        }
+        return projectInfoVO2;
+    }
+
 
 }

+ 21 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -22,6 +22,8 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.WbsFormElementDTO2;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.excel.WbsFormElementExcel;
 import org.springblade.manager.mapper.WbsFormElementMapper;
@@ -233,7 +235,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         //删除前判断是否存在该key
         int row = baseMapper.judgeFiled(eKey, tableName);
         if (row > 0) {
-            //同步删除实体表字段 TODO 删除前判断实体表是否关联数据
+            //同步删除实体表字段
             baseMapper.deleteTableFiled(eKey, tableName);
         }
         return true;
@@ -267,4 +269,22 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         }
         return "0";
     }
+
+    @Override
+    public List<WbsFormElementDTO2> findWbsTreeTableSameLevel(String parentId) {
+        List<WbsFormElementDTO2> trees = baseMapper.selectWbsTreeTableListByParentId(parentId);
+        return trees;
+    }
+
+    @Override
+    public boolean wbsTreeTableSort(List<WbsFormElementDTO2> wbsTreeDTO) {
+        int number = 1;
+        for (WbsFormElementDTO2 wbsTree : wbsTreeDTO) {
+            wbsTree.setSort(number);
+            //修改sort
+            baseMapper.updateSortById(wbsTree.getId(), wbsTree.getSort());
+            number++;
+        }
+        return true;
+    }
 }

+ 53 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsInfoServiceImpl.java

@@ -17,6 +17,12 @@
 package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.AllArgsConstructor;
+import oracle.sql.BfileDBAccess;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.dto.WbsInfoDTO;
+import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.mapper.WbsInfoMapper;
 import org.springblade.manager.service.IWbsInfoService;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -24,6 +30,7 @@ import org.springblade.manager.entity.WbsInfo;
 import org.springblade.manager.vo.WbsInfoVO;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -34,8 +41,11 @@ import java.util.List;
  * @since 2022-04-25
  */
 @Service
+@AllArgsConstructor
 public class WbsInfoServiceImpl extends BaseServiceImpl<WbsInfoMapper, WbsInfo> implements IWbsInfoService {
 
+    private final WbsTreeServiceImpl wbsTreeService;
+
     @Override
     public IPage<WbsInfo> selectWbsInfoPage(IPage<WbsInfo> page, WbsInfo wbsInfo) {
         return page.setRecords(baseMapper.selectWbsInfoPage(page, wbsInfo));
@@ -48,4 +58,47 @@ public class WbsInfoServiceImpl extends BaseServiceImpl<WbsInfoMapper, WbsInfo>
         return baseMapper.selectList(queryWrapper);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submit(WbsInfoDTO wbsInfo) {
+        //先查找树下是否有根节点
+        WbsTree wbsTree1 = wbsTreeService.selectGenNodeByWbsId(wbsInfo.getId());
+        if (wbsTree1 != null) {
+            //修改WbsInfo树信息
+            baseMapper.updateById(wbsInfo);
+            //修改WbsTree表的根节点
+            int row = wbsTreeService.updateByCondition(wbsInfo.getId(), wbsInfo.getWbsName(), wbsInfo.getStatus());
+            if (row > 0) {
+                return true;
+            }
+        } else {
+            //新增wbs树
+            int row = baseMapper.insert(wbsInfo);
+            if (row > 0) {
+                Long wbsId = wbsInfo.getId();
+                String nodeName = wbsInfo.getWbsName();
+                //初始化wbs树的根节点
+                WbsTree wbsTree = new WbsTree();
+                wbsTree.setWbsId(String.valueOf(wbsId));
+                wbsTree.setTenantId(AuthUtil.getTenantId());
+                wbsTree.setParentId(0L);
+                wbsTree.setAncestors("0");
+                wbsTree.setDeptCategory(1);
+                wbsTree.setDeptName(nodeName);
+                wbsTree.setFullName(nodeName);
+                wbsTree.setType(1);
+                boolean result2 = wbsTreeService.save(wbsTree);
+                if (result2) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public WbsInfo findById(Long id) {
+        return baseMapper.selectById2(id);
+    }
+
 }

+ 20 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -37,20 +37,21 @@ public class WbsTreeContractServiceImpl
     @Transactional(rollbackFor = Exception.class)
     public String submitWbsTreeInContract(WbsTreeContractDTO pawDTO) {
         String wbsTreeIds = pawDTO.getWbsTreeIds();
-        if (StringUtils.isEmpty(wbsTreeIds)) {
+        /*if (StringUtils.isEmpty(wbsTreeIds)) {
             return "1";
-        }
+        }*/
         String[] ids = wbsTreeIds.split(",");
         List<String> idList1 = Arrays.asList(ids);
         List<String> idList2 = new ArrayList<>();
         //查找合同段wbs私有库的节点树
         List<WbsTreeContract> list = baseMapper.findAllNodeList2(pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
-        for (WbsTreeContract wbsTreeContract : list) {
-            idList2.add(String.valueOf(wbsTreeContract.getId()));
+        if (list.size() > 0) {
+            for (WbsTreeContract wbsTreeContract : list) {
+                idList2.add(String.valueOf(wbsTreeContract.getId()));
+            }
         }
         //比较项目wbs私有树与合同段wbs树是否相同,相同则不修改,不同则修改
         List<String> diffrent = getDiffrent(idList1, idList2);
-        //diffrent.forEach(System.out::print);
         if (diffrent.size() == 0) {//相同
             return "2";
         } else {
@@ -63,18 +64,22 @@ public class WbsTreeContractServiceImpl
                         baseMapper.updateByCondition(id, pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
                     } else {
                         //获取WbsTreePrivate对象
-                        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getProjectId());
+                        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getProjectId(), pawDTO.getWbsId());
                         Integer wbsType = wbsInfo.getWbsType();
                         Long snowId = SnowFlakeUtil.getId();
-                        baseMapper.insertWbsTreeContract1(snowId, wbsType, pawDTO.getContractId(), wbsTreePrivate);
-                        //初始化施工台账 TODO 此处会空指针未解决
-                        if (wbsTreePrivate.getDeptCategory() == 6
-                                && wbsTreePrivate.getDeptCategory() != null) {
-                            ConstructionLedger constructionLedger = new ConstructionLedger();
-                            constructionLedger.setIsBeton(0);
-                            constructionLedger.setWbsId(snowId);
-                            constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
-                            constructionLedgerFeign.initConstructionLedger(constructionLedger);
+                        if (wbsTreePrivate != null) {
+                            baseMapper.insertWbsTreeContract1(snowId, wbsType, pawDTO.getContractId(), wbsTreePrivate);
+                            WbsTreePrivate wbsTreePrivateParent = baseMapper.selectParent(wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getParentId());
+                            //初始化施工台账
+                            if (wbsTreePrivate.getDeptCategory() == 6) {
+                                ConstructionLedger constructionLedger = new ConstructionLedger();
+                                constructionLedger.setIsBeton(0);
+                                constructionLedger.setWbsId(snowId);
+                                constructionLedger.setSite(wbsTreePrivate.getDeptName());
+                                constructionLedger.setStation(wbsTreePrivateParent.getDeptName());
+                                constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
+                                constructionLedgerFeign.initConstructionLedger(constructionLedger);
+                            }
                         }
                     }
                 }

+ 86 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -2,7 +2,10 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -10,14 +13,22 @@ import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
+import org.springblade.manager.dto.WbsTreeDTO2;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.WbsInfo;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreePrivate;
 
+import org.springblade.manager.mapper.ContractInfoMapper;
+import org.springblade.manager.mapper.WbsInfoMapper;
+import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreePrivateVO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -25,30 +36,58 @@ import java.util.List;
 @Service
 @AllArgsConstructor
 public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMapper, WbsTreePrivate> implements IWbsTreePrivateService {
+
+    private final WbsTreeContractMapper wbsTreeContractMapper;
+    private final ContractInfoMapper contractInfoMapper;
+    private final WbsInfoMapper wbsInfoMapper;
+
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
         return ForestNodeMerger.merge(baseMapper.tree(wbsId, projectId));
     }
 
     @Override
-    public boolean submit(WbsTreePrivate dept) {
-        if (Func.isEmpty(dept.getParentId())) {
-            dept.setTenantId(AuthUtil.getTenantId());
-            dept.setParentId(BladeConstant.TOP_PARENT_ID);
-            dept.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID));
-        }
-        if (dept.getParentId() > 0) {
-            WbsTreePrivate parent = getById(dept.getParentId());
-            if (Func.toLong(dept.getParentId()) == Func.toLong(dept.getId())) {
-                throw new ServiceException("父节点不可选择自身!");
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submit(WbsTreePrivate wbsTreePrivate) {
+        if (wbsTreePrivate.getPKeyId() != null && !("").equals(wbsTreePrivate.getPKeyId())) {
+            Long pKeyId = wbsTreePrivate.getPKeyId();
+            //修改
+            int row = baseMapper.updateByPKeyId(pKeyId, wbsTreePrivate);
+            if (row > 0) {
+                WbsTreePrivate wbsTreePrivate1 = baseMapper.getByPKeyId(pKeyId);
+                //同步合同段wbs库
+                wbsTreeContractMapper.updateByCondition1(wbsTreePrivate1);
+                return true;
+            }
+        } else {
+            wbsTreePrivate.setIsDeleted(0);
+            wbsTreePrivate.setStatus(1);
+            Long pKeyId = SnowFlakeUtil.getId();
+            wbsTreePrivate.setPKeyId(pKeyId);
+            wbsTreePrivate.setWbsType(String.valueOf(1)); //默认质检
+            WbsTreePrivate parent = baseMapper.getByCondition(wbsTreePrivate.getParentId(), wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId());
+            if (parent != null) {
+                String ancestors = parent.getAncestors() + "," + wbsTreePrivate.getParentId();
+                wbsTreePrivate.setAncestors(ancestors);
+            }
+            //新增
+            int row = baseMapper.insert(wbsTreePrivate);
+            if (row > 0) {
+                //获取当前项目下所有合同段id
+                QueryWrapper<ContractInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("p_id", wbsTreePrivate.getProjectId());
+                List<ContractInfo> contractInfos = contractInfoMapper.selectList(queryWrapper);
+                WbsInfo wbsInfo = wbsInfoMapper.selectById(wbsTreePrivate.getWbsId());
+                Integer wbsType = wbsInfo.getWbsType();
+                for (ContractInfo contractInfo : contractInfos) {
+                    //同步新增合同段wbs库
+                    Long pKeyId1 = SnowFlakeUtil.getId();
+                    wbsTreeContractMapper.insertByCondition(wbsTreePrivate, contractInfo.getId(), pKeyId1, wbsType);
+                }
+                return true;
             }
-            dept.setTenantId(parent.getTenantId());
-            String ancestors = parent.getAncestors() + StringPool.COMMA + dept.getParentId();
-            dept.setAncestors(ancestors);
         }
-        dept.setStatus(1);
-        dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
-        return saveOrUpdate(dept);
+        return false;
     }
 
     @Override
@@ -75,14 +114,43 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return ForestNodeMerger.merge(baseMapper.lazyTree(wbsId, tenantId, parentId, projectId));
     }
 
+    @Override
+    public List<WbsTreePrivateDTO2> findWbsTreePrivateSameLevel(String projectId, String parentId, String wbsId) {
+        return baseMapper.selectNodeListByCondition(projectId, parentId, wbsId);
+    }
+
+    @Override
+    public boolean wbsTreePrivateSort(List<WbsTreePrivateDTO2> wbsTreeDTO) {
+        int number = 1;
+        for (WbsTreePrivateDTO2 wbsTree : wbsTreeDTO) {
+            wbsTree.setSort(number);
+            //修改sort
+            baseMapper.updateSortById(wbsTree.getPKeyId(), wbsTree.getSort());
+            number++;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean wbsTreePrivateTableSort(List<WbsTreePrivateDTO2> wbsTreeDTO) {
+        int number = 1;
+        for (WbsTreePrivateDTO2 wbsTree : wbsTreeDTO) {
+            wbsTree.setSort(number);
+            //修改sort
+            baseMapper.updateSortById2(wbsTree.getPKeyId(), wbsTree.getSort());
+            number++;
+        }
+        return true;
+    }
+
 
-    public List<WbsTreePrivate> findAllNodeList(String wbsTreeIds, String projectId) {
+    public List<WbsTreePrivate> findAllNodeList(String wbsTreeIds, String projectId, String wbsId) {
         String[] ids = wbsTreeIds.split(",");
         List<Long> idList = new ArrayList<>();
         List<WbsTreePrivate> list = new ArrayList<>();
         for (String id : ids) {
             idList.add(Long.valueOf(id));
-            WbsTreePrivate wbsTreePrivate = baseMapper.selectByCondition(id, projectId);
+            WbsTreePrivate wbsTreePrivate = baseMapper.selectByCondition(id, projectId, wbsId);
             list.add(wbsTreePrivate);
         }
         return list;

+ 97 - 48
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -17,6 +17,7 @@
 package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import net.sourceforge.pinyin4j.PinyinHelper;
 import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
@@ -38,12 +39,14 @@ import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsFormElementDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
+import org.springblade.manager.dto.WbsTreeDTO2;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.IWbsFormElementService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.SaveUserInfoByProjectVO;
 import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeAllListVO;
 import org.springblade.manager.vo.WbsTreeVO;
@@ -110,6 +113,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             String ancestors = parent.getAncestors() + StringPool.COMMA + dept.getParentId();
             dept.setAncestors(ancestors);
         }
+        if (dept.getMajorDataType() == null) {
+            dept.setMajorDataType(0);
+        }
         dept.setStatus(1);
         dept.setIsDeleted(BladeConstant.DB_NOT_DELETED);
         return saveOrUpdate(dept);
@@ -241,7 +247,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         queryWrapper.eq("dept_category", wbsTreeZi.getDeptCategory());
         queryWrapper.eq("project_node_id", wbsTreeZi.getProjectNodeId());
         queryWrapper.ne("ancestors", wbsTreeZi.getAncestors());
-        //todo
         WbsTree wbsTrees = baseMapper.selectOne(queryWrapper);
         //去重
         if (wbsTrees == null) {
@@ -264,6 +269,42 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return baseMapper.deleteBatchProjectNodeId(projectNodeId);
     }
 
+    @Override
+    public WbsTree selectGenNodeByWbsId(Long id) {
+        return baseMapper.selectByWbsId(id);
+    }
+
+    @Override
+    public List<WbsTree> findByWbsTreeNode(String ids) {
+        QueryWrapper<WbsTree> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("wbs_id", ids);
+        return baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public List<SaveUserInfoByProjectVO> findProjectAndContractList(Long userId) {
+        List<SaveUserInfoByProjectVO> list = baseMapper.selectListByUserId(userId);
+        return list;
+    }
+
+    @Override
+    public List<WbsTreeDTO2> findWbsTreeSameLevel(String parentId) {
+        List<WbsTreeDTO2> trees = baseMapper.selectWbsTreeListByParentId(parentId);
+        return trees;
+    }
+
+    @Override
+    public boolean wbsTreeSort(List<WbsTreeDTO2> wbsTreeList) {
+        int number = 1;
+        for (WbsTreeDTO2 wbsTree : wbsTreeList) {
+            wbsTree.setSort(number);
+            //修改sort
+            baseMapper.updateSortById(wbsTree.getId(), wbsTree.getSort());
+            number++;
+        }
+        return true;
+    }
+
 
     private boolean updateData(String ancestors, Long id) {
         Integer row = baseMapper.updateById2(ancestors, id);
@@ -277,9 +318,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     @Transactional(rollbackFor = Exception.class)
     public String submitWbsTreeInProject(WbsTreeContractDTO pawDTO) {
         String wbsTreeIds = pawDTO.getWbsTreeIds();
-        if (StringUtils.isEmpty(wbsTreeIds)) {
+        /*if (StringUtils.isEmpty(wbsTreeIds)) {
             return "1";
-        }
+        }*/
         String[] ids = wbsTreeIds.split(",");
         List<String> idList1 = Arrays.asList(ids);
         List<String> idList2 = new ArrayList<>();
@@ -293,7 +334,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             idList2.add(String.valueOf(wbsTreePrivate.getId()));
         }
         List<String> diffrent = WbsTreeContractServiceImpl.getDiffrent(idList1, idList2);
-        diffrent.forEach(System.out::print);
         if (diffrent.size() == 0) {
             List<String> tableId1 = new ArrayList<>();
             List<String> tableId2 = new ArrayList<>();
@@ -301,7 +341,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<WbsTree> allNodeList = findAllNodeList(wbsTreeIds);
             List<WbsTree> wbsTreeListAll = new ArrayList<>();
             for (WbsTree wbsTree : allNodeList) {
-                System.out.println("wbsTree.getId" + wbsTree.getId());
                 QueryWrapper<WbsTree> queryWrapper1 = new QueryWrapper<>();
                 queryWrapper1.eq("wbs_id", pawDTO.getWbsId());
                 queryWrapper1.eq("type", 2);
@@ -330,7 +369,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     for (String tableId : diffrent1) {
                         WbsTree wbsTree = wbsTreeMapper.selectById(tableId);
                         Long snowId1 = SnowFlakeUtil.getId();
-                        wbsTreePrivateMapper.insertCombination1(snowId1, wbsTree, pawDTO.getProjectId());
+                        wbsTreePrivateMapper.insertCombination1(snowId1, wbsTree, pawDTO.getWbsType(), pawDTO.getProjectId());
                     }
                     return "3";
                 }
@@ -347,62 +386,68 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         //修改该节点下元素表
                         wbsTreePrivateMapper.updateTableByCondition(id, pawDTO.getProjectId(), pawDTO.getWbsId());
                     } else {
-                        //引用WBS公共库节点
-                        WbsTree wbsTree = wbsTreeMapper.selectById(id);
-                        if (wbsTree != null) {
-                            Long snowId = SnowFlakeUtil.getId();
-                            wbsTreePrivateMapper.insertCombination1(snowId, wbsTree, pawDTO.getProjectId());
-                            //查询该节点下是否有元素表
-                            Long tableParentId = wbsTree.getId();
-                            List<WbsTree> wbsTreeTableList = wbsTreeMapper.selectIsTable(tableParentId);
-                            if (wbsTreeTableList.size() > 0) {
-                                //新增元素表
-                                for (WbsTree tree : wbsTreeTableList) {
-                                    //判重
-                                    QueryWrapper<WbsTreePrivate> queryWrapper1 = new QueryWrapper<>();
-                                    queryWrapper1.eq("id", tree.getId());
-                                    queryWrapper1.eq("wbs_id", pawDTO.getWbsId());
-                                    queryWrapper1.eq("project_id", pawDTO.getProjectId());
-                                    WbsTreePrivate wbsTreePrivates1 = wbsTreePrivateMapper.selectOne(queryWrapper1);
-                                    if (wbsTreePrivates1 == null) {
-                                        Long snowId1 = SnowFlakeUtil.getId();
-                                        wbsTreePrivateMapper.insertCombination1(snowId1, tree, pawDTO.getProjectId());
+                        //引用WBS公共库
+                        if (pawDTO.getReferenceType().equals("public")) {
+                            WbsTree wbsTree = wbsTreeMapper.selectById(id);
+                            if (wbsTree != null) {
+                                Long snowId = SnowFlakeUtil.getId();
+                                wbsTreePrivateMapper.insertCombination1(snowId, wbsTree, pawDTO.getWbsType(), pawDTO.getProjectId());
+                                //查询该节点下是否有元素表
+                                Long tableParentId = wbsTree.getId();
+                                List<WbsTree> wbsTreeTableList = wbsTreeMapper.selectIsTable(tableParentId);
+                                if (wbsTreeTableList.size() > 0) {
+                                    //新增元素表
+                                    for (WbsTree tree : wbsTreeTableList) {
+                                        //判重
+                                        QueryWrapper<WbsTreePrivate> queryWrapper1 = new QueryWrapper<>();
+                                        queryWrapper1.eq("id", tree.getId());
+                                        queryWrapper1.eq("wbs_id", pawDTO.getWbsId());
+                                        queryWrapper1.eq("project_id", pawDTO.getProjectId());
+                                        queryWrapper1.eq("parent_id", tree.getParentId());
+                                        queryWrapper1.eq("dept_name", tree.getDeptName());
+                                        queryWrapper1.eq("type", 2);
+                                        WbsTreePrivate wbsTreePrivates1 = wbsTreePrivateMapper.selectOne(queryWrapper1);
+                                        System.out.println(wbsTreePrivates1 + " wbsTreePrivates1 ");
+                                        if (wbsTreePrivates1 == null) {
+                                            Long snowId1 = SnowFlakeUtil.getId();
+                                            wbsTreePrivateMapper.insertCombination1(snowId1, tree, pawDTO.getWbsType(), pawDTO.getProjectId());
+                                        }
                                     }
                                 }
+                                //保存引用模板id、类型
+                                projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                             }
-                            //保存引用模板id
-                            projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getWbsId());
-                            pawDTO.setTemplateProjectId(pawDTO.getWbsId());
-                        }
-                        //引用项目WBS私有库节点
-                        WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getTemplateProjectId());
-                        if (wbsTreePrivate1 != null) {
+                        } else if (pawDTO.getReferenceType().equals("private")) {
+                            //引用项目WBS私有库 通过referencePrivateWbsProjectId 查询引用的私有库
+                            WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getWbsId(), pawDTO.getReferencePrivateWbsProjectId());
+                            //引用的私有库根节点primaryKeyId,赋值给新增的私有树wbsId字段
+                            String wbsId = String.valueOf(pawDTO.getPrimaryKeyId());
+                            wbsTreePrivate1.setWbsId(wbsId);
                             Long snowId = SnowFlakeUtil.getId();
-                            wbsTreePrivateMapper.insertCombination2(snowId, wbsTreePrivate1, pawDTO.getProjectId());
+                            wbsTreePrivateMapper.insertCombination2(snowId, wbsTreePrivate1, pawDTO.getProjectId());  //pawDTO.getProjectId() 为当前项目id
                             //查询该节点下是否有元素表
-                            Long tableParentId = wbsTreePrivate1.getId();
-                            List<WbsTree> wbsTreeTableList = wbsTreePrivateMapper.selectIsTable(tableParentId);
+                            List<WbsTree> wbsTreeTableList = wbsTreePrivateMapper.selectIsTable(wbsTreePrivate1.getId(), pawDTO.getReferencePrivateWbsProjectId());
                             if (wbsTreeTableList.size() > 0) {
                                 for (WbsTree tree : wbsTreeTableList) {
                                     //判重
-                                    QueryWrapper<WbsTreePrivate> queryWrapper1 = new QueryWrapper<>();
-                                    queryWrapper1.eq("id", tree.getId());
-                                    queryWrapper1.eq("wbs_id", pawDTO.getWbsId());
-                                    queryWrapper1.eq("project_id", pawDTO.getProjectId());
-                                    WbsTreePrivate wbsTreePrivates1 = wbsTreePrivateMapper.selectOne(queryWrapper1);
+                                    QueryWrapper<WbsTreePrivate> queryWrapper2 = new QueryWrapper<>();
+                                    queryWrapper2.eq("id", tree.getId());
+                                    queryWrapper2.eq("wbs_id", pawDTO.getWbsId());
+                                    queryWrapper2.eq("project_id", pawDTO.getProjectId());
+                                    queryWrapper2.eq("parent_id", tree.getParentId());
+                                    queryWrapper2.eq("dept_name", tree.getDeptName());
+                                    queryWrapper2.eq("type", 2);
+                                    WbsTreePrivate wbsTreePrivates1 = wbsTreePrivateMapper.selectOne(queryWrapper2);
                                     if (wbsTreePrivates1 == null) {
                                         Long snowId1 = SnowFlakeUtil.getId();
-                                        wbsTreePrivateMapper.insertCombination1(snowId1, tree, pawDTO.getProjectId());
+                                        tree.setWbsId(String.valueOf(pawDTO.getPrimaryKeyId()));
+                                        wbsTreePrivateMapper.insertCombination1(snowId1, tree, pawDTO.getWbsType(), pawDTO.getProjectId());
                                     }
-                                    Long snowId2 = SnowFlakeUtil.getId();
-                                    wbsTreePrivateMapper.insertCombination1(snowId2, tree, pawDTO.getProjectId());
                                 }
                             }
-                            //保存引用模板id
-                            projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getTemplateProjectId());
-                            pawDTO.setTemplateProjectId(pawDTO.getTemplateProjectId());
+                            //保存引用模板id、类型
+                            projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
-
                     }
                 }
             } else {
@@ -520,4 +565,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
 
+    public int updateByCondition(Long id, String wbsName, Integer status) {
+        int row = baseMapper.updateByCondition(id, wbsName, status);
+        return row;
+    }
 }

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/controller/MenuController.java

@@ -190,7 +190,7 @@ public class MenuController extends BladeController {
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "前端按钮数据", notes = "前端按钮数据")
 	public R<List<MenuVO>> buttons(BladeUser user) {
-		List<MenuVO> list = menuService.buttons(user.getRoleId());
+		List<MenuVO> list = menuService.buttons(user.getRoleId(),user.getClientId());
 		return R.data(list);
 	}
 

+ 104 - 91
blade-service/blade-system/src/main/java/org/springblade/system/controller/PostController.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.system.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -54,96 +55,108 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @Api(value = "岗位", tags = "岗位")
 public class PostController extends BladeController {
 
-	private final IPostService postService;
-
-	/**
-	 * 详情
-	 */
-	@GetMapping("/detail")
-	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "详情", notes = "传入post")
-	public R<PostVO> detail(Post post) {
-		Post detail = postService.getOne(Condition.getQueryWrapper(post));
-		return R.data(PostWrapper.build().entityVO(detail));
-	}
-
-	/**
-	 * 分页 岗位表
-	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入post")
-	public R<IPage<PostVO>> list(Post post, Query query) {
-		IPage<Post> pages = postService.page(Condition.getPage(query), Condition.getQueryWrapper(post));
-		return R.data(PostWrapper.build().pageVO(pages));
-	}
-
-
-	/**
-	 * 自定义分页 岗位表
-	 */
-	@GetMapping("/page")
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "分页", notes = "传入post")
-	public R<IPage<PostVO>> page(PostVO post, Query query) {
-		IPage<PostVO> pages = postService.selectPostPage(Condition.getPage(query), post);
-		return R.data(pages);
-	}
-
-	/**
-	 * 新增 岗位表
-	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入post")
-	public R save(@Valid @RequestBody Post post) {
-		CacheUtil.clear(SYS_CACHE);
-		return R.status(postService.save(post));
-	}
-
-	/**
-	 * 修改 岗位表
-	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入post")
-	public R update(@Valid @RequestBody Post post) {
-		CacheUtil.clear(SYS_CACHE);
-		return R.status(postService.updateById(post));
-	}
-
-	/**
-	 * 新增或修改 岗位表
-	 */
-	@PostMapping("/submit")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "新增或修改", notes = "传入post")
-	public R submit(@Valid @RequestBody Post post) {
-		CacheUtil.clear(SYS_CACHE);
-		return R.status(postService.saveOrUpdate(post));
-	}
-
-
-	/**
-	 * 删除 岗位表
-	 */
-	@PostMapping("/remove")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "逻辑删除", notes = "传入ids")
-	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		CacheUtil.clear(SYS_CACHE);
-		return R.status(postService.deleteLogic(Func.toLongList(ids)));
-	}
-
-	/**
-	 * 下拉数据源
-	 */
-	@GetMapping("/select")
-	@ApiOperationSupport(order = 8)
-	@ApiOperation(value = "下拉数据源", notes = "传入post")
-	public R<List<Post>> select(String tenantId, BladeUser bladeUser) {
-		List<Post> list = postService.list(Wrappers.<Post>query().lambda().eq(Post::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
-		return R.data(list);
-	}
+    private final IPostService postService;
+
+    /**
+     * 详情
+     */
+    @GetMapping("/detail")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "详情", notes = "传入post")
+    public R<PostVO> detail(Post post) {
+        Post detail = postService.getOne(Condition.getQueryWrapper(post));
+        return R.data(PostWrapper.build().entityVO(detail));
+    }
+
+    /**
+     * 分页 岗位表
+     */
+    @GetMapping("/list")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "分页", notes = "传入post")
+    public R<IPage<PostVO>> list(Post post, Query query) {
+        IPage<Post> pages = postService.page(Condition.getPage(query), Condition.getQueryWrapper(post));
+        return R.data(PostWrapper.build().pageVO(pages));
+    }
+
+
+    /**
+     * 自定义分页 岗位表
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "分页", notes = "传入post")
+    public R<IPage<PostVO>> page(PostVO post, Query query) {
+        IPage<PostVO> pages = postService.selectPostPage(Condition.getPage(query), post);
+        return R.data(pages);
+    }
+
+    /**
+     * 新增 岗位表
+     */
+    @PostMapping("/save")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增", notes = "传入post")
+    public R save(@Valid @RequestBody Post post) {
+        CacheUtil.clear(SYS_CACHE);
+        return R.status(postService.save(post));
+    }
+
+    /**
+     * 修改 岗位表
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "修改", notes = "传入post")
+    public R update(@Valid @RequestBody Post post) {
+        CacheUtil.clear(SYS_CACHE);
+        return R.status(postService.updateById(post));
+    }
+
+    /**
+     * 新增或修改 岗位表
+     */
+    @PostMapping("/submit")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "新增或修改", notes = "传入post")
+    public R submit(@Valid @RequestBody Post post) {
+        CacheUtil.clear(SYS_CACHE);
+        return R.status(postService.saveOrUpdate(post));
+    }
+
+
+    /**
+     * 删除 岗位表
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        CacheUtil.clear(SYS_CACHE);
+        return R.status(postService.deleteLogic(Func.toLongList(ids)));
+    }
+
+    /**
+     * 下拉数据源
+     */
+    @GetMapping("/select")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "下拉数据源", notes = "传入post")
+    public R<List<Post>> select(String tenantId, BladeUser bladeUser) {
+        List<Post> list = postService.list(Wrappers.<Post>query().lambda().eq(Post::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
+        return R.data(list);
+    }
+
+    /**
+     * 根据类型查询岗位
+     */
+    @GetMapping("/findPostByType")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "根据类型查询岗位", notes = "传入岗位类型category")
+    public R<List<Post>> findPostByType(Integer category) {
+        List<Post> list = postService.list(Wrappers.<Post>query().lambda().eq(Post::getCategory, category));
+        return R.data(list);
+    }
+
 
 }

+ 9 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.java

@@ -165,7 +165,7 @@ public interface MenuMapper extends BaseMapper<Menu> {
 	 *
 	 * @return
 	 */
-	List<Menu> allButtons();
+	List<Menu> allButtons(String clientId);
 
 	/**
 	 * 按钮树形结构
@@ -175,6 +175,14 @@ public interface MenuMapper extends BaseMapper<Menu> {
 	 */
 	List<Menu> buttons(List<Long> roleId);
 
+	/**
+	 * 按钮树形结构
+	 *
+	 * @param roleId
+	 * @return
+	 */
+	List<Menu> buttonsByClientId(List<Long> roleId,String clientId);
+
 	/**
 	 * 获取配置的角色权限
 	 *

+ 51 - 1
blade-service/blade-system/src/main/java/org/springblade/system/mapper/MenuMapper.xml

@@ -174,7 +174,8 @@
             path,
             source,
             action,
-            sort
+            sort,
+            text_info
         FROM
             blade_menu
         WHERE
@@ -182,6 +183,7 @@
                 category = 2 OR id IN ( SELECT parent_id FROM blade_menu WHERE is_deleted = 0 AND category = 2 )
             )
           AND is_deleted = 0
+          and sys_id =(SELECT id from blade_client where client_id=#{param1})
         ORDER BY sort
     </select>
 
@@ -230,6 +232,54 @@
         ) menu ORDER BY sort
     </select>
 
+    <select id="buttonsByClientId" resultMap="menuResultMap">
+        SELECT * FROM (
+        SELECT
+        id,
+        parent_id,
+        code,
+        name,
+        alias,
+        path,
+        source,
+        action,
+        sort
+        FROM
+        blade_menu
+        WHERE
+        is_deleted = 0 and id IN (
+        SELECT parent_id FROM blade_menu
+        WHERE ( category = 2 AND id IN ( SELECT menu_id FROM blade_role_menu WHERE role_id IN
+        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        ) ) )
+        and sys_id =(SELECT id from blade_client where client_id=#{param2})
+
+        UNION ALL
+
+        SELECT
+        id,
+        parent_id,
+        code,
+        name,
+        alias,
+        path,
+        source,
+        action,
+        sort
+        FROM
+        blade_menu
+        WHERE
+        is_deleted = 0 and  category = 2 AND id IN ( SELECT menu_id FROM blade_role_menu WHERE role_id IN
+        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>)
+        and sys_id =(SELECT id from blade_client where client_id=#{param2})
+        ) menu ORDER BY sort
+    </select>
+
+
     <select id="grantTree" resultMap="treeNodeResultMap">
         select id, parent_id, name as title, id as "value", id as "key" from blade_menu where is_deleted = 0 order by sort
     </select>

+ 8 - 7
blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java

@@ -60,13 +60,14 @@ public interface IMenuService extends IService<Menu> {
 	 */
 	List<MenuVO> routes(String roleId, Long topMenuId,String sysType);
 
-	/**
-	 * 按钮树形结构
-	 *
-	 * @param roleId
-	 * @return
-	 */
-	List<MenuVO> buttons(String roleId);
+	///**
+	//	 * 按钮树形结构
+	//	 *
+	//	 * @param roleId
+	//	 * @param systype
+	//	 * @return
+	//	 */
+	List<MenuVO> buttons(String roleId,String clientId);
 
 	/**
 	 * 树形结构

+ 3 - 2
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java

@@ -134,9 +134,10 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
 		}
 	}
 
+
 	@Override
-	public List<MenuVO> buttons(String roleId) {
-		List<Menu> buttons = (AuthUtil.isAdministrator()) ? baseMapper.allButtons() : baseMapper.buttons(Func.toLongList(roleId));
+	public List<MenuVO> buttons(String roleId,String clientId) {
+		List<Menu> buttons = (AuthUtil.isAdministrator()) ? baseMapper.allButtons(clientId) : baseMapper.buttonsByClientId(Func.toLongList(roleId),clientId);
 		MenuWrapper menuWrapper = new MenuWrapper();
 		return menuWrapper.listNodeVO(buttons);
 	}

+ 31 - 29
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PostServiceImpl.java

@@ -38,37 +38,39 @@ import java.util.stream.Collectors;
 @Service
 public class PostServiceImpl extends BaseServiceImpl<PostMapper, Post> implements IPostService {
 
-	@Override
-	public IPage<PostVO> selectPostPage(IPage<PostVO> page, PostVO post) {
-		return page.setRecords(baseMapper.selectPostPage(page, post));
-	}
+    @Override
+    public IPage<PostVO> selectPostPage(IPage<PostVO> page, PostVO post) {
+        return page.setRecords(baseMapper.selectPostPage(page, post));
+    }
 
-	@Override
-	public String getPostIds(String tenantId, String postNames) {
-		List<Post> postList = baseMapper.selectList(Wrappers.<Post>query().lambda().eq(Post::getTenantId, tenantId).in(Post::getPostName, Func.toStrList(postNames)));
-		if (postList != null && postList.size() > 0) {
-			return postList.stream().map(post -> Func.toStr(post.getId())).distinct().collect(Collectors.joining(","));
-		}
-		return null;
-	}
+    @Override
+    public String getPostIds(String tenantId, String postNames) {
+        List<Post> postList = baseMapper.selectList(Wrappers.<Post>query().lambda().eq(Post::getTenantId, tenantId).in(Post::getPostName, Func.toStrList(postNames)));
+        if (postList != null && postList.size() > 0) {
+            return postList.stream().map(post -> Func.toStr(post.getId())).distinct().collect(Collectors.joining(","));
+        }
+        return null;
+    }
+
+    @Override
+    public String getPostIdsByFuzzy(String tenantId, String postNames) {
+        LambdaQueryWrapper<Post> queryWrapper = Wrappers.<Post>query().lambda().eq(Post::getTenantId, tenantId);
+        queryWrapper.and(wrapper -> {
+            List<String> names = Func.toStrList(postNames);
+            names.forEach(name -> wrapper.like(Post::getPostName, name).or());
+        });
+        List<Post> postList = baseMapper.selectList(queryWrapper);
+        if (postList != null && postList.size() > 0) {
+            return postList.stream().map(post -> Func.toStr(post.getId())).distinct().collect(Collectors.joining(","));
+        }
+        return null;
+    }
+
+    @Override
+    public List<String> getPostNames(String postIds) {
+        return baseMapper.getPostNames(Func.toLongArray(postIds));
+    }
 
-	@Override
-	public String getPostIdsByFuzzy(String tenantId, String postNames) {
-		LambdaQueryWrapper<Post> queryWrapper = Wrappers.<Post>query().lambda().eq(Post::getTenantId, tenantId);
-		queryWrapper.and(wrapper -> {
-			List<String> names = Func.toStrList(postNames);
-			names.forEach(name -> wrapper.like(Post::getPostName, name).or());
-		});
-		List<Post> postList = baseMapper.selectList(queryWrapper);
-		if (postList != null && postList.size() > 0) {
-			return postList.stream().map(post -> Func.toStr(post.getId())).distinct().collect(Collectors.joining(","));
-		}
-		return null;
-	}
 
-	@Override
-	public List<String> getPostNames(String postIds) {
-		return baseMapper.getPostNames(Func.toLongArray(postIds));
-	}
 
 }

+ 5 - 0
blade-service/blade-user/pom.xml

@@ -38,6 +38,11 @@
             <artifactId>blade-system-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-manager-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 284 - 262
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -73,267 +73,289 @@ import static org.springblade.core.cache.constant.CacheConstant.USER_CACHE;
 @AllArgsConstructor
 public class UserController {
 
-	private final IUserService userService;
-	private final BladeRedis bladeRedis;
-
-	/**
-	 * 查询单条
-	 */
-	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "查看详情", notes = "传入id")
-	@GetMapping("/detail")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<UserVO> detail(User user) {
-		User detail = userService.getOne(Condition.getQueryWrapper(user));
-		return R.data(UserWrapper.build().entityVO(detail));
-	}
-
-	/**
-	 * 查询单条
-	 */
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "查看详情", notes = "传入id")
-	@GetMapping("/info")
-	public R<UserVO> info(BladeUser user) {
-		User detail = userService.getById(user.getUserId());
-		return R.data(UserWrapper.build().entityVO(detail));
-	}
-
-	/**
-	 * 用户列表
-	 */
-	@GetMapping("/list")
-	@ApiImplicitParams({
-		@ApiImplicitParam(name = "account", value = "账号名", paramType = "query", dataType = "string"),
-		@ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
-	})
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "列表", notes = "传入account和realName")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<IPage<UserVO>> list(@ApiIgnore @RequestParam Map<String, Object> user, Query query, BladeUser bladeUser) {
-		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
-		IPage<User> pages = userService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId()) : queryWrapper);
-		return R.data(UserWrapper.build().pageVO(pages));
-	}
-
-	/**
-	 * 自定义用户列表
-	 */
-	@GetMapping("/page")
-	@ApiImplicitParams({
-		@ApiImplicitParam(name = "account", value = "账号名", paramType = "query", dataType = "string"),
-		@ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
-	})
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "列表", notes = "传入account和realName")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<IPage<UserVO>> page(@ApiIgnore User user, Query query, Long deptId, BladeUser bladeUser) {
-		IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user, deptId, (bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID) ? StringPool.EMPTY : bladeUser.getTenantId()));
-		return R.data(UserWrapper.build().pageVO(pages));
-	}
-
-	/**
-	 * 新增或修改
-	 */
-	@PostMapping("/submit")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增或修改", notes = "传入User")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R submit(@Valid @RequestBody UserDTO user) {
-		CacheUtil.clear(USER_CACHE);
-		String projectId = user.getProjectId();
-		String contractId = user.getContractId();
-		return R.status(userService.submit(user,projectId,contractId));
-	}
-
-	/**
-	 * 修改
-	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入User")
-	public R update(@Valid @RequestBody User user) {
-		CacheUtil.clear(USER_CACHE);
-		return R.status(userService.updateUser(user));
-	}
-
-	/**
-	 * 删除
-	 */
-	@PostMapping("/remove")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "删除", notes = "传入id集合")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R remove(@RequestParam String ids) {
-		CacheUtil.clear(USER_CACHE);
-		return R.status(userService.removeUser(ids));
-	}
-
-	/**
-	 * 设置菜单权限
-	 */
-	@PostMapping("/grant")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "权限设置", notes = "传入roleId集合以及menuId集合")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R grant(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds,
-				   @ApiParam(value = "roleId集合", required = true) @RequestParam String roleIds) {
-		boolean temp = userService.grant(userIds, roleIds);
-		return R.status(temp);
-	}
-
-	/**
-	 * 密码重制
-	 */
-	@PostMapping("/reset-password")
-	@ApiOperationSupport(order = 8)
-	@ApiOperation(value = "初始化密码", notes = "传入userId集合")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R resetPassword(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds) {
-		boolean temp = userService.resetPassword(userIds);
-		return R.status(temp);
-	}
-
-	/**
-	 * 修改密码
-	 */
-	@PostMapping("/update-password")
-	@ApiOperationSupport(order = 9)
-	@ApiOperation(value = "修改密码", notes = "传入密码")
-	public R updatePassword(BladeUser user, @ApiParam(value = "旧密码", required = true) @RequestParam String oldPassword,
-							@ApiParam(value = "新密码", required = true) @RequestParam String newPassword,
-							@ApiParam(value = "新密码", required = true) @RequestParam String newPassword1) {
-		boolean temp = userService.updatePassword(user.getUserId(), oldPassword, newPassword, newPassword1);
-		return R.status(temp);
-	}
-
-	/**
-	 * 修改基本信息
-	 */
-	@PostMapping("/update-info")
-	@ApiOperationSupport(order = 10)
-	@ApiOperation(value = "修改基本信息", notes = "传入User")
-	public R updateInfo(@Valid @RequestBody User user) {
-		CacheUtil.clear(USER_CACHE);
-		return R.status(userService.updateUserInfo(user));
-	}
-
-	/**
-	 * 用户列表
-	 */
-	@GetMapping("/user-list")
-	@ApiOperationSupport(order = 11)
-	@ApiOperation(value = "用户列表", notes = "传入user")
-	public R<List<User>> userList(User user, BladeUser bladeUser) {
-		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user);
-		List<User> list = userService.list((!AuthUtil.isAdministrator()) ? queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId()) : queryWrapper);
-		return R.data(list);
-	}
-
-	/**
-	 * 导入用户
-	 */
-	@PostMapping("import-user")
-	@ApiOperationSupport(order = 12)
-	@ApiOperation(value = "导入用户", notes = "传入excel")
-	public R importUser(MultipartFile file, Integer isCovered) {
-		UserImporter userImporter = new UserImporter(userService, isCovered == 1);
-		ExcelUtil.save(file, userImporter, UserExcel.class);
-		return R.success("操作成功");
-	}
-
-	/**
-	 * 导出用户
-	 */
-	@GetMapping("export-user")
-	@ApiOperationSupport(order = 13)
-	@ApiOperation(value = "导出用户", notes = "传入user")
-	public void exportUser(@ApiIgnore @RequestParam Map<String, Object> user, BladeUser bladeUser, HttpServletResponse response) {
-		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
-		if (!AuthUtil.isAdministrator()) {
-			queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId());
-		}
-		queryWrapper.lambda().eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED);
-		List<UserExcel> list = userService.exportUser(queryWrapper);
-		ExcelUtil.export(response, "用户数据" + DateUtil.time(), "用户数据表", list, UserExcel.class);
-	}
-
-	/**
-	 * 导出模板
-	 */
-	@GetMapping("export-template")
-	@ApiOperationSupport(order = 14)
-	@ApiOperation(value = "导出模板")
-	public void exportUser(HttpServletResponse response) {
-		List<UserExcel> list = new ArrayList<>();
-		ExcelUtil.export(response, "用户数据模板", "用户数据表", list, UserExcel.class);
-	}
-
-
-	/**
-	 * 第三方注册用户
-	 */
-	@PostMapping("/register-guest")
-	@ApiOperationSupport(order = 15)
-	@ApiOperation(value = "第三方注册用户", notes = "传入user")
-	public R registerGuest(User user, Long oauthId) {
-		return R.status(userService.registerGuest(user, oauthId));
-	}
-
-
-	/**
-	 * 配置用户平台信息
-	 */
-	@PostMapping("/update-platform")
-	@ApiOperationSupport(order = 16)
-	@ApiOperation(value = "配置用户平台信息", notes = "传入user")
-	public R updatePlatform(Long userId, Integer userType, String userExt) {
-		return R.status(userService.updatePlatform(userId, userType, userExt));
-	}
-
-	/**
-	 * 查看平台详情
-	 */
-	@ApiOperationSupport(order = 17)
-	@ApiOperation(value = "查看平台详情", notes = "传入id")
-	@GetMapping("/platform-detail")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<UserVO> platformDetail(User user) {
-		return R.data(userService.platformDetail(user));
-	}
-
-
-	/**
-	 * 用户列表查询
-	 */
-	@ApiImplicitParams({
-		@ApiImplicitParam(name = "name", value = "人员姓名", paramType = "query", dataType = "string"),
-		@ApiImplicitParam(name = "deptName", value = "部门名称", paramType = "query", dataType = "string"),
-		@ApiImplicitParam(name = "postName", value = "职位名称", paramType = "query", dataType = "string"),
-		@ApiImplicitParam(name = "current", value = "当前页数", paramType = "query", dataType = "int"),
-		@ApiImplicitParam(name = "size", value = "每页数量", paramType = "query", dataType = "int")
-	})
-	@ApiOperationSupport(order = 18)
-	@ApiOperation(value = "用户列表查询", notes = "用户列表查询")
-	@GetMapping("/search/user")
-	public R<IPage<UserVO>> userSearch(@ApiIgnore UserVO user, @ApiIgnore Query query) {
-		return R.data(userService.selectUserSearch(user, query));
-	}
-
-
-	/**
-	 * 用户解锁
-	 */
-	@PostMapping("/unlock")
-	@ApiOperationSupport(order = 19)
-	@ApiOperation(value = "账号解锁", notes = "传入id")
-	public R unlock(String userIds) {
-		if (StringUtil.isBlank(userIds)) {
-			return R.fail("请至少选择一个用户");
-		}
-		List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, Func.toLongList(userIds)));
-		userList.forEach(user -> bladeRedis.del(CacheNames.tenantKey(user.getTenantId(), CacheNames.USER_FAIL_KEY, user.getAccount())));
-		return R.success("操作成功");
-	}
+    private final IUserService userService;
+    private final BladeRedis bladeRedis;
+
+    /**
+     * 查询单条
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "查看详情", notes = "传入id")
+    @GetMapping("/detail")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R<UserVO> detail(User user) {
+        User detail = userService.getOne(Condition.getQueryWrapper(user));
+        return R.data(UserWrapper.build().entityVO(detail));
+    }
+
+    /**
+     * 查询单条
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "查看详情", notes = "传入id")
+    @GetMapping("/info")
+    public R<UserVO> info(BladeUser user) {
+        User detail = userService.getById(user.getUserId());
+        return R.data(UserWrapper.build().entityVO(detail));
+    }
+
+    /**
+     * 用户列表
+     */
+    @GetMapping("/list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "account", value = "账号名", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
+    })
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "列表", notes = "传入account和realName")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R<IPage<UserVO>> list(@ApiIgnore @RequestParam Map<String, Object> user, Query query, BladeUser bladeUser) {
+        QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
+        IPage<User> pages = userService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId()) : queryWrapper);
+        return R.data(UserWrapper.build().pageVO(pages));
+    }
+
+    /**
+     * 自定义用户列表
+     */
+    @GetMapping("/page")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "account", value = "账号名", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
+    })
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "列表", notes = "传入account和realName")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R<IPage<UserVO>> page(@ApiIgnore User user, Query query, Long deptId, BladeUser bladeUser) {
+        IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user, deptId, (bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID) ? StringPool.EMPTY : bladeUser.getTenantId()));
+        return R.data(UserWrapper.build().pageVO(pages));
+    }
+
+    /**
+     * 新增或修改
+     */
+    @PostMapping("/submit")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增1", notes = "传入User")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R submit(@Valid @RequestBody UserDTO user) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.submit(user));
+    }
+
+    /**
+     * 新增或修改2
+     */
+    @PostMapping("/submitTow")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增2", notes = "传入UserDTO")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R submitTow(@Valid @RequestBody UserDTO user) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.submit2(user));
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "修改", notes = "传入User")
+    public R update(@Valid @RequestBody User user) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.updateUser(user));
+    }
+
+
+    /**
+     * 修改2
+     */
+    @PostMapping("/updateTow")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "修改2", notes = "传入User")
+    public R updateTow(@Valid @RequestBody User user) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.updateUser2(user));
+    }
+
+    /**
+     * 删除
+     */
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "删除", notes = "传入id集合")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R remove(@RequestParam String ids) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.removeUser(ids));
+    }
+
+    /**
+     * 设置菜单权限
+     */
+    @PostMapping("/grant")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "权限设置", notes = "传入roleId集合以及menuId集合")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R grant(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds,
+                   @ApiParam(value = "roleId集合", required = true) @RequestParam String roleIds) {
+        boolean temp = userService.grant(userIds, roleIds);
+        return R.status(temp);
+    }
+
+    /**
+     * 密码重制
+     */
+    @PostMapping("/reset-password")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "初始化密码", notes = "传入userId集合")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R resetPassword(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds) {
+        boolean temp = userService.resetPassword(userIds);
+        return R.status(temp);
+    }
+
+    /**
+     * 修改密码
+     */
+    @PostMapping("/update-password")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "修改密码", notes = "传入密码")
+    public R updatePassword(BladeUser user, @ApiParam(value = "旧密码", required = true) @RequestParam String oldPassword,
+                            @ApiParam(value = "新密码", required = true) @RequestParam String newPassword,
+                            @ApiParam(value = "新密码", required = true) @RequestParam String newPassword1) {
+        boolean temp = userService.updatePassword(user.getUserId(), oldPassword, newPassword, newPassword1);
+        return R.status(temp);
+    }
+
+    /**
+     * 修改基本信息
+     */
+    @PostMapping("/update-info")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "修改基本信息", notes = "传入User")
+    public R updateInfo(@Valid @RequestBody User user) {
+        CacheUtil.clear(USER_CACHE);
+        return R.status(userService.updateUserInfo(user));
+    }
+
+    /**
+     * 用户列表
+     */
+    @GetMapping("/user-list")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "用户列表", notes = "传入user")
+    public R<List<User>> userList(User user, BladeUser bladeUser) {
+        QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user);
+        List<User> list = userService.list((!AuthUtil.isAdministrator()) ? queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId()) : queryWrapper);
+        return R.data(list);
+    }
+
+    /**
+     * 导入用户
+     */
+    @PostMapping("import-user")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "导入用户", notes = "传入excel")
+    public R importUser(MultipartFile file, Integer isCovered) {
+        UserImporter userImporter = new UserImporter(userService, isCovered == 1);
+        ExcelUtil.save(file, userImporter, UserExcel.class);
+        return R.success("操作成功");
+    }
+
+    /**
+     * 导出用户
+     */
+    @GetMapping("export-user")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "导出用户", notes = "传入user")
+    public void exportUser(@ApiIgnore @RequestParam Map<String, Object> user, BladeUser bladeUser, HttpServletResponse response) {
+        QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
+        if (!AuthUtil.isAdministrator()) {
+            queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId());
+        }
+        queryWrapper.lambda().eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED);
+        List<UserExcel> list = userService.exportUser(queryWrapper);
+        ExcelUtil.export(response, "用户数据" + DateUtil.time(), "用户数据表", list, UserExcel.class);
+    }
+
+    /**
+     * 导出模板
+     */
+    @GetMapping("export-template")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "导出模板")
+    public void exportUser(HttpServletResponse response) {
+        List<UserExcel> list = new ArrayList<>();
+        ExcelUtil.export(response, "用户数据模板", "用户数据表", list, UserExcel.class);
+    }
+
+
+    /**
+     * 第三方注册用户
+     */
+    @PostMapping("/register-guest")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "第三方注册用户", notes = "传入user")
+    public R registerGuest(User user, Long oauthId) {
+        return R.status(userService.registerGuest(user, oauthId));
+    }
+
+
+    /**
+     * 配置用户平台信息
+     */
+    @PostMapping("/update-platform")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "配置用户平台信息", notes = "传入user")
+    public R updatePlatform(Long userId, Integer userType, String userExt) {
+        return R.status(userService.updatePlatform(userId, userType, userExt));
+    }
+
+    /**
+     * 查看平台详情
+     */
+    @ApiOperationSupport(order = 17)
+    @ApiOperation(value = "查看平台详情", notes = "传入id")
+    @GetMapping("/platform-detail")
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+    public R<UserVO> platformDetail(User user) {
+        return R.data(userService.platformDetail(user));
+    }
+
+
+    /**
+     * 用户列表查询
+     */
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "name", value = "人员姓名", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "deptName", value = "部门名称", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "postName", value = "职位名称", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "current", value = "当前页数", paramType = "query", dataType = "int"),
+            @ApiImplicitParam(name = "size", value = "每页数量", paramType = "query", dataType = "int")
+    })
+    @ApiOperationSupport(order = 18)
+    @ApiOperation(value = "用户列表查询", notes = "用户列表查询")
+    @GetMapping("/search/user")
+    public R<IPage<UserVO>> userSearch(@ApiIgnore UserVO user, @ApiIgnore Query query) {
+        return R.data(userService.selectUserSearch(user, query));
+    }
+
+
+    /**
+     * 用户解锁
+     */
+    @PostMapping("/unlock")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "账号解锁", notes = "传入id")
+    public R unlock(String userIds) {
+        if (StringUtil.isBlank(userIds)) {
+            return R.fail("请至少选择一个用户");
+        }
+        List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, Func.toLongList(userIds)));
+        userList.forEach(user -> bladeRedis.del(CacheNames.tenantKey(user.getTenantId(), CacheNames.USER_FAIL_KEY, user.getAccount())));
+        return R.success("操作成功");
+    }
 
 }

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

@@ -77,7 +77,7 @@ public class UserClient implements IUserClient {
     @Override
     @PostMapping(SAVE_USER)
     public R<Boolean> saveUser(@RequestBody User user) {
-        return R.data(service.submit(user, null, null));
+        return R.data(service.submit(user));
     }
 
     @Override
@@ -87,9 +87,14 @@ public class UserClient implements IUserClient {
     }
 
     @Override
-	@PostMapping(RESET_USER)
-	public R resetPassword(String userIds) {
-		return 	R.status(service.resetPassword(userIds));
-	}
+    @PostMapping(RESET_USER)
+    public R resetPassword(String userIds) {
+        return R.status(service.resetPassword(userIds));
+    }
+
+    @Override
+    public User getUserStatus(String userName) {
+        return service.selectUserByUserName(userName);
+    }
 
 }

+ 1 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -18,6 +18,7 @@
         <result column="password" property="password"/>
         <result column="name" property="name"/>
         <result column="real_name" property="realName"/>
+        <result column="id_number" property="idNumber"/>
         <result column="email" property="email"/>
         <result column="phone" property="phone"/>
         <result column="birthday" property="birthday"/>

+ 191 - 170
blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
@@ -37,174 +38,194 @@ import java.util.List;
  */
 public interface IUserService extends BaseService<User> {
 
-	/**
-	 * 新增用户
-	 *
-	 * @param user
-	 * @param projectId
-	 * @param contractId
-	 * @return
-	 */
-	boolean submit(User user, String projectId, String contractId);
-
-	/**
-	 * 修改用户
-	 *
-	 * @param user
-	 * @return
-	 */
-	boolean updateUser(User user);
-
-	/**
-	 * 修改用户基本信息
-	 *
-	 * @param user
-	 * @return
-	 */
-	boolean updateUserInfo(User user);
-
-	/**
-	 * 自定义分页
-	 *
-	 * @param page
-	 * @param user
-	 * @param deptId
-	 * @param tenantId
-	 * @return
-	 */
-	IPage<User> selectUserPage(IPage<User> page, User user, Long deptId, String tenantId);
-
-	/**
-	 * 自定义分页
-	 *
-	 * @param user
-	 * @param query
-	 * @return
-	 */
-	IPage<UserVO> selectUserSearch(UserVO user, Query query);
-
-
-	/**
-	 * 用户信息
-	 *
-	 * @param userId
-	 * @return
-	 */
-	UserInfo userInfo(Long userId);
-
-	/**
-	 * 用户信息
-	 *
-	 * @param tenantId
-	 * @param account
-	 * @return
-	 */
-	UserInfo userInfo(String tenantId, String account);
-
-	/**
-	 * 用户信息
-	 *
-	 * @param tenantId
-	 * @param account
-	 * @param userEnum
-	 * @return
-	 */
-	UserInfo userInfo(String tenantId, String account, UserEnum userEnum);
-
-	/**
-	 * 用户信息
-	 *
-	 * @param userOauth
-	 * @return
-	 */
-	UserInfo userInfo(UserOauth userOauth);
-
-	/**
-	 * 根据账号获取用户
-	 *
-	 * @param tenantId
-	 * @param account
-	 * @return
-	 */
-	User userByAccount(String tenantId, String account);
-
-	/**
-	 * 给用户设置角色
-	 *
-	 * @param userIds
-	 * @param roleIds
-	 * @return
-	 */
-	boolean grant(String userIds, String roleIds);
-
-	/**
-	 * 初始化密码
-	 *
-	 * @param userIds
-	 * @return
-	 */
-	boolean resetPassword(String userIds);
-
-	/**
-	 * 修改密码
-	 *
-	 * @param userId
-	 * @param oldPassword
-	 * @param newPassword
-	 * @param newPassword1
-	 * @return
-	 */
-	boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1);
-
-	/**
-	 * 删除用户
-	 *
-	 * @param userIds
-	 * @return
-	 */
-	boolean removeUser(String userIds);
-
-	/**
-	 * 导入用户数据
-	 *
-	 * @param data
-	 * @param isCovered
-	 * @return
-	 */
-	void importUser(List<UserExcel> data, Boolean isCovered);
-
-	/**
-	 * 导出用户数据
-	 *
-	 * @param queryWrapper
-	 * @return
-	 */
-	List<UserExcel> exportUser(Wrapper<User> queryWrapper);
-
-	/**
-	 * 注册用户
-	 *
-	 * @param user
-	 * @param oauthId
-	 * @return
-	 */
-	boolean registerGuest(User user, Long oauthId);
-
-	/**
-	 * 配置用户平台
-	 *
-	 * @param userId
-	 * @param userType
-	 * @param userExt
-	 * @return
-	 */
-	boolean updatePlatform(Long userId, Integer userType, String userExt);
-
-	/**
-	 * 用户详细信息
-	 *
-	 * @param user
-	 * @return
-	 */
-	UserVO platformDetail(User user);
+    /**
+     * 新增用户1
+     *
+     * @param user
+     * @return
+     */
+    boolean submit(User user);
+
+    /**
+     * 新增用户2
+     *
+     * @param user
+     * @return
+     */
+    boolean submit2(UserDTO user);
+
+
+    /**
+     * 修改用户
+     *
+     * @param user
+     * @return
+     */
+    boolean updateUser(User user);
+
+    /**
+     * 修改用户2
+     *
+     * @param user
+     * @return
+     */
+    boolean updateUser2(User user);
+
+
+    /**
+     * 修改用户基本信息
+     *
+     * @param user
+     * @return
+     */
+    boolean updateUserInfo(User user);
+
+    /**
+     * 自定义分页
+     *
+     * @param page
+     * @param user
+     * @param deptId
+     * @param tenantId
+     * @return
+     */
+    IPage<User> selectUserPage(IPage<User> page, User user, Long deptId, String tenantId);
+
+    /**
+     * 自定义分页
+     *
+     * @param user
+     * @param query
+     * @return
+     */
+    IPage<UserVO> selectUserSearch(UserVO user, Query query);
+
+
+    /**
+     * 用户信息
+     *
+     * @param userId
+     * @return
+     */
+    UserInfo userInfo(Long userId);
+
+    /**
+     * 用户信息
+     *
+     * @param tenantId
+     * @param account
+     * @return
+     */
+    UserInfo userInfo(String tenantId, String account);
+
+    /**
+     * 用户信息
+     *
+     * @param tenantId
+     * @param account
+     * @param userEnum
+     * @return
+     */
+    UserInfo userInfo(String tenantId, String account, UserEnum userEnum);
+
+    /**
+     * 用户信息
+     *
+     * @param userOauth
+     * @return
+     */
+    UserInfo userInfo(UserOauth userOauth);
+
+    /**
+     * 根据账号获取用户
+     *
+     * @param tenantId
+     * @param account
+     * @return
+     */
+    User userByAccount(String tenantId, String account);
+
+    /**
+     * 给用户设置角色
+     *
+     * @param userIds
+     * @param roleIds
+     * @return
+     */
+    boolean grant(String userIds, String roleIds);
+
+    /**
+     * 初始化密码
+     *
+     * @param userIds
+     * @return
+     */
+    boolean resetPassword(String userIds);
+
+    /**
+     * 修改密码
+     *
+     * @param userId
+     * @param oldPassword
+     * @param newPassword
+     * @param newPassword1
+     * @return
+     */
+    boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1);
+
+    /**
+     * 删除用户
+     *
+     * @param userIds
+     * @return
+     */
+    boolean removeUser(String userIds);
+
+    /**
+     * 导入用户数据
+     *
+     * @param data
+     * @param isCovered
+     * @return
+     */
+    void importUser(List<UserExcel> data, Boolean isCovered);
+
+    /**
+     * 导出用户数据
+     *
+     * @param queryWrapper
+     * @return
+     */
+    List<UserExcel> exportUser(Wrapper<User> queryWrapper);
+
+    /**
+     * 注册用户
+     *
+     * @param user
+     * @param oauthId
+     * @return
+     */
+    boolean registerGuest(User user, Long oauthId);
+
+    /**
+     * 配置用户平台
+     *
+     * @param userId
+     * @param userType
+     * @param userExt
+     * @return
+     */
+    boolean updatePlatform(Long userId, Integer userType, String userExt);
+
+    /**
+     * 用户详细信息
+     *
+     * @param user
+     * @return
+     */
+    UserVO platformDetail(User user);
+
+
+    User selectUserByUserName(String userName);
+
 }

+ 91 - 9
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -35,6 +35,8 @@ import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.system.cache.DictCache;
 import org.springblade.system.cache.ParamCache;
 import org.springblade.system.cache.SysCache;
@@ -42,6 +44,7 @@ import org.springblade.system.entity.Tenant;
 import org.springblade.system.enums.DictEnum;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.cache.UserCache;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.*;
 import org.springblade.system.user.enums.UserEnum;
 import org.springblade.system.user.excel.UserExcel;
@@ -54,10 +57,7 @@ import org.springblade.system.user.wrapper.UserWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 
@@ -75,10 +75,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     private final IUserOauthService userOauthService;
     private final ISysClient sysClient;
     private final BladeTenantProperties tenantProperties;
+    private final ContractClient contractClient;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean submit(User user, String projectId, String contractId) {
+    public boolean submit(User user) {
         if (StringUtil.isBlank(user.getTenantId())) {
             user.setTenantId(BladeConstant.ADMIN_TENANT_ID);
         }
@@ -103,12 +105,70 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         if (userCount > 0L && Func.isEmpty(user.getId())) {
             throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
         }
-        //新增用户绑定项目合同段 TODO 需求不明未确定是否是角色与岗位一对一
-//        baseMapper.insertProjectAndContract(projectId, contractId, user.getRoleId(), user.getPostId(), user.getId());
 
         return save(user) && submitUserDept(user);
     }
 
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submit2(UserDTO user) {
+        if (StringUtil.isBlank(user.getTenantId())) {
+            user.setTenantId(BladeConstant.ADMIN_TENANT_ID);
+        }
+        String tenantId = user.getTenantId();
+        Tenant tenant = SysCache.getTenant(tenantId);
+        if (Func.isNotEmpty(tenant)) {
+            Integer accountNumber = tenant.getAccountNumber();
+            if (tenantProperties.getLicense()) {
+                String licenseKey = tenant.getLicenseKey();
+                String decrypt = DesUtil.decryptFormHex(licenseKey, TenantConstant.DES_KEY);
+                accountNumber = JsonUtil.parse(decrypt, Tenant.class).getAccountNumber();
+            }
+            Long tenantCount = baseMapper.selectCount(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId));
+            if (accountNumber != null && accountNumber > 0 && accountNumber <= tenantCount) {
+                throw new ServiceException("当前租户已到最大账号额度!");
+            }
+        }
+        if (Func.isNotEmpty(user.getPassword())) {
+            user.setPassword(DigestUtil.encrypt(user.getPassword()));
+        }
+        Long userCount = baseMapper.selectCount(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, user.getAccount()));
+        if (userCount > 0L && Func.isEmpty(user.getId())) {
+            throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
+        }
+
+        boolean b1 = save(user);
+
+        if (b1) {
+            //比较
+            if (checkContractId(user.getProjectAndUserList())) {
+                throw new ServiceException("一个合同段只允许分配一个岗位信息,请重新选择");
+            }
+            //新增用户绑定项目合同段
+            user.getProjectAndUserList().forEach((i) -> {
+                i.setUserId(String.valueOf(user.getId()));
+            });
+            contractClient.saveUserInfoByProjectThree(user.getProjectAndUserList());
+            return true;
+        }
+        throw new ServiceException("操作失败");
+    }
+
+    /**
+     * 判断List<SaveUserInfoByProjectDTO>的对象contractId是否有重复,有重复true
+     */
+    private Boolean checkContractId(List<SaveUserInfoByProjectDTO> list) {
+        Set<SaveUserInfoByProjectDTO> set = new TreeSet<SaveUserInfoByProjectDTO>
+                (Comparator.comparing(SaveUserInfoByProjectDTO::getContractId));
+        set.addAll(list);
+        if (set.size() < list.size()) {
+            return true;
+        }
+        return false;
+    }
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean updateUser(User user) {
@@ -125,6 +185,23 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         return updateUserInfo(user) && submitUserDept(user);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateUser2(User user) {
+        String tenantId = user.getTenantId();
+        Long userCount = baseMapper.selectCount(
+                Wrappers.<User>query().lambda()
+                        .eq(User::getTenantId, tenantId)
+                        .eq(User::getAccount, user.getAccount())
+                        .notIn(User::getId, user.getId())
+        );
+        if (userCount > 0L) {
+            throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
+        }
+        return updateUserInfo(user);
+    }
+
+
     @Override
     public boolean updateUserInfo(User user) {
         user.setPassword(null);
@@ -337,7 +414,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
             // 获取默认密码配置
             String initPassword = ParamCache.getValue(DEFAULT_PARAM_PASSWORD);
             user.setPassword(initPassword);
-            this.submit(user, null, null);
+            this.submit(user);
         });
     }
 
@@ -369,7 +446,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         user.setRoleId(StringPool.MINUS_ONE);
         user.setDeptId(StringPool.MINUS_ONE);
         user.setPostId(StringPool.MINUS_ONE);
-        boolean userTemp = this.submit(user, null, null);
+        boolean userTemp = this.submit(user);
         userOauth.setUserId(user.getId());
         userOauth.setTenantId(user.getTenantId());
         boolean oauthTemp = userOauthService.updateById(userOauth);
@@ -434,4 +511,9 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         return userVO;
     }
 
+    @Override
+    public User selectUserByUserName(String userName) {
+        return baseMapper.selectOne(Wrappers.<User>query().lambda().eq(User::getAccount, userName));
+    }
+
 }

+ 3 - 3
doc/nacos/blade-dev.yaml

@@ -42,9 +42,9 @@ blade:
   datasource:
     dev:
       # MySql
-      url: jdbc:mysql://localhost:3306/bladex?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
-      username: root
-      password: root
+      url: jdbc:mysql://192.168.3.19:3306/bladex?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
+      username: bladex
+      password: 68LzdwJ6p7RAGijK
       # PostgreSQL
       #url: jdbc:postgresql://127.0.0.1:5432/bladex
       #username: postgres