Prechádzať zdrojové kódy

feat(staff): 添加员工平台使用范围功能

- 在 ComStaff 实体类中新增 platformRange 字段用于存储平台使用范围
- 在 ComStaffBo 和 ComStaffVo 中同步添加 platformRange 字段定义
- 在 ComStaffServiceImpl 中实现平台使用范围的同步更新逻辑
- 更新 updateByBo 方法添加事务注解并完善员工信息更新流程
- 在 SysUser 相关实体和业务类中添加 platformRange 字段支持
- 实现基于平台范围的数据权限过滤功能
- 优化供应商合同查询性能,添加多步骤分页查询逻辑
- 修复部门查询中缺少公司标识字段的过滤条件
hurx 2 dní pred
rodič
commit
afd964143f

+ 61 - 36
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContractServiceImpl.java

@@ -73,46 +73,71 @@ public class SupplierContractServiceImpl  extends ServiceImpl<SupplierContractMa
      */
     @Override
     public TableDataInfo<SupplierContractVo> queryPageList(SupplierContractBo bo, PageQuery pageQuery) {
-        // 首先从SupplierInfo表进行分页查询
+        // 1. 先查询所有有合同的供应商ID(先过滤)
+        LambdaQueryWrapper<SupplierContract> contractWrapper = Wrappers.lambdaQuery();
+        contractWrapper.select(SupplierContract::getSupplierId)
+            .isNotNull(SupplierContract::getSupplierId)
+            .groupBy(SupplierContract::getSupplierId)
+            .having("COUNT(*) > 0");
+        List<SupplierContract> contractList = baseMapper.selectList(contractWrapper);
+            
+        // 提取有合同的供应商ID集合(防止contractList为null)
+        Set<Long> supplierIdsWithContracts = (contractList == null ? new ArrayList<SupplierContract>() : contractList).stream()
+            .map(SupplierContract::getSupplierId)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet());
+            
+        // 如果没有供应商有合同,直接返回空结果
+        if (supplierIdsWithContracts.isEmpty()) {
+            Page<SupplierContractVo> emptyResult = new Page<>();
+            emptyResult.setRecords(new ArrayList<>());
+            emptyResult.setTotal(0L);
+            emptyResult.setSize(pageQuery.getPageSize());
+            emptyResult.setCurrent(pageQuery.getPageNum());
+            return TableDataInfo.build(emptyResult);
+        }
+            
+        // 2. 根据有合同的供应商ID查询供应商信息(带分页)
         LambdaQueryWrapper<SupplierInfo> supplierInfoWrapper = Wrappers.lambdaQuery();
+        supplierInfoWrapper.in(SupplierInfo::getId, supplierIdsWithContracts);
+            
+        // 添加查询条件
         if (bo.getSupplierName() != null) {
             supplierInfoWrapper.eq(SupplierInfo::getEnterpriseName, bo.getSupplierName());
         }
-        if (bo.getSupplierId()!=null){
+        if (bo.getSupplierId() != null) {
             supplierInfoWrapper.eq(SupplierInfo::getId, bo.getSupplierId());
         }
-        if (bo.getSupplierNo()!=null){
+        if (bo.getSupplierNo() != null) {
             supplierInfoWrapper.eq(SupplierInfo::getSupplierNo, bo.getSupplierNo());
         }
-
-        // 添加其他SupplierInfo表的查询条件
+            
+        // 排序
         supplierInfoWrapper.orderByDesc(SupplierInfo::getSupplierNo);
-
-        // 执行分页查询供应商信息
+            
+        // 执行分页查询
         Page<SupplierInfo> supplierPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
         IPage<SupplierInfo> supplierInfoPage = supplierInfoService.page(supplierPage, supplierInfoWrapper);
         List<SupplierInfo> supplierInfoList = supplierInfoPage.getRecords();
-
-        // 获取所有供应商ID,用于后续查询合同统计信息
-        List<Long> supplierIds = supplierInfoList.stream()
+            
+        // 3. 查询这些供应商的合同统计信息(防止supplierInfoList为null)
+        List<Long> currentSupplierIds = (supplierInfoList == null ? new ArrayList<SupplierInfo>() : supplierInfoList).stream()
             .map(SupplierInfo::getId)
+            .filter(Objects::nonNull)
             .collect(Collectors.toList());
-
-
-
-        // 查询所有供应商的合同统计信息
+            
         Map<Long, ContractCountDTO> contractStatsMap = new HashMap<>();
-        if (!supplierIds.isEmpty()) {
-            // 查询所有相关合同
-            LambdaQueryWrapper<SupplierContract> contractWrapper = Wrappers.lambdaQuery();
-            contractWrapper.in(SupplierContract::getSupplierId, supplierIds);
-            List<SupplierContract> allContracts = baseMapper.selectList(contractWrapper);
-
-            // 获取当前时间(用于判断合同是否过期)
+        if (!currentSupplierIds.isEmpty()) {
+            // 查询当前页供应商的所有合同
+            LambdaQueryWrapper<SupplierContract> pageContractWrapper = Wrappers.lambdaQuery();
+            pageContractWrapper.in(SupplierContract::getSupplierId, currentSupplierIds);
+            List<SupplierContract> pageContracts = baseMapper.selectList(pageContractWrapper);
+                
+            // 获取当前时间(用于判断合同是否过期)
             Date now = new Date();
-
+                
             // 按供应商ID分组统计合同信息
-            contractStatsMap = allContracts.stream()
+            contractStatsMap = pageContracts.stream()
                 .collect(Collectors.groupingBy(
                     SupplierContract::getSupplierId,
                     Collectors.collectingAndThen(
@@ -120,43 +145,43 @@ public class SupplierContractServiceImpl  extends ServiceImpl<SupplierContractMa
                         list -> {
                             // 统计总数
                             long total = list.size();
-                            // 统计有效期内合同数(状态为已生效 且 到期时间晚于当前时间)
+                            // 统计有效期内合同数(状态为已生效 且 到期时间晚于当前时间)
                             long validCount = list.stream()
                                 .filter(contract ->
                                     2L != (contract.getContractStatus())
                                         && contract.getContractEndTime() != null && contract.getContractEndTime().after(now)
                                 ).count();
-                            // 统计失效合同数(总数 - 有效数)
+                            // 统计失效合同数(总数 - 有效数)
                             long invalidCount = total - validCount;
                             return new ContractCountDTO(total, validCount, invalidCount);
                         }
                     )
                 ));
         }
-
-        // 将供应商信息和合同统计信息组合成VO列表
-        final Map<Long, ContractCountDTO> finalContractStatsMap = contractStatsMap; // 创建final副本
-        List<SupplierContractVo> contractStats = supplierInfoList.stream()
+            
+        // 4. 将供应商信息和合同统计信息组合成VO列表(防止supplierInfoList为null)
+        final Map<Long, ContractCountDTO> finalContractStatsMap = contractStatsMap;
+        List<SupplierContractVo> contractStats = (supplierInfoList == null ? new ArrayList<SupplierInfo>() : supplierInfoList).stream()
             .map(supplierInfo -> {
                 SupplierContractVo vo = new SupplierContractVo();
                 vo.setSupplierId(supplierInfo.getId());
                 vo.setSupplierNo(supplierInfo.getSupplierNo());
                 vo.setSupplierName(supplierInfo.getEnterpriseName());
-
-                // 获取合同统计信息,如果没有则创建默认值为0的统计对象
-                ContractCountDTO defaultCountDTO = new ContractCountDTO(0, 0, 0);
+                    
+                // 获取合同统计信息
                 ContractCountDTO countDTO = finalContractStatsMap.getOrDefault(supplierInfo.getId(),
-                    defaultCountDTO);
-
+                    new ContractCountDTO(0, 0, 0));
+                    
                 // 设置合同数统计
                 vo.setContractNum(String.valueOf(countDTO.getTotal()));
                 vo.setValidContract(String.valueOf(countDTO.getValidCount()));
                 vo.setInvalidContract(String.valueOf(countDTO.getInvalidCount()));
-
+                    
                 return vo;
             })
             .collect(Collectors.toList());
-        // 构建分页结果
+            
+        // 5. 构建分页结果
         Page<SupplierContractVo> result = new Page<>();
         result.setRecords(contractStats);
         result.setTotal(supplierInfoPage.getTotal());

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ComStaff.java

@@ -100,6 +100,11 @@ public class ComStaff extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码,总控可访问所有平台)
+     */
+    private String platformRange;
+
     /*系统用户Id*/
     private Long userId;
 

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java

@@ -118,6 +118,10 @@ public class SysUser extends TenantEntity {
     @TableField(value = "platform_code", fill = FieldFill.INSERT)
     private String platformCode;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码,总控可访问所有平台)
+     */
+    private String platformRange;
 
     public SysUser(Long userId) {
         this.userId = userId;

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ComStaffBo.java

@@ -93,6 +93,11 @@ public class ComStaffBo extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码)
+     */
+    private String platformRange;
+
 
     /*系统用户Id*/
     private Long userId;

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -128,6 +128,11 @@ public class SysUserBo extends BaseEntity {
 
     private String openId;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码)
+     */
+    private String platformRange;
+
     /**
      * 排除不查询的用户(工作流用)
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComStaffVo.java

@@ -132,5 +132,10 @@ public class ComStaffVo implements Serializable {
 
     private String roleName;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码)
+     */
+    private String platformRange;
+
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@@ -147,6 +147,11 @@ public class SysUserVo implements Serializable {
     /*平台标识*/
     private String platformCode;
 
+    /**
+     * 平台使用范围(逗号分隔的平台编码)
+     */
+    private String platformRange;
+
     private String source;
 
     private String openId;

+ 70 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.context.PlatformContext;
+import org.dromara.common.core.enums.SysPlatformCode;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.ObjectUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -228,6 +230,8 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
             String defaultPassword = "123456";
             user.setPassword(BCrypt.hashpw(defaultPassword));
             user.setUserSonType("0");
+            // 同步平台使用范围
+            user.setPlatformRange(bo.getPlatformRange());
 //            user.setRoleIds(new Long[]{bo.getRoleId()});
             SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
             int insert = sysUserMapper.insert(sysUser);
@@ -277,10 +281,53 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
      * @return 是否修改成功
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateByBo(ComStaffBo bo) {
+        // 1. 查询人员信息,获取关联的userId
+        ComStaff oldStaff = baseMapper.selectById(bo.getStaffId());
+        if (oldStaff == null) {
+            throw new RuntimeException("人员不存在");
+        }
+
+        // 2. 更新人员信息
         ComStaff update = MapstructUtils.convert(bo, ComStaff.class);
         validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        boolean flag = baseMapper.updateById(update) > 0;
+
+        // 3. 如果有关联的系统用户,同步更新用户信息
+        if (flag && oldStaff.getUserId() != null) {
+            SysUser updateUser = new SysUser();
+            updateUser.setUserId(oldStaff.getUserId());
+            
+            // 同步平台使用范围
+            if (StringUtils.isNotBlank(bo.getPlatformRange())) {
+                updateUser.setPlatformRange(bo.getPlatformRange());
+            }
+            
+            // 同步手机号
+            if (StringUtils.isNotBlank(bo.getPhone())) {
+                updateUser.setPhonenumber(bo.getPhone());
+            }
+            
+            // 同步昵称(使用人员姓名)
+            if (StringUtils.isNotBlank(bo.getStaffName())) {
+                updateUser.setNickName(bo.getStaffName());
+            }
+            
+            // 同步部门ID
+            if (bo.getDeptId() != null) {
+                updateUser.setDeptId(bo.getDeptId());
+            }
+            
+            // 同步状态
+            if (StringUtils.isNotBlank(bo.getStatus())) {
+                updateUser.setStatus(bo.getStatus());
+            }
+            
+            sysUserMapper.updateById(updateUser);
+        }
+
+        return flag;
     }
 
     /**
@@ -290,11 +337,29 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int updateStatus(ComStaffBo bo) {
-        ComStaff staff = new ComStaff();
-        staff.setStaffId(bo.getStaffId());
-        staff.setStatus(bo.getStatus());
-        return baseMapper.updateById(staff);
+        // 1. 查询人员信息,获取关联的userId
+        ComStaff staff = baseMapper.selectById(bo.getStaffId());
+        if (staff == null) {
+            throw new RuntimeException("人员不存在");
+        }
+
+        // 2. 更新人员状态
+        ComStaff updateStaff = new ComStaff();
+        updateStaff.setStaffId(bo.getStaffId());
+        updateStaff.setStatus(bo.getStatus());
+        int result = baseMapper.updateById(updateStaff);
+
+        // 3. 如果有关联的系统用户,同步更新用户状态
+        if (staff.getUserId() != null) {
+            SysUser updateUser = new SysUser();
+            updateUser.setUserId(staff.getUserId());
+            updateUser.setStatus(bo.getStatus());
+            sysUserMapper.updateById(updateUser);
+        }
+
+        return result;
     }
 
     @Override

+ 1 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -137,6 +137,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName());
         lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsCompanyFlag()), SysDept::getIsCompanyFlag, bo.getIsCompanyFlag());
         lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
             SysDept::getCreateTime, params.get("beginTime"), params.get("endTime"));
         if (ObjectUtil.isNotNull(bo.getCompanyId()) && !bo.getCompanyId().equals(0L)) {

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -105,7 +105,11 @@ public class SysUserServiceImpl implements ISysUserService {
                 List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
                 ids.add(user.getDeptId());
                 w.in(SysUser::getDeptId, ids);
-            }).orderByAsc(SysUser::getUserId);
+            })
+            // 总控平台不限制,其他平台根据 platformRange 过滤
+            .apply(!SysPlatformCode.MAIN.getCode().equals(PlatformContext.getPlatform()),
+                "FIND_IN_SET({0}, platform_range) > 0", PlatformContext.getPlatform())
+            .orderByAsc(SysUser::getUserId);
         if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
             wrapper.notIn(SysUser::getUserId, StringUtils.splitList(user.getExcludeUserIds()));
         }