Explorar el Código

修改施工台账初始化

liuyc hace 3 años
padre
commit
e0091fea62

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

@@ -23,6 +23,12 @@ import org.springblade.core.mp.base.BaseEntity;
 @AllArgsConstructor
 public class WbsTreePrivate extends BaseEntity {
     private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long pKeyId;
+
     /**
      * 项目Id
      */

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

@@ -9,6 +9,10 @@ import java.io.Serializable;
 public class WbsTreePrivateVO2 implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 主键id
+     */
+    private String pKeyId;
     /**
      * wbsId
      */
@@ -22,4 +26,5 @@ public class WbsTreePrivateVO2 implements Serializable {
      */
     private String projectName;
 
+
 }

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

@@ -0,0 +1,23 @@
+package org.springblade.system.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+@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
+     */
+    @ApiModelProperty(name = "合同id",value = "合同id")
+    private String contractId;
+}

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

@@ -200,7 +200,7 @@ public class ProjectInfoController extends BladeController {
      * 保存或修改项目合同分配wbs树
      */
     @PostMapping("/submitWbsTreeInProject")
-    @ApiOperationSupport(order = 9)
+    @ApiOperationSupport(order = 11)
     @ApiOperation(value = "保存或修改项目合同分配wbs树", notes = "传入节点ids,wbsId(如果引用是其他私有库,那就是该库的项目id),项目id,合同段id")
     public R submitWbsTreeInProject(@RequestBody WbsTreeContractDTO pawDTO) {
         String s = wbsTreeService.submitWbsTreeInProject(pawDTO);

+ 4 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -42,10 +42,12 @@ public interface WbsTreePrivateMapper extends BaseMapper<WbsTreePrivate> {
                                 @Param("projectId") String projectId,
                                 @Param("wbsId") String wbsId);
 
-    Integer insertCombination1(@Param("wbsTree") WbsTree wbsTree,
+    Integer insertCombination1(@Param("snowId") Long snowId,
+                               @Param("wbsTree") WbsTree wbsTree,
                                @Param("projectId") String projectId);
 
-    Integer insertCombination2(@Param("wbsTree") WbsTreePrivate wbsTree,
+    Integer insertCombination2(@Param("snowId") Long snowId,
+                               @Param("wbsTree") WbsTreePrivate wbsTree,
                                @Param("projectId") String projectId);
 
     WbsTreePrivate selectByCondition1(String id, String templateProjectId);

+ 17 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -5,6 +5,7 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="wbsTreeResultMap" type="org.springblade.manager.entity.WbsTreePrivate">
         <result column="project_id" property="projectId"/>
+        <result column="p_key_id" property="pKeyId"/>
         <result column="id" property="id"/>
         <result column="w_id" property="wbsId"/>
         <result column="is_deleted" property="isDeleted"/>
@@ -35,6 +36,7 @@
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreePrivateVO2">
+        <result column="p_key_id" property="pKeyId"/>
         <result column="wbs_id" property="wbsId"/>
         <result column="project_id" property="projectId"/>
         <result column="project_name" property="projectName"/>
@@ -48,14 +50,15 @@
         <result column="key" property="key"/>
         <result column="has_children" property="hasChildren"/>
         <result column="type" property="type"/>
+        <result column="wbsType" property="wbsType"/>
     </resultMap>
     <insert id="insertCombination1">
         INSERT INTO m_wbs_tree_private(
-        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,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(
-        #{wbsTree.id},#{wbsTree.wbsId},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
+        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{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},
@@ -64,11 +67,11 @@
 
     <insert id="insertCombination2">
         INSERT INTO m_wbs_tree_private(
-        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,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(
-        #{wbsTree.id},#{wbsTree.wbsId},#{projectId},#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
+        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{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,20 +121,24 @@
 
     <select id="selectAll" resultMap="resultMap2">
         SELECT
-            wtp.wbs_id,
-            wtp.project_id,
-            ( SELECT project_name FROM m_project_info pi WHERE wtp.project_id = pi.id ) AS project_name
+        wtp.p_key_id,
+        wtp.wbs_id,
+        wtp.project_id,
+        ( SELECT project_name FROM m_project_info pi WHERE wtp.project_id = pi.id ) AS project_name
         FROM
             m_wbs_tree_private AS wtp
         WHERE
             is_deleted = 0
-            AND STATUS = 1
-        GROUP BY
+        AND STATUS = 1
+        AND parent_id = 0
+            GROUP BY
             project_id
     </select>
 
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, dept_name as title,type as "type", id as "value", id as "key" from m_wbs_tree_private
+        select 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
         is_deleted = 0
         and status = 1

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

@@ -66,16 +66,12 @@ public class WbsTreeContractServiceImpl
                         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getProjectId());
                         Integer wbsType = wbsInfo.getWbsType();
                         Long snowId = SnowFlakeUtil.getId();
-                        Integer row = baseMapper.insertWbsTreeContract1(snowId, wbsType, pawDTO.getContractId(), wbsTreePrivate);
-                        if (row > 0) {
-                            logger.info(wbsTreePrivate.getId().toString(), "初始化合同段wbs树成功");
-                        }
+                        baseMapper.insertWbsTreeContract1(snowId, wbsType, pawDTO.getContractId(), wbsTreePrivate);
                         //初始化施工台账
-                        System.out.println("wbsTreePrivate.getDeptCategory() : "+wbsTreePrivate.getDeptCategory());
                         if (wbsTreePrivate.getDeptCategory() == 6) {
                             ConstructionLedger constructionLedger = new ConstructionLedger();
                             constructionLedger.setIsBeton(0);
-                            constructionLedger.setWbsId(Long.parseLong(pawDTO.getWbsId()));
+                            constructionLedger.setWbsId(snowId);
                             constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
                             constructionLedgerFeign.initConstructionLedger(constructionLedger);
                         }

+ 31 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -19,6 +19,7 @@ package org.springblade.manager.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.log.logger.BladeLogger;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -303,7 +304,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     //同步元素表
                     for (String tableId : diffrent1) {
                         WbsTree wbsTree = wbsTreeMapper.selectById(tableId);
-                        wbsTreePrivateMapper.insertCombination1(wbsTree, pawDTO.getProjectId());
+                        Long snowId1 = SnowFlakeUtil.getId();
+                        wbsTreePrivateMapper.insertCombination1(snowId1, wbsTree, pawDTO.getProjectId());
                     }
                     return "3";
                 }
@@ -323,37 +325,60 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         //引用WBS公共库节点
                         WbsTree wbsTree = wbsTreeMapper.selectById(id);
                         if (wbsTree != null) {
-                            wbsTreePrivateMapper.insertCombination1(wbsTree, pawDTO.getProjectId());
+                            Long snowId = SnowFlakeUtil.getId();
+                            wbsTreePrivateMapper.insertCombination1(snowId, wbsTree, pawDTO.getProjectId());
                             //查询该节点下是否有元素表
                             Long tableParentId = wbsTree.getId();
                             List<WbsTree> wbsTreeTableList = wbsTreeMapper.selectIsTable(tableParentId);
-                            wbsTreeTableList.forEach(System.out::print);
                             if (wbsTreeTableList.size() > 0) {
                                 //新增元素表
                                 for (WbsTree tree : wbsTreeTableList) {
-                                    wbsTreePrivateMapper.insertCombination1(tree, pawDTO.getProjectId());
+                                    //判重
+                                    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());
+                                    }
                                 }
                             }
                             //保存引用模板id
                             projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getWbsId());
                             pawDTO.setTemplateProjectId(pawDTO.getWbsId());
                         }
+
                         //引用项目WBS私有库节点
                         WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectByCondition(id, pawDTO.getTemplateProjectId());
                         if (wbsTreePrivate1 != null) {
-                            wbsTreePrivateMapper.insertCombination2(wbsTreePrivate1, pawDTO.getProjectId());
+                            Long snowId = SnowFlakeUtil.getId();
+                            wbsTreePrivateMapper.insertCombination2(snowId, wbsTreePrivate1, pawDTO.getProjectId());
                             //查询该节点下是否有元素表
                             Long tableParentId = wbsTreePrivate1.getId();
                             List<WbsTree> wbsTreeTableList = wbsTreePrivateMapper.selectIsTable(tableParentId);
                             if (wbsTreeTableList.size() > 0) {
                                 for (WbsTree tree : wbsTreeTableList) {
-                                    wbsTreePrivateMapper.insertCombination1(tree, pawDTO.getProjectId());
+                                    //判重
+                                    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());
+                                    }
+                                    Long snowId2 = SnowFlakeUtil.getId();
+                                    wbsTreePrivateMapper.insertCombination1(snowId2, tree, pawDTO.getProjectId());
                                 }
                             }
                             //保存引用模板id
                             projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getTemplateProjectId());
                             pawDTO.setTemplateProjectId(pawDTO.getTemplateProjectId());
                         }
+
                     }
                 }
             } else {

+ 5 - 2
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -43,6 +43,7 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.excel.UserExcel;
 import org.springblade.system.user.excel.UserImporter;
@@ -138,9 +139,11 @@ public class UserController {
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "新增或修改", notes = "传入User")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R submit(@Valid @RequestBody User user) {
+	public R submit(@Valid @RequestBody UserDTO user) {
 		CacheUtil.clear(USER_CACHE);
-		return R.status(userService.submit(user));
+		String projectId = user.getProjectId();
+		String contractId = user.getContractId();
+		return R.status(userService.submit(user,projectId,contractId));
 	}
 
 	/**

+ 1 - 1
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));
+        return R.data(service.submit(user, null, null));
     }
 
     @Override

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

@@ -41,9 +41,11 @@ public interface IUserService extends BaseService<User> {
 	 * 新增用户
 	 *
 	 * @param user
+	 * @param projectId
+	 * @param contractId
 	 * @return
 	 */
-	boolean submit(User user);
+	boolean submit(User user, String projectId, String contractId);
 
 	/**
 	 * 修改用户

+ 342 - 338
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -69,365 +69,369 @@ import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSW
 @Service
 @AllArgsConstructor
 public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements IUserService {
-	private static final String GUEST_NAME = "guest";
+    private static final String GUEST_NAME = "guest";
 
-	private final IUserDeptService userDeptService;
-	private final IUserOauthService userOauthService;
-	private final ISysClient sysClient;
-	private final BladeTenantProperties tenantProperties;
+    private final IUserDeptService userDeptService;
+    private final IUserOauthService userOauthService;
+    private final ISysClient sysClient;
+    private final BladeTenantProperties tenantProperties;
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean submit(User 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()));
-		}
-		return save(user) && submitUserDept(user);
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean submit(User user, String projectId, String contractId) {
+        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()));
+        }
+        //新增用户绑定项目合同段
+//        baseMapper.insertProjectAndContract(projectId, contractId, user.getRoleId(), user.getPostId(), user.getId());
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean updateUser(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) && submitUserDept(user);
-	}
+        return save(user) && submitUserDept(user);
+    }
 
-	@Override
-	public boolean updateUserInfo(User user) {
-		user.setPassword(null);
-		return updateById(user);
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateUser(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) && submitUserDept(user);
+    }
 
-	private boolean submitUserDept(User user) {
-		List<Long> deptIdList = Func.toLongList(user.getDeptId());
-		List<UserDept> userDeptList = new ArrayList<>();
-		deptIdList.forEach(deptId -> {
-			UserDept userDept = new UserDept();
-			userDept.setUserId(user.getId());
-			userDept.setDeptId(deptId);
-			userDeptList.add(userDept);
-		});
-		userDeptService.remove(Wrappers.<UserDept>update().lambda().eq(UserDept::getUserId, user.getId()));
-		return userDeptService.saveBatch(userDeptList);
-	}
+    @Override
+    public boolean updateUserInfo(User user) {
+        user.setPassword(null);
+        return updateById(user);
+    }
 
-	@Override
-	public IPage<User> selectUserPage(IPage<User> page, User user, Long deptId, String tenantId) {
-		List<Long> deptIdList = SysCache.getDeptChildIds(deptId);
-		return page.setRecords(baseMapper.selectUserPage(page, user, deptIdList, tenantId));
-	}
+    private boolean submitUserDept(User user) {
+        List<Long> deptIdList = Func.toLongList(user.getDeptId());
+        List<UserDept> userDeptList = new ArrayList<>();
+        deptIdList.forEach(deptId -> {
+            UserDept userDept = new UserDept();
+            userDept.setUserId(user.getId());
+            userDept.setDeptId(deptId);
+            userDeptList.add(userDept);
+        });
+        userDeptService.remove(Wrappers.<UserDept>update().lambda().eq(UserDept::getUserId, user.getId()));
+        return userDeptService.saveBatch(userDeptList);
+    }
 
-	@Override
-	public IPage<UserVO> selectUserSearch(UserVO user, Query query) {
-		LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>query().lambda();
-		String tenantId = AuthUtil.getTenantId();
-		if (StringUtil.isNotBlank(tenantId)) {
-			queryWrapper.eq(User::getTenantId, tenantId);
-		}
-		if (StringUtil.isNotBlank(user.getName())) {
-			queryWrapper.like(User::getName, user.getName());
-		}
-		if (StringUtil.isNotBlank(user.getDeptName())) {
-			String deptIds = SysCache.getDeptIdsByFuzzy(AuthUtil.getTenantId(), user.getDeptName());
-			if (StringUtil.isNotBlank(deptIds)) {
-				queryWrapper.and(wrapper -> {
-					List<String> ids = Func.toStrList(deptIds);
-					ids.forEach(id -> wrapper.like(User::getDeptId, id).or());
-				});
-			}
-		}
-		if (StringUtil.isNotBlank(user.getPostName())) {
-			String postIds = SysCache.getPostIdsByFuzzy(AuthUtil.getTenantId(), user.getPostName());
-			if (StringUtil.isNotBlank(postIds)) {
-				queryWrapper.and(wrapper -> {
-					List<String> ids = Func.toStrList(postIds);
-					ids.forEach(id -> wrapper.like(User::getPostId, id).or());
-				});
-			}
-		}
-		IPage<User> pages = this.page(Condition.getPage(query), queryWrapper);
-		return UserWrapper.build().pageVO(pages);
-	}
+    @Override
+    public IPage<User> selectUserPage(IPage<User> page, User user, Long deptId, String tenantId) {
+        List<Long> deptIdList = SysCache.getDeptChildIds(deptId);
+        return page.setRecords(baseMapper.selectUserPage(page, user, deptIdList, tenantId));
+    }
 
-	@Override
-	public User userByAccount(String tenantId, String account) {
-		return baseMapper.selectOne(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, account).eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED));
-	}
+    @Override
+    public IPage<UserVO> selectUserSearch(UserVO user, Query query) {
+        LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>query().lambda();
+        String tenantId = AuthUtil.getTenantId();
+        if (StringUtil.isNotBlank(tenantId)) {
+            queryWrapper.eq(User::getTenantId, tenantId);
+        }
+        if (StringUtil.isNotBlank(user.getName())) {
+            queryWrapper.like(User::getName, user.getName());
+        }
+        if (StringUtil.isNotBlank(user.getDeptName())) {
+            String deptIds = SysCache.getDeptIdsByFuzzy(AuthUtil.getTenantId(), user.getDeptName());
+            if (StringUtil.isNotBlank(deptIds)) {
+                queryWrapper.and(wrapper -> {
+                    List<String> ids = Func.toStrList(deptIds);
+                    ids.forEach(id -> wrapper.like(User::getDeptId, id).or());
+                });
+            }
+        }
+        if (StringUtil.isNotBlank(user.getPostName())) {
+            String postIds = SysCache.getPostIdsByFuzzy(AuthUtil.getTenantId(), user.getPostName());
+            if (StringUtil.isNotBlank(postIds)) {
+                queryWrapper.and(wrapper -> {
+                    List<String> ids = Func.toStrList(postIds);
+                    ids.forEach(id -> wrapper.like(User::getPostId, id).or());
+                });
+            }
+        }
+        IPage<User> pages = this.page(Condition.getPage(query), queryWrapper);
+        return UserWrapper.build().pageVO(pages);
+    }
 
-	@Override
-	public UserInfo userInfo(Long userId) {
-		User user = baseMapper.selectById(userId);
-		return buildUserInfo(user);
-	}
+    @Override
+    public User userByAccount(String tenantId, String account) {
+        return baseMapper.selectOne(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, account).eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+    }
 
-	@Override
-	public UserInfo userInfo(String tenantId, String account) {
-		User user = baseMapper.getUser(tenantId, account);
-		return buildUserInfo(user);
-	}
+    @Override
+    public UserInfo userInfo(Long userId) {
+        User user = baseMapper.selectById(userId);
+        return buildUserInfo(user);
+    }
 
-	@Override
-	public UserInfo userInfo(String tenantId, String account, UserEnum userEnum) {
-		User user = baseMapper.getUser(tenantId, account);
-		return buildUserInfo(user, userEnum);
-	}
+    @Override
+    public UserInfo userInfo(String tenantId, String account) {
+        User user = baseMapper.getUser(tenantId, account);
+        return buildUserInfo(user);
+    }
 
-	private UserInfo buildUserInfo(User user) {
-		return buildUserInfo(user, UserEnum.WEB);
-	}
+    @Override
+    public UserInfo userInfo(String tenantId, String account, UserEnum userEnum) {
+        User user = baseMapper.getUser(tenantId, account);
+        return buildUserInfo(user, userEnum);
+    }
 
-	private UserInfo buildUserInfo(User user, UserEnum userEnum) {
-		if (ObjectUtil.isEmpty(user)) {
-			return null;
-		}
-		UserInfo userInfo = new UserInfo();
-		userInfo.setUser(user);
-		if (Func.isNotEmpty(user)) {
-			R<List<String>> result = sysClient.getRoleAliases(user.getRoleId());
-			if (result.isSuccess()) {
-				List<String> roleAlias = result.getData();
-				userInfo.setRoles(roleAlias);
-			}
-		}
-		// 根据每个用户平台,建立对应的detail表,通过查询将结果集写入到detail字段
-		Kv detail = Kv.create().set("type", userEnum.getName());
-		if (userEnum == UserEnum.WEB) {
-			UserWeb userWeb = new UserWeb();
-			UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				detail.set("ext", query.getUserExt());
-			}
-		} else if (userEnum == UserEnum.APP) {
-			UserApp userApp = new UserApp();
-			UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				detail.set("ext", query.getUserExt());
-			}
-		} else {
-			UserOther userOther = new UserOther();
-			UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				detail.set("ext", query.getUserExt());
-			}
-		}
-		userInfo.setDetail(detail);
-		return userInfo;
-	}
+    private UserInfo buildUserInfo(User user) {
+        return buildUserInfo(user, UserEnum.WEB);
+    }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public UserInfo userInfo(UserOauth userOauth) {
-		UserOauth uo = userOauthService.getOne(Wrappers.<UserOauth>query().lambda().eq(UserOauth::getUuid, userOauth.getUuid()).eq(UserOauth::getSource, userOauth.getSource()));
-		UserInfo userInfo;
-		if (Func.isNotEmpty(uo) && Func.isNotEmpty(uo.getUserId())) {
-			userInfo = this.userInfo(uo.getUserId());
-			userInfo.setOauthId(Func.toStr(uo.getId()));
-		} else {
-			userInfo = new UserInfo();
-			if (Func.isEmpty(uo)) {
-				userOauthService.save(userOauth);
-				userInfo.setOauthId(Func.toStr(userOauth.getId()));
-			} else {
-				userInfo.setOauthId(Func.toStr(uo.getId()));
-			}
-			User user = new User();
-			user.setAccount(userOauth.getUsername());
-			user.setTenantId(userOauth.getTenantId());
-			userInfo.setUser(user);
-			userInfo.setRoles(Collections.singletonList(GUEST_NAME));
-		}
-		return userInfo;
-	}
+    private UserInfo buildUserInfo(User user, UserEnum userEnum) {
+        if (ObjectUtil.isEmpty(user)) {
+            return null;
+        }
+        UserInfo userInfo = new UserInfo();
+        userInfo.setUser(user);
+        if (Func.isNotEmpty(user)) {
+            R<List<String>> result = sysClient.getRoleAliases(user.getRoleId());
+            if (result.isSuccess()) {
+                List<String> roleAlias = result.getData();
+                userInfo.setRoles(roleAlias);
+            }
+        }
+        // 根据每个用户平台,建立对应的detail表,通过查询将结果集写入到detail字段
+        Kv detail = Kv.create().set("type", userEnum.getName());
+        if (userEnum == UserEnum.WEB) {
+            UserWeb userWeb = new UserWeb();
+            UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                detail.set("ext", query.getUserExt());
+            }
+        } else if (userEnum == UserEnum.APP) {
+            UserApp userApp = new UserApp();
+            UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                detail.set("ext", query.getUserExt());
+            }
+        } else {
+            UserOther userOther = new UserOther();
+            UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                detail.set("ext", query.getUserExt());
+            }
+        }
+        userInfo.setDetail(detail);
+        return userInfo;
+    }
 
-	@Override
-	public boolean grant(String userIds, String roleIds) {
-		User user = new User();
-		user.setRoleId(roleIds);
-		return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public UserInfo userInfo(UserOauth userOauth) {
+        UserOauth uo = userOauthService.getOne(Wrappers.<UserOauth>query().lambda().eq(UserOauth::getUuid, userOauth.getUuid()).eq(UserOauth::getSource, userOauth.getSource()));
+        UserInfo userInfo;
+        if (Func.isNotEmpty(uo) && Func.isNotEmpty(uo.getUserId())) {
+            userInfo = this.userInfo(uo.getUserId());
+            userInfo.setOauthId(Func.toStr(uo.getId()));
+        } else {
+            userInfo = new UserInfo();
+            if (Func.isEmpty(uo)) {
+                userOauthService.save(userOauth);
+                userInfo.setOauthId(Func.toStr(userOauth.getId()));
+            } else {
+                userInfo.setOauthId(Func.toStr(uo.getId()));
+            }
+            User user = new User();
+            user.setAccount(userOauth.getUsername());
+            user.setTenantId(userOauth.getTenantId());
+            userInfo.setUser(user);
+            userInfo.setRoles(Collections.singletonList(GUEST_NAME));
+        }
+        return userInfo;
+    }
 
-	@Override
-	public boolean resetPassword(String userIds) {
-		User user = new User();
-		user.setPassword(DigestUtil.encrypt(CommonConstant.DEFAULT_PASSWORD));
-		user.setUpdateTime(DateUtil.now());
-		return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
-	}
+    @Override
+    public boolean grant(String userIds, String roleIds) {
+        User user = new User();
+        user.setRoleId(roleIds);
+        return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
+    }
 
-	@Override
-	public boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1) {
-		User user = getById(userId);
-		if (!newPassword.equals(newPassword1)) {
-			throw new ServiceException("请输入正确的确认密码!");
-		}
-		if (!user.getPassword().equals(DigestUtil.hex(oldPassword))) {
-			throw new ServiceException("原密码不正确!");
-		}
-		return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(newPassword)).eq(User::getId, userId));
-	}
+    @Override
+    public boolean resetPassword(String userIds) {
+        User user = new User();
+        user.setPassword(DigestUtil.encrypt(CommonConstant.DEFAULT_PASSWORD));
+        user.setUpdateTime(DateUtil.now());
+        return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
+    }
 
-	@Override
-	public boolean removeUser(String userIds) {
-		if (Func.contains(Func.toLongArray(userIds), AuthUtil.getUserId())) {
-			throw new ServiceException("不能删除本账号!");
-		}
-		return deleteLogic(Func.toLongList(userIds));
-	}
+    @Override
+    public boolean updatePassword(Long userId, String oldPassword, String newPassword, String newPassword1) {
+        User user = getById(userId);
+        if (!newPassword.equals(newPassword1)) {
+            throw new ServiceException("请输入正确的确认密码!");
+        }
+        if (!user.getPassword().equals(DigestUtil.hex(oldPassword))) {
+            throw new ServiceException("原密码不正确!");
+        }
+        return this.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(newPassword)).eq(User::getId, userId));
+    }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void importUser(List<UserExcel> data, Boolean isCovered) {
-		data.forEach(userExcel -> {
-			User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class));
-			// 设置用户平台
-			user.setUserType(Func.toInt(DictCache.getKey(DictEnum.USER_TYPE, userExcel.getUserTypeName()), 1));
-			// 设置部门ID
-			user.setDeptId(Func.toStrWithEmpty(SysCache.getDeptIds(userExcel.getTenantId(), userExcel.getDeptName()), StringPool.EMPTY));
-			// 设置岗位ID
-			user.setPostId(Func.toStrWithEmpty(SysCache.getPostIds(userExcel.getTenantId(), userExcel.getPostName()), StringPool.EMPTY));
-			// 设置角色ID
-			user.setRoleId(Func.toStrWithEmpty(SysCache.getRoleIds(userExcel.getTenantId(), userExcel.getRoleName()), StringPool.EMPTY));
-			// 设置租户ID
-			if (!AuthUtil.isAdministrator() || StringUtil.isBlank(user.getTenantId())) {
-				user.setTenantId(AuthUtil.getTenantId());
-			}
-			// 覆盖数据
-			if (isCovered) {
-				// 查询用户是否存在
-				User oldUser = UserCache.getUser(userExcel.getTenantId(), userExcel.getAccount());
-				if (oldUser != null && oldUser.getId() != null) {
-					user.setId(oldUser.getId());
-					this.updateUser(user);
-					return;
-				}
-			}
-			// 获取默认密码配置
-			String initPassword = ParamCache.getValue(DEFAULT_PARAM_PASSWORD);
-			user.setPassword(initPassword);
-			this.submit(user);
-		});
-	}
+    @Override
+    public boolean removeUser(String userIds) {
+        if (Func.contains(Func.toLongArray(userIds), AuthUtil.getUserId())) {
+            throw new ServiceException("不能删除本账号!");
+        }
+        return deleteLogic(Func.toLongList(userIds));
+    }
 
-	@Override
-	public List<UserExcel> exportUser(Wrapper<User> queryWrapper) {
-		List<UserExcel> userList = baseMapper.exportUser(queryWrapper);
-		userList.forEach(user -> {
-			user.setUserTypeName(DictCache.getValue(DictEnum.USER_TYPE, user.getUserType()));
-			user.setRoleName(StringUtil.join(SysCache.getRoleNames(user.getRoleId())));
-			user.setDeptName(StringUtil.join(SysCache.getDeptNames(user.getDeptId())));
-			user.setPostName(StringUtil.join(SysCache.getPostNames(user.getPostId())));
-		});
-		return userList;
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importUser(List<UserExcel> data, Boolean isCovered) {
+        data.forEach(userExcel -> {
+            User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class));
+            // 设置用户平台
+            user.setUserType(Func.toInt(DictCache.getKey(DictEnum.USER_TYPE, userExcel.getUserTypeName()), 1));
+            // 设置部门ID
+            user.setDeptId(Func.toStrWithEmpty(SysCache.getDeptIds(userExcel.getTenantId(), userExcel.getDeptName()), StringPool.EMPTY));
+            // 设置岗位ID
+            user.setPostId(Func.toStrWithEmpty(SysCache.getPostIds(userExcel.getTenantId(), userExcel.getPostName()), StringPool.EMPTY));
+            // 设置角色ID
+            user.setRoleId(Func.toStrWithEmpty(SysCache.getRoleIds(userExcel.getTenantId(), userExcel.getRoleName()), StringPool.EMPTY));
+            // 设置租户ID
+            if (!AuthUtil.isAdministrator() || StringUtil.isBlank(user.getTenantId())) {
+                user.setTenantId(AuthUtil.getTenantId());
+            }
+            // 覆盖数据
+            if (isCovered) {
+                // 查询用户是否存在
+                User oldUser = UserCache.getUser(userExcel.getTenantId(), userExcel.getAccount());
+                if (oldUser != null && oldUser.getId() != null) {
+                    user.setId(oldUser.getId());
+                    this.updateUser(user);
+                    return;
+                }
+            }
+            // 获取默认密码配置
+            String initPassword = ParamCache.getValue(DEFAULT_PARAM_PASSWORD);
+            user.setPassword(initPassword);
+            this.submit(user, null, null);
+        });
+    }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean registerGuest(User user, Long oauthId) {
-		Tenant tenant = SysCache.getTenant(user.getTenantId());
-		if (tenant == null || tenant.getId() == null) {
-			throw new ServiceException("租户信息错误!");
-		}
-		UserOauth userOauth = userOauthService.getById(oauthId);
-		if (userOauth == null || userOauth.getId() == null) {
-			throw new ServiceException("第三方登陆信息错误!");
-		}
-		user.setRealName(user.getName());
-		user.setAvatar(userOauth.getAvatar());
-		user.setRoleId(StringPool.MINUS_ONE);
-		user.setDeptId(StringPool.MINUS_ONE);
-		user.setPostId(StringPool.MINUS_ONE);
-		boolean userTemp = this.submit(user);
-		userOauth.setUserId(user.getId());
-		userOauth.setTenantId(user.getTenantId());
-		boolean oauthTemp = userOauthService.updateById(userOauth);
-		return (userTemp && oauthTemp);
-	}
-	@Override
-	public boolean updatePlatform(Long userId, Integer userType, String userExt) {
-		if (userType.equals(UserEnum.WEB.getCategory())) {
-			UserWeb userWeb = new UserWeb();
-			UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, userId));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userWeb.setId(query.getId());
-			}
-			userWeb.setUserId(userId);
-			userWeb.setUserExt(userExt);
-			return userWeb.insertOrUpdate();
-		} else if (userType.equals(UserEnum.APP.getCategory())) {
-			UserApp userApp = new UserApp();
-			UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, userId));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userApp.setId(query.getId());
-			}
-			userApp.setUserId(userId);
-			userApp.setUserExt(userExt);
-			return userApp.insertOrUpdate();
-		} else {
-			UserOther userOther = new UserOther();
-			UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, userId));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userOther.setId(query.getId());
-			}
-			userOther.setUserId(userId);
-			userOther.setUserExt(userExt);
-			return userOther.insertOrUpdate();
-		}
-	}
+    @Override
+    public List<UserExcel> exportUser(Wrapper<User> queryWrapper) {
+        List<UserExcel> userList = baseMapper.exportUser(queryWrapper);
+        userList.forEach(user -> {
+            user.setUserTypeName(DictCache.getValue(DictEnum.USER_TYPE, user.getUserType()));
+            user.setRoleName(StringUtil.join(SysCache.getRoleNames(user.getRoleId())));
+            user.setDeptName(StringUtil.join(SysCache.getDeptNames(user.getDeptId())));
+            user.setPostName(StringUtil.join(SysCache.getPostNames(user.getPostId())));
+        });
+        return userList;
+    }
 
-	@Override
-	public UserVO platformDetail(User user) {
-		User detail = baseMapper.selectOne(Condition.getQueryWrapper(user));
-		UserVO userVO = UserWrapper.build().entityVO(detail);
-		if (userVO.getUserType().equals(UserEnum.WEB.getCategory())) {
-			UserWeb userWeb = new UserWeb();
-			UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userVO.setUserExt(query.getUserExt());
-			}
-		} else if (userVO.getUserType().equals(UserEnum.APP.getCategory())) {
-			UserApp userApp = new UserApp();
-			UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userVO.setUserExt(query.getUserExt());
-			}
-		} else {
-			UserOther userOther = new UserOther();
-			UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, user.getId()));
-			if (ObjectUtil.isNotEmpty(query)) {
-				userVO.setUserExt(query.getUserExt());
-			}
-		}
-		return userVO;
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean registerGuest(User user, Long oauthId) {
+        Tenant tenant = SysCache.getTenant(user.getTenantId());
+        if (tenant == null || tenant.getId() == null) {
+            throw new ServiceException("租户信息错误!");
+        }
+        UserOauth userOauth = userOauthService.getById(oauthId);
+        if (userOauth == null || userOauth.getId() == null) {
+            throw new ServiceException("第三方登陆信息错误!");
+        }
+        user.setRealName(user.getName());
+        user.setAvatar(userOauth.getAvatar());
+        user.setRoleId(StringPool.MINUS_ONE);
+        user.setDeptId(StringPool.MINUS_ONE);
+        user.setPostId(StringPool.MINUS_ONE);
+        boolean userTemp = this.submit(user, null, null);
+        userOauth.setUserId(user.getId());
+        userOauth.setTenantId(user.getTenantId());
+        boolean oauthTemp = userOauthService.updateById(userOauth);
+        return (userTemp && oauthTemp);
+    }
+
+    @Override
+    public boolean updatePlatform(Long userId, Integer userType, String userExt) {
+        if (userType.equals(UserEnum.WEB.getCategory())) {
+            UserWeb userWeb = new UserWeb();
+            UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, userId));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userWeb.setId(query.getId());
+            }
+            userWeb.setUserId(userId);
+            userWeb.setUserExt(userExt);
+            return userWeb.insertOrUpdate();
+        } else if (userType.equals(UserEnum.APP.getCategory())) {
+            UserApp userApp = new UserApp();
+            UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, userId));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userApp.setId(query.getId());
+            }
+            userApp.setUserId(userId);
+            userApp.setUserExt(userExt);
+            return userApp.insertOrUpdate();
+        } else {
+            UserOther userOther = new UserOther();
+            UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, userId));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userOther.setId(query.getId());
+            }
+            userOther.setUserId(userId);
+            userOther.setUserExt(userExt);
+            return userOther.insertOrUpdate();
+        }
+    }
+
+    @Override
+    public UserVO platformDetail(User user) {
+        User detail = baseMapper.selectOne(Condition.getQueryWrapper(user));
+        UserVO userVO = UserWrapper.build().entityVO(detail);
+        if (userVO.getUserType().equals(UserEnum.WEB.getCategory())) {
+            UserWeb userWeb = new UserWeb();
+            UserWeb query = userWeb.selectOne(Wrappers.<UserWeb>lambdaQuery().eq(UserWeb::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userVO.setUserExt(query.getUserExt());
+            }
+        } else if (userVO.getUserType().equals(UserEnum.APP.getCategory())) {
+            UserApp userApp = new UserApp();
+            UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userVO.setUserExt(query.getUserExt());
+            }
+        } else {
+            UserOther userOther = new UserOther();
+            UserOther query = userOther.selectOne(Wrappers.<UserOther>lambdaQuery().eq(UserOther::getUserId, user.getId()));
+            if (ObjectUtil.isNotEmpty(query)) {
+                userVO.setUserExt(query.getUserExt());
+            }
+        }
+        return userVO;
+    }
 
 }