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;
}
}