From 74472c9d22dddcb41383794caf0011043b20f817 Mon Sep 17 00:00:00 2001
From: kimi <kimi42345@gmail.com>
Date: 星期二, 31 三月 2020 13:25:47 +0800
Subject: [PATCH] fix  数据权限

---
 src/main/java/com/highdatas/mdm/service/impl/MasterAuthorServiceImpl.java |  228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 216 insertions(+), 12 deletions(-)

diff --git a/src/main/java/com/highdatas/mdm/service/impl/MasterAuthorServiceImpl.java b/src/main/java/com/highdatas/mdm/service/impl/MasterAuthorServiceImpl.java
index 6367289..1af087c 100644
--- a/src/main/java/com/highdatas/mdm/service/impl/MasterAuthorServiceImpl.java
+++ b/src/main/java/com/highdatas/mdm/service/impl/MasterAuthorServiceImpl.java
@@ -1,21 +1,22 @@
 package com.highdatas.mdm.service.impl;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
-import com.highdatas.mdm.entity.MasterAuthor;
-import com.highdatas.mdm.entity.MasterAuthorDetail;
-import com.highdatas.mdm.entity.SysField;
-import com.highdatas.mdm.entity.SysMenu;
+import com.highdatas.mdm.controller.MasterAuthorController;
+import com.highdatas.mdm.entity.*;
 import com.highdatas.mdm.mapper.MasterAuthorMapper;
+import com.highdatas.mdm.pojo.ActivitiStatus;
 import com.highdatas.mdm.pojo.MasterAuthorType;
-import com.highdatas.mdm.pojo.Result;
-import com.highdatas.mdm.service.IMasterAuthorDetailService;
-import com.highdatas.mdm.service.IMasterAuthorService;
+import com.highdatas.mdm.service.*;
 import com.highdatas.mdm.util.Constant;
+import com.highdatas.mdm.util.ContentBuilder;
 import com.highdatas.mdm.util.DbUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.MessageFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,10 +33,22 @@
     public static final String characterId = "characterId";
     @Autowired
     IMasterAuthorDetailService authorDetailService;
+    @Autowired
+    ITUserRoleService userRoleService;
+    @Autowired
+    ISysMenuService menuService;
+    @Autowired
+    ISysFieldService fieldService;
+    @Autowired
+    IMaintainFieldService maintainFieldService;
+    @Autowired
+    IMaintainService maintainService;
+    @Autowired
+    IFlowsService flowsService;
 
     @Override
-    public Result merageRoleAuthor(List<String> roleIds) {
-        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.role).in(this.characterId, roleIds));
+    public HashMap<String, MasterAuthor> merageRoleAuthor(List<String> roleIds) {
+        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds));
         HashMap<String, MasterAuthor> resultMap = new HashMap<>();
 
         for (MasterAuthor masterAuthor : masterAuthors) {
@@ -52,16 +65,207 @@
                 resultMap.put(key, preMerageMasterAuthor);
             }
         }
-        return Result.success(resultMap.values());
+        return resultMap;
     }
 
     @Override
     public List<SysMenu> getMenu(String userId) {
-        return null;
+        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.user).eq(MasterAuthorController.character_id, userId));
+        if (masterAuthors.size() == 0) {
+            //user 鑾峰彇role
+            List<TUserRole> roles = userRoleService.selectList(new EntityWrapper<TUserRole>().eq("user_id", userId));
+            List<String> roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList());
+            masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds));
+        }
+        List<String> menuIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getMenuId()).collect(Collectors.toList());
+        LinkedHashSet<String> strings = new LinkedHashSet<>(menuIds);
+        LinkedHashSet<String> byParentId = menuService.getByParentId(strings);
+        List<SysMenu> sysMenus = menuService.selectBatchIds(byParentId);
+        return sysMenus;
     }
 
     @Override
-    public List<SysField> getField(String userId) {
+    public List<SysField> getField(String userId, String maintainId) {
+        Maintain maintain = maintainService.selectById(maintainId);
+        if (maintain == null){
+            return new ArrayList<>();
+        }
+        boolean isAll = checkUnFilterAuthor(userId, maintain.getTableName());
+        if (isAll) {
+            List<SysField> total = fieldService.getFieldByMaintain(maintainId);
+            return total;
+        }
+
+        MaintainField maintainField = fieldService.getMaintainFieldByMaintain(maintainId);
+        if (maintainField == null){
+            return new ArrayList<>();
+        }
+        String maintainFieldId = maintainField.getId();
+
+        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.user).eq(MasterAuthorController.character_id, userId).eq("maintain_field_id", maintainFieldId));
+        if (masterAuthors.size() == 0) {
+            //user 鑾峰彇role
+            List<TUserRole> roles = userRoleService.selectList(new EntityWrapper<TUserRole>().eq("user_id", userId));
+            List<String> roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList());
+            masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds).eq("maintain_field_id", maintainFieldId));
+        }
+        if (masterAuthors.isEmpty()) {
+            return null;
+        }
+        List<String> authorIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getId()).collect(Collectors.toList());
+        List<MasterAuthorDetail> masterAuthorDetails = authorDetailService.selectList(new EntityWrapper<MasterAuthorDetail>().in(Constant.PARENT_ID, authorIds));
+        Set<String> codes = masterAuthorDetails.stream().map(masterAuthorDetail -> masterAuthorDetail.getField()).collect(Collectors.toSet());
+        if (codes.isEmpty()) {
+            return null;
+        }
+        Wrapper<SysField> wrapper = new EntityWrapper<SysField>().in(Constant.FIELD, codes).eq("table_name", maintain.getTableName());
+
+        if (!maintainFieldId.equalsIgnoreCase(Constant.Default)) {
+            wrapper.eq("maintain_field_id", maintainFieldId);
+        }else {
+            wrapper.isNull("maintain_field_id");
+        }
+        wrapper.orderBy("order_no");
+
+        List<SysField> fieldList = fieldService.selectList(wrapper);
+        return fieldList;
+    }
+
+    private boolean checkUnFilterAuthor(String userId, String tableName) {
+        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.user).eq(MasterAuthorController.character_id, userId).eq("table_name", tableName));
+        long isAll = masterAuthors.stream().filter(masterAuthor -> masterAuthor.getMaintainFieldId().equalsIgnoreCase(Constant.All)).count();
+        if (isAll > 0) {
+            return true;
+        }
+        if (!masterAuthors.isEmpty()) {
+            return false;
+        }
+        Set<String> roleByUser = DbUtils.getRoleByUser(userId);
+        isAll = selectCount(new EntityWrapper<MasterAuthor>().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleByUser).eq("table_name", tableName).eq("maintain_field_id", Constant.All_UPCASE));
+        if (isAll > 0) {
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean checkMaintainAuthor(String userId, String maintainId) {
+        Maintain maintain = maintainService.selectById(maintainId);
+        if (maintain == null) {
+            return false;
+        }
+        int checked = 0;
+        boolean isAll = checkUnFilterAuthor(userId, maintain.getTableName());
+        if (isAll){
+            return true;
+
+        }
+        MaintainField maintainField = fieldService.getMaintainFieldByMaintain(maintainId);
+        if (maintainField == null) {
+            return false;
+        }
+        //get user author
+        checked = selectCount(new EntityWrapper<MasterAuthor>()
+                .eq(Constant.TYPE, MasterAuthorType.user)
+                .eq(MasterAuthorController.character_id, userId)
+                .eq("table_name", maintain.getTableName())
+                .eq("maintain_field_id", maintainField.getId()));
+        if (checked > 0) {
+            return true;
+        }
+        List<TUserRole> roles = userRoleService.selectList(new EntityWrapper<TUserRole>().eq("user_id", userId));
+        Set<String> collect = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toSet());
+        checked = selectCount(new EntityWrapper<MasterAuthor>()
+                .eq(Constant.TYPE, MasterAuthorType.role)
+                .in(MasterAuthorController.character_id, collect)
+                .eq("table_name", maintain.getTableName())
+                .eq("maintain_field_id", maintainField.getId()));
+        if (checked > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public String getFilter(String userId, String maintainId) {
+        Maintain maintain = maintainService.selectById(maintainId);
+        if (maintain == null){
+            return Constant.WHERE_DEFAULTUN;
+        }
+        boolean isAll = checkUnFilterAuthor(userId, maintain.getTableName());
+        if (isAll) {
+            return Constant.WHERE_DEFAULT;
+        }
+        MaintainField maintainField = fieldService.getMaintainFieldByMaintain(maintainId);
+        String maintainFieldId = maintainField.getId();
+
+        List<MasterAuthor> masterAuthors = selectList(new EntityWrapper<MasterAuthor>()
+                .eq("table_name", maintain.getTableName())
+                .eq(Constant.TYPE, MasterAuthorType.user).eq(MasterAuthorController.character_id, userId).eq("maintain_field_id", maintainFieldId));
+        if (masterAuthors.size() == 0) {
+            //user 鑾峰彇role
+            List<TUserRole> roles = userRoleService.selectList(new EntityWrapper<TUserRole>().eq("user_id", userId));
+            List<String> roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList());
+            masterAuthors = selectList(new EntityWrapper<MasterAuthor>().eq("table_name", maintain.getTableName()).eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds).eq("maintain_field_id", maintainFieldId));
+        }
+        if (masterAuthors.isEmpty()){
+            return Constant.WHERE_DEFAULTUN;
+        }
+        List<String> authorIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getId()).collect(Collectors.toList());
+        List<MasterAuthorDetail> masterAuthorDetails = authorDetailService.selectList(new EntityWrapper<MasterAuthorDetail>().in(Constant.PARENT_ID, authorIds));
+        if (masterAuthorDetails.isEmpty()) {
+            return Constant.WHERE_DEFAULTUN;
+        }
+        HashMap<String, List<String>> segmentMap = new HashMap<>();
+        HashMap<String, Boolean> segmentAllMap = new HashMap<>();
+
+        for (MasterAuthorDetail detail : masterAuthorDetails) {
+            String field = detail.getField();
+            Boolean all = detail.getAll();
+            if (!(segmentAllMap.containsKey(field) && segmentAllMap.get(field))) {
+                segmentAllMap.put(field, all);
+            }
+
+            Boolean preAll = segmentAllMap.get(field);
+            if (preAll) {
+                if (segmentMap.containsKey(field)) {
+                    segmentMap.remove(field);
+                }
+                continue;
+            }
+
+            String val = detail.getVal();
+            List<String> split = DbUtils.split(val);
+            segmentMap.put(field,split);
+        }
+        ContentBuilder builder = new ContentBuilder(Constant.AND);
+        Set<String> keySet = segmentMap.keySet();
+        for (String code : keySet) {
+            List<String> vals = segmentMap.get(code);
+            String val = vals.stream()
+                    .filter(s -> !StringUtils.isEmpty(s))
+                    .map(s -> DbUtils.quotedStr(s)).collect(Collectors.joining(Constant.COMMA));
+            String format = MessageFormat.format(Constant.InSql, code, val);
+            builder.append(format);
+        }
+        String filter = builder.toString();
+        return filter;
+    }
+
+    @Override
+    public Maintain getMaxVersionMaintain(String userId, String tableName) {
+        List<Maintain> maintainList = maintainService.selectList(new EntityWrapper<Maintain>().eq("table_name", tableName).orderBy("order_no desc"));
+        for (Maintain maintain : maintainList) {
+            ActivitiStatus status = flowsService.getStatusByBusinessId(maintain.getId());
+            if (!status.equals(ActivitiStatus.open)) {
+                continue;
+            }
+            boolean b = checkMaintainAuthor(userId, maintain.getId());
+            if (b) {
+                return maintain;
+            }
+        }
         return null;
     }
 

--
Gitblit v1.8.0