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.controller.MasterAuthorController; import com.highdatas.mdm.entity.*; import com.highdatas.mdm.mapper.MasterAuthorMapper; import com.highdatas.mdm.pojo.MasterAuthorType; 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; /** *

* 服务实现类 *

* * @author kimi * @since 2020-03-23 */ @Service public class MasterAuthorServiceImpl extends ServiceImpl implements IMasterAuthorService { public static final String characterId = "characterId"; @Autowired IMasterAuthorDetailService authorDetailService; @Autowired ITUserRoleService userRoleService; @Autowired ISysMenuService menuService; @Autowired ISysFieldService fieldService; @Autowired IMaintainFieldService maintainFieldService; @Autowired IMaintainService maintainService; @Override public HashMap merageRoleAuthor(List roleIds) { List masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds)); HashMap resultMap = new HashMap<>(); for (MasterAuthor masterAuthor : masterAuthors) { List masterAuthorDetails = authorDetailService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, masterAuthor.getId())); masterAuthor.setFields(masterAuthorDetails); String key = DbUtils.getFieldRedisKey(masterAuthor.getTableName(), masterAuthor.getMaintainFieldId()); MasterAuthor preMerageMasterAuthor = resultMap.get(key); if (preMerageMasterAuthor == null) { resultMap.put(key, masterAuthor); } else { preMerageMasterAuthor = merage(preMerageMasterAuthor, masterAuthor); resultMap.put(key, preMerageMasterAuthor); } } return resultMap; } @Override public List getMenu(String userId) { List masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.user).eq(MasterAuthorController.character_id, userId)); if (masterAuthors.size() == 0) { //user 获取role List roles = userRoleService.selectList(new EntityWrapper().eq("user_id", userId)); List roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList()); masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.role).in(MasterAuthorController.character_id, roleIds)); } List menuIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getMenuId()).collect(Collectors.toList()); LinkedHashSet strings = new LinkedHashSet<>(menuIds); LinkedHashSet byParentId = menuService.getByParentId(strings); List sysMenus = menuService.selectBatchIds(byParentId); return sysMenus; } @Override public List getField(String userId, String maintainFieldId, String maintainId) { if (maintainFieldId.equalsIgnoreCase(Constant.All)) { List total = fieldService.getFieldByMaintain(maintainId); return total; } List masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.user).eq(this.characterId, userId).eq("maintain_field_id", maintainFieldId)); if (masterAuthors.size() == 0) { //user 获取role List roles = userRoleService.selectList(new EntityWrapper().eq("user_id", userId)); List roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList()); masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.role).in(this.characterId, roleIds).eq("maintain_field_id", maintainFieldId)); } if (masterAuthors.isEmpty()) { return null; } List authorIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getId()).collect(Collectors.toList()); List masterAuthorDetails = authorDetailService.selectList(new EntityWrapper().in(Constant.PARENT_ID, authorIds)); Set codes = masterAuthorDetails.stream().map(masterAuthorDetail -> masterAuthorDetail.getField()).collect(Collectors.toSet()); if (codes.isEmpty()) { return null; } Wrapper wrapper = new EntityWrapper().in(Constant.FIELD, codes); if (maintainFieldId.equalsIgnoreCase(Constant.Default)) { wrapper.eq("maintain_field_id", maintainFieldId); }else { wrapper.isNull("maintain_field_id"); } List fieldList = fieldService.selectList(wrapper); return fieldList; } @Override public boolean checkMaintainAuthor(String userId, String maintainId) { Maintain maintain = maintainService.selectById(maintainId); if (maintain == null) { return false; } int checked = selectCount(new EntityWrapper() .eq(Constant.TYPE, MasterAuthorType.user) .eq(MasterAuthorController.character_id, userId) .eq("table_name", maintain.getTableName()) .eq("maintain_field_id", Constant.All)); if(checked > 0) { return true; } MaintainField maintainField = fieldService.getMaintainFieldByMaintain(maintainId); if (maintainField == null) { return false; } //get user author checked = selectCount(new EntityWrapper() .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 roles = userRoleService.selectList(new EntityWrapper().eq("user_id", userId)); Set collect = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toSet()); checked = selectCount(new EntityWrapper() .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) { MaintainField maintainField = fieldService.getMaintainFieldByMaintain(maintainId); if (maintainField) if (maintainFieldId.equalsIgnoreCase(Constant.All)) { return Constant.WHERE_DEFAULT; } List masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.user).eq(this.characterId, userId).eq("maintain_field_id", maintainFieldId)); if (masterAuthors.size() == 0) { //user 获取role List roles = userRoleService.selectList(new EntityWrapper().eq("user_id", userId)); List roleIds = roles.stream().map(tUserRole -> tUserRole.getRoleId()).collect(Collectors.toList()); masterAuthors = selectList(new EntityWrapper().eq(Constant.TYPE, MasterAuthorType.role).in(this.characterId, roleIds).eq("maintain_field_id", maintainFieldId)); } if (masterAuthors.isEmpty()){ return Constant.WHERE_DEFAULTUN; } List authorIds = masterAuthors.stream().map(masterAuthor -> masterAuthor.getId()).collect(Collectors.toList()); List masterAuthorDetails = authorDetailService.selectList(new EntityWrapper().in(Constant.PARENT_ID, authorIds)); if (masterAuthorDetails.isEmpty()) { return Constant.WHERE_DEFAULTUN; } HashMap> segmentMap = new HashMap<>(); HashMap 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 && segmentMap.containsKey(field)) { segmentMap.remove(field); } String val = detail.getVal(); List split = DbUtils.split(val); segmentMap.put(field,split); } ContentBuilder builder = new ContentBuilder(Constant.AND); Set keySet = segmentMap.keySet(); for (String code : keySet) { List 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.MYSQL_UUID, code, val); builder.append(format); } String filter = builder.toString(); return filter; } private MasterAuthor merage(MasterAuthor preMerageMasterAuthor, MasterAuthor masterAuthor) { // table name masterField 一样 只有字段不同了 List preFields = preMerageMasterAuthor.getFields(); Map fieldMap = masterAuthor.getFields().stream().collect(Collectors.toMap(MasterAuthorDetail::getField, masterAuthorDetail -> masterAuthorDetail)); HashSet valSet = new HashSet<>(); for (MasterAuthorDetail preField : preFields) { valSet.clear(); String fieldId = preField.getField(); String val = preField.getVal(); if (val.equalsIgnoreCase(Constant.All)) { continue; } MasterAuthorDetail detail = fieldMap.get(fieldId); if (detail == null) { continue; } String preAddVal = detail.getVal(); if (preAddVal.equalsIgnoreCase(Constant.All)) { preField.setVal(preAddVal); continue; } valSet.addAll(DbUtils.split(val)); valSet.addAll(DbUtils.split(preAddVal)); String resultVal = valSet.stream().collect(Collectors.joining(Constant.SEMICOLON)); preField.setVal(resultVal); } return preMerageMasterAuthor; } }