1. 去除强制的业务字段 insert 非空校验

2. 修复同步用户错误
3. 同步日志支持接口重跑
4. 新增部门树加载效果优化接口
5. 修复部分 post API 参数注解错误的问题
This commit is contained in:
chenbowen
2025-09-17 16:36:35 +08:00
parent 073c45ff3a
commit c9233e7053
17 changed files with 342 additions and 18 deletions

View File

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.dept;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.CompanyDeptInfo;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.api.dept.dto.*;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -88,4 +90,10 @@ public class DeptApiImpl implements DeptApi {
return success(BeanUtils.toBean(depts, DeptRespDTO.class));
}
@Override
public CommonResult<Set<CompanyDeptInfoRespDTO>> getCompanyDeptInfoListByUserId(Long userId) {
Set<CompanyDeptInfo> companyDeptInfos = deptService.getCompanyDeptInfoListByUserId(userId);
return success(BeanUtils.toBean(companyDeptInfos, CompanyDeptInfoRespDTO.class));
}
}

View File

@@ -84,6 +84,23 @@ public class DeptController {
return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
}
@GetMapping("/top-level-list")
@Operation(summary = "获取顶级部门列表", description = "用于懒加载,只返回没有父部门的顶级部门")
@PreAuthorize("@ss.hasPermission('system:dept:query')")
public CommonResult<List<DeptSimpleRespVO>> getTopLevelDeptList() {
List<DeptDO> list = deptService.getTopLevelDeptList();
return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
}
@GetMapping("/children")
@Operation(summary = "根据父部门ID获取子部门列表", description = "用于懒加载根据父部门ID返回直接子部门")
@Parameter(name = "parentId", description = "父部门ID", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:dept:query')")
public CommonResult<List<DeptSimpleRespVO>> getChildrenDeptList(@RequestParam("parentId") Long parentId) {
List<DeptDO> list = deptService.getDirectChildDeptList(parentId);
return success(BeanUtils.toBean(list, DeptSimpleRespVO.class));
}
@GetMapping("/get")
@Operation(summary = "获得部门信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")

View File

@@ -49,4 +49,13 @@ public class SyncLogController {
return success(BeanUtils.toBean(pageResult, SyncLogRespVO.class));
}
@PostMapping("/rerun")
@Operation(summary = "重新执行异常的同步接口")
@Parameter(name = "id", description = "日志编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:sync-log:rerun')")
public CommonResult<Boolean> rerunSyncLog(@RequestParam("id") Long id) {
boolean success = syncLogService.rerunSyncLog(id);
return success(success);
}
}

View File

@@ -58,6 +58,34 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
UpdateWrapper<DeptDO> wrapper = new UpdateWrapper<>();
wrapper.in("id", ids).set("tenant_id", tenantId);
update(null, wrapper);
};
}
/**
* 根据父部门ID和状态查询部门列表
*
* @param parentId 父部门ID
* @param status 状态
* @return 部门列表
*/
default List<DeptDO> selectList(Long parentId, Integer status) {
return selectList(new LambdaQueryWrapperX<DeptDO>()
.eqIfPresent(DeptDO::getParentId, parentId)
.eqIfPresent(DeptDO::getStatus, status)
);
}
/**
* 根据父部门ID和状态查询子部门列表
*
* @param parentId 父部门ID
* @param status 状态
* @return 子部门列表
*/
default List<DeptDO> selectListByParentId(Long parentId, Integer status) {
return selectList(new LambdaQueryWrapperX<DeptDO>()
.eq(DeptDO::getParentId, parentId)
.eqIfPresent(DeptDO::getStatus, status)
);
}
}

View File

@@ -118,4 +118,21 @@ public interface DeptService {
List<DeptDO> getUserCompanyList();
Set<CompanyDeptInfo> getCompanyDeptInfoListByUserId(Long userId);
/**
* 获取顶级部门列表
* 用于懒加载,只返回没有父部门的顶级部门
*
* @return 顶级部门列表
*/
List<DeptDO> getTopLevelDeptList();
/**
* 根据父部门ID获取直接子部门列表
* 用于懒加载,只返回指定父部门的直接子部门
*
* @param parentId 父部门ID
* @return 直接子部门列表
*/
List<DeptDO> getDirectChildDeptList(Long parentId);
}

View File

@@ -311,4 +311,19 @@ public class DeptServiceImpl implements DeptService {
return result;
}
@Override
public List<DeptDO> getTopLevelDeptList() {
// 获取顶级部门没有父部门的部门parentId为null或0
return deptMapper.selectList(DeptDO.PARENT_ID_ROOT, CommonStatusEnum.ENABLE.getStatus());
}
@Override
public List<DeptDO> getDirectChildDeptList(Long parentId) {
if (parentId == null) {
return Collections.emptyList();
}
// 根据父部门ID获取直接子部门只返回启用状态的部门
return deptMapper.selectListByParentId(parentId, CommonStatusEnum.ENABLE.getStatus());
}
}

View File

@@ -99,4 +99,12 @@ public interface SyncLogService {
String exceptionStack, String responseData, String encryptedResponse,
String businessResult);
/**
* 重新执行异常的同步接口
*
* @param logId 日志ID
* @return 重跑是否成功
*/
boolean rerunSyncLog(Long logId);
}

View File

@@ -24,6 +24,15 @@ import java.util.*;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
/**
* 用户同步服务实现类
*
* 注意:系统现已调整为允许用户名重复,相关调整:
* 1. deleteUser 方法改为通过用户ID直接查找和删除用户而非通过用户名
* 2. 用户创建时不再校验用户名唯一性
*
* @author ZT
*/
@Service
public class UserSyncServiceImpl implements UserSyncService {
@Resource
@@ -60,7 +69,8 @@ public class UserSyncServiceImpl implements UserSyncService {
@Override
public UserDeleteResponseVO deleteUser(UserDeleteRequestVO requestVO) {
AdminUserDO user = adminUserService.getUserByUsername(requestVO.getBimRemoteUser());
// 由于用户名可能重复,直接通过 ID 查找和删除用户
AdminUserDO user = adminUserService.getUser(requestVO.getBimUid());
UserDeleteResponseVO resp = new UserDeleteResponseVO();
resp.setBimRequestId(requestVO.getBimRequestId());
if (user != null) {

View File

@@ -52,6 +52,12 @@ import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
/**
* 后台用户 Service 实现类
*
* 注意:系统现已调整为允许用户名重复,已移除用户名唯一性校验。
* 这意味着:
* 1. 用户创建和更新时不再检查用户名是否重复
* 2. 通过用户名查询可能返回多个用户中的第一个
* 3. 建议在需要精确查找时使用用户ID或其他唯一标识
*
* @author ZT
*/
@@ -416,8 +422,8 @@ public class AdminUserServiceImpl implements AdminUserService {
return DataPermissionUtils.executeIgnore(() -> {
// 校验用户存在
AdminUserDO user = validateUserExists(id);
// 校验用户名唯一
validateUsernameUnique(id, username);
// 校验用户名唯一 - 注释掉,允许用户名重复
// validateUsernameUnique(id, username);
// 校验手机号唯一
validateMobileUnique(id, mobile);
// 校验邮箱唯一