Browse Source

会计发票查询优化,根据数据权限id和用户id查询当前用户是否存在该数据权限,进行关联查询

huangguoce 1 month atrás
parent
commit
3f4cf884ce

+ 7 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/factory/RoleApiFallbackFactory.java

@@ -2,6 +2,7 @@ package com.jeeplus.sys.factory;
 
 import com.jeeplus.sys.feign.IRoleApi;
 import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
@@ -48,6 +49,12 @@ public class RoleApiFallbackFactory implements FallbackFactory <IRoleApi> {
             public RoleDTO getRoleDTOByIdForApp(String id) {
                 return null;
             }
+
+            @Override
+            public boolean existsUserDataRule(UserDTO userDTO, String dataRuleId) {
+                return true;
+            }
+
         };
     }
 }

+ 9 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/feign/IRoleApi.java

@@ -3,6 +3,7 @@ package com.jeeplus.sys.feign;
 import com.jeeplus.common.constant.AppNameConstants;
 import com.jeeplus.sys.factory.RoleApiFallbackFactory;
 import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
@@ -49,4 +50,12 @@ public interface IRoleApi {
     @GetMapping(value = "/feign/sys/role/getRoleDTOByIdForApp")
     RoleDTO getRoleDTOByIdForApp(@RequestParam(value = "id") String id);
 
+    /**
+     * 传入用户id和数据权限id,判断当前用户是否具有此数据权限
+     *
+     * @return boolean
+     */
+    @PostMapping(value = "/feign/sys/role/existsUserDataRule")
+    boolean existsUserDataRule(@RequestBody UserDTO userDTO, @RequestParam(value = "dataRuleId") String dataRuleId);
+
 }

+ 2 - 0
jeeplus-common/jeeplus-common-core/src/main/java/com/jeeplus/common/constant/CacheNames.java

@@ -48,6 +48,8 @@ public interface CacheNames {
     String USER_CACHE_USER_ALL_INFO="user:cache:user:all:info";//所有的用户信息
 
     String CCPM_IS_CONNECT = "ccpm:is:connect";//是否连接ccpm系统
+    String USER_CACHE_DATA_RULE_EXISTS = "user:cache:dataRuleExists"; // 用户的数据权限
+
 
 
 }

+ 2 - 1
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/CwFinanceInvoiceMapper.java

@@ -22,7 +22,8 @@ import java.util.List;
 //@InterceptorIgnore(tenantLine = "true")
 public interface CwFinanceInvoiceMapper extends BaseMapper<CwFinanceInvoice> {
 
-    public IPage<CwFinanceInvoiceDTO> findList(Page<CwFinanceInvoiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper<CwFinanceInvoice> queryWrapper);
+    public IPage<CwFinanceInvoiceDTO> findList(Page<CwFinanceInvoiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper<CwFinanceInvoice> queryWrapper,    @Param("dataRuleFlag") boolean dataRuleFlag
+    );
 
     /**
      * 下载导出

+ 8 - 2
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/mapper/xml/CwFinanceInvoiceMapper.xml

@@ -292,7 +292,11 @@
         where fib.del_flag = '0' and fib.invoice_id = #{id}
     </select>
     <select id="findList" resultMap="BaseExportResultMap">
-        select DISTINCT a.id as 'baseId',
+        select
+        <if test="dataRuleFlag == true">
+            DISTINCT
+        </if>
+            a.id as 'baseId',
         <include refid="Base_Column_List"></include>,
         su.name as operator,
         so.name as operator_office,
@@ -325,7 +329,9 @@
         left join cw_finance_invoice_detail cfid on cfid.invoice_id = fi.id and cfid.del_flag = '0'
         left join sys_user su on fi.create_by_id = su.id and su.del_flag = '0'
         left join sys_user su1 on fi.reconciliation_people = su1.id and su1.del_flag = '0'
-        left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+        <if test="dataRuleFlag == true">
+            left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+        </if>
         left join sys_office so on su.office_id = so.id and so.del_flag = '0'
         LEFT JOIN act_ru_task d ON fi.proc_ins_id = d.PROC_INST_ID_
         LEFT JOIN cw_project_records pr on a.program_id=pr.id

+ 7 - 3
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/invoice/service/CwFinanceInvoiceService.java

@@ -361,12 +361,14 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
         IPage<CwFinanceInvoiceDTO> list = null;
         //获取当前登录人角色是否是苏州报告签字盖章代办
         UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        //根据数据权限id查询当前用户是否拥有该权限
+        boolean existsUserDataRuleFlag = SpringUtil.getBean(IRoleApi.class).existsUserDataRule(userDTO, "1680932946723803133");
         if (CollectionUtil.isNotEmpty(userDTO.getRoleDTOList())) {
             for (RoleDTO roleDTO : userDTO.getRoleDTOList()) {
                 RoleDTO dtoById = SpringUtil.getBean(IRoleApi.class).getRoleDTOById(roleDTO.getId());
                 if ("szbgqzgzdb".equals(dtoById.getEnName())) {
                     queryWrapper.orderByDesc("fi.billing_date");
-                    list = cwFinanceInvoiceMapper.findList(page, queryWrapper);
+                    list = cwFinanceInvoiceMapper.findList(page, queryWrapper,existsUserDataRuleFlag);
                     break;
                 }
             }
@@ -388,7 +390,7 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
                     }
                 });
             } else {
-                list = cwFinanceInvoiceMapper.findList(page, queryWrapper);
+                list = cwFinanceInvoiceMapper.findList(page, queryWrapper,existsUserDataRuleFlag);
             }
         }
         for (CwFinanceInvoiceDTO record : list.getRecords()) {
@@ -594,7 +596,9 @@ public class CwFinanceInvoiceService extends ServiceImpl<CwFinanceInvoiceMapper,
                 }
             });
         } else {
-            list = cwFinanceInvoiceMapper.findList(page, queryWrapper);
+            UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+            boolean existsUserDataRuleFlag = SpringUtil.getBean(IRoleApi.class).existsUserDataRule(userDTO, "1680932946723803133");
+            list = cwFinanceInvoiceMapper.findList(page, queryWrapper,existsUserDataRuleFlag);
         }
 
         return list;

+ 5 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/controller/EnrollmentRegistrationController.java

@@ -243,6 +243,11 @@ public class EnrollmentRegistrationController {
             RedisUtils.getInstance ().delete ( CacheNames.USER_CACHE_TOKEN, dto.getToken() );
             RedisUtils.getInstance ().delete ( CacheNames.USER_CACHE_ONLINE_USERS, dto.getToken() );
         }
+        String pattern = CacheNames.USER_CACHE_DATA_RULE_EXISTS + ":" + registration.getUserId() + ":*";
+        Set<String> keys = RedisUtils.getInstance().keys(pattern);
+        if (keys != null && !keys.isEmpty()) {
+            RedisUtils.getInstance().delete(keys);
+        }
         return ResponseUtil.newInstance().ok("操作成功");
     }
 

+ 6 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -851,6 +851,12 @@ public class UserController {
         }
         // 保存用户信息
         userService.saveOrUpdate(userDTO);
+        //清除当前用户缓存
+        String pattern = CacheNames.USER_CACHE_DATA_RULE_EXISTS + ":" + userDTO.getId() + ":*";
+        Set<String> keys = RedisUtils.getInstance().keys(pattern);
+        if (keys != null && !keys.isEmpty()) {
+            RedisUtils.getInstance().delete(keys);
+        }
         //清除用户缓存
         List<UserDTO> onLineUserList = SpringUtil.getBean(IUserApi.class).getOnLineUserList(userDTO.getLoginName(), "");
         for (UserDTO dto : onLineUserList) {

+ 8 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/feign/RoleApiImpl.java

@@ -3,6 +3,7 @@ package com.jeeplus.sys.feign;
 import com.jeeplus.sys.domain.Role;
 import com.jeeplus.sys.service.RoleService;
 import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.service.mapstruct.RoleWrapper;
 import com.jeeplus.sys.utils.TenantUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,4 +45,11 @@ public class RoleApiImpl implements IRoleApi {
         return RoleWrapper.INSTANCE.toDTO ( roleService.lambdaQuery ( ).eq ( Role::getId, id ).one ( ) );
 
     }
+
+    @Override
+    public boolean existsUserDataRule( UserDTO userDTO, String dataRuleId) {
+        return roleService.existsUserDataRule(userDTO,dataRuleId);
+    }
+
+
 }

+ 3 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/RoleMapper.java

@@ -81,4 +81,7 @@ public interface RoleMapper extends BaseMapper <Role> {
      */
     @InterceptorIgnore(tenantLine = "true")
     List<Role> getRoleByTenant(@Param("tenantId")String tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int existsUserDataRule(@Param("userId") String userId,@Param("dataRuleId") String dataRuleId);
 }

+ 9 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/RoleMapper.xml

@@ -63,4 +63,13 @@
         INSERT INTO sys_role_datarule(role_id, datarule_id)
         VALUES (#{roleId}, #{dataRuleId})
     </insert>
+
+    <select id="existsUserDataRule" resultType="Integer">
+        select count(1)
+        from sys_user_role sur
+                 join sys_role_datarule srd on srd.role_id = sur.role_id
+        where sur.user_id = #{userId}
+          and srd.datarule_id =  #{dataRuleId};
+    </select>
+
 </mapper>

+ 27 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/RoleService.java

@@ -4,17 +4,23 @@
 package com.jeeplus.sys.service;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.jeeplus.common.TokenProvider;
 import com.jeeplus.common.constant.CacheNames;
+import com.jeeplus.common.redis.RedisUtils;
 import com.jeeplus.sys.domain.Post;
 import com.jeeplus.sys.domain.Role;
+import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.mapper.RoleMapper;
 import com.jeeplus.sys.service.dto.RoleDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.service.mapstruct.RoleWrapper;
+import com.jeeplus.sys.utils.TenantUtils;
+import com.jeeplus.sys.utils.UserUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
@@ -175,6 +181,27 @@ public class RoleService extends ServiceImpl <RoleMapper, Role> {
     }
 
     /**
+     * 根据数据权限id查询用户是否存在当前权限
+     * @param userDTO
+     * @param dataRuleId
+     * @return
+     */
+    public boolean existsUserDataRule(UserDTO userDTO, String dataRuleId) {
+        String cacheKey = CacheNames.USER_CACHE_DATA_RULE_EXISTS +":"+ userDTO.getId() + ":" + dataRuleId;
+        Object redisValue = RedisUtils.getInstance().get(cacheKey);
+        //有结果直接return
+        if (redisValue != null) {
+            return Boolean.parseBoolean(redisValue.toString());
+        }
+        //缓存没结果就执行查询
+        boolean exists = baseMapper.existsUserDataRule(userDTO.getId(), dataRuleId) > 0;
+        //缓存1天
+        RedisUtils.getInstance().set(cacheKey, exists, 86400);
+        return exists;
+    }
+
+
+    /**
      * 根据没名称与tenantId查询角色信息
      * @return
      */