Browse Source

合同段人员分配调整修改、新增用户绑定项目合同

liuyc 2 years ago
parent
commit
5d5953edd7
25 changed files with 1072 additions and 666 deletions
  1. 65 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/SaveUserInfoByProject.java
  2. 9 10
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsInfo.java
  3. 26 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java
  4. 50 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SaveUserInfoByProjectVO.java
  5. 6 0
      blade-service-api/blade-user-api/pom.xml
  6. 7 8
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/UserDTO.java
  7. 60 56
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
  8. 49 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  9. 11 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  10. 51 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java
  11. 2 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  12. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsInfoMapper.xml
  13. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.java
  14. 15 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  15. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java
  16. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  17. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  18. 104 91
      blade-service/blade-system/src/main/java/org/springblade/system/controller/PostController.java
  19. 31 29
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PostServiceImpl.java
  20. 5 0
      blade-service/blade-user/pom.xml
  21. 284 262
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  22. 5 5
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  23. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  24. 189 170
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/IUserService.java
  25. 86 9
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 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;
+
+
+
+
+
+}

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

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

+ 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);
+
+
 }

+ 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;
+
+
+}

+ 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;
 
 
 }

+ 49 - 18
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)
@@ -190,18 +196,13 @@ public class ContractInfoController extends BladeController {
     }
 
     /**
-     * 根据项目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),

+ 11 - 1
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;
@@ -235,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);
+    }
 }

+ 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 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsInfoMapper.xml

@@ -42,7 +42,8 @@
         GROUP BY
         wbs_name
     </select>
-    <select id="selectById2" resultType="org.springblade.manager.entity.WbsInfo">
+
+    <select id="selectById2" resultMap="wbsInfoResultMap">
         SELECT * FROM m_wbs_info
         WHERE id = #{id}
     </select>

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

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 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.WbsTreeVO;
 
@@ -116,4 +117,6 @@ public interface WbsTreeMapper extends BaseMapper<WbsTree> {
     WbsTree selectByWbsId(Long id);
 
     int updateByCondition(@Param("id") Long id, @Param("wbsName") String wbsName, @Param("status") Integer status);
+
+    List<SaveUserInfoByProjectVO> selectListByUserId(Long userId);
 }

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

@@ -251,5 +251,20 @@
         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>
+
 
 </mapper>

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

@@ -59,4 +59,5 @@ public interface IProjectInfoService extends BaseService<ProjectInfo> {
 	ProjectInfoVO2 getOneByCondition(Long id, Long referenceWbsTemplateId, String referenceWbsTemplateType);
 
 
+
 }

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

@@ -23,6 +23,7 @@ import org.springblade.manager.dto.FormElementDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 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;
@@ -102,4 +103,6 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     List<WbsTree> findByWbsTreeNode(String ids);
 
+    List<SaveUserInfoByProjectVO> findProjectAndContractList(Long userId);
+
 }

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -44,6 +44,7 @@ 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;
@@ -278,6 +279,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return baseMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public List<SaveUserInfoByProjectVO> findProjectAndContractList(Long userId) {
+        List<SaveUserInfoByProjectVO> list = baseMapper.selectListByUserId(userId);
+        return list;
+    }
+
 
     private boolean updateData(String ancestors, Long id) {
         Integer row = baseMapper.updateById2(ancestors, id);

+ 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);
+    }
+
 
 }

+ 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));
+    }
+
+    /**
+     * 新增或修改
+     */
+    @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 = "修改", 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("操作成功");
+    }
 
 }

+ 5 - 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,9 @@ 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));
+    }
 
 }

+ 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"/>

+ 189 - 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,192 @@ 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);
+
+
 }

+ 86 - 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);