package cn.cslg.pas.service; import cn.cslg.pas.common.core.base.EStatus; import cn.cslg.pas.common.utils.Response; import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils; import cn.cslg.pas.common.utils.StringUtils; import cn.cslg.pas.domain.CustomAnalysisItem; import cn.cslg.pas.mapper.CustomAnalysisItemMapper; import cn.cslg.pas.common.utils.CacheUtils; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** *

* 自定义分析项目 服务实现类 *

* * @author 王岩 * @since 2021-12-23 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class CustomAnalysisItemService extends ServiceImpl { private final CacheUtils cacheUtils; private final CustomAnalysisItemSettingService customAnalysisItemSettingService; private final CustomAnalysisItemSchemaService customAnalysisItemSchemaService; private final CustomAnalysisItemSourceService customAnalysisItemSourceService; private final LoginUtils loginUtils; public List getTreeList(Integer projectId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.and(Wrapper -> Wrapper.eq(CustomAnalysisItem::getProjectId, projectId).or().eq(CustomAnalysisItem::getPermissions, 2)); queryWrapper.orderByAsc(CustomAnalysisItem::getSort); List list = this.list(queryWrapper); list.forEach(item -> { item.setSetting(null); item.setSchema(null); item.setSource(null); }); return this.buildTree2(list); } public CustomAnalysisItem getItemByUid(String uid) { CustomAnalysisItem customAnalysisItem = this.getOne(Wrappers.lambdaQuery().eq(CustomAnalysisItem::getUid, uid)); if (customAnalysisItem.getType().equals(1)) { customAnalysisItem.setSetting(customAnalysisItemSettingService.getItemSettingByUid(customAnalysisItem.getUid())); customAnalysisItem.setSchema(customAnalysisItemSchemaService.getItemSchemaByUid(customAnalysisItem.getUid())); customAnalysisItem.setSource(customAnalysisItemSourceService.getItemSourceData(customAnalysisItem)); } else { customAnalysisItem.setSetting(null); customAnalysisItem.setSchema(null); customAnalysisItem.setSource(null); } return customAnalysisItem; } public Integer addGroupItem(CustomAnalysisItem customAnalysisItem) { CustomAnalysisItem group = new CustomAnalysisItem(); group.setUid(IdUtil.simpleUUID()); group.setName(customAnalysisItem.getParentName()); group.setParentId(0); group.setType(0); group.setProjectId(customAnalysisItem.getProjectId()); group.setPermissions(2); group.setSort((int) this.count(Wrappers.lambdaQuery().eq(CustomAnalysisItem::getParentId, 0)) + 1); group.setCreateBy(loginUtils.getId()); group.insert(); return group.getId(); } public Map getOptionReturnData(CustomAnalysisItem customAnalysisItem) { Map map = new HashMap<>(); map.put("uid", customAnalysisItem.getUid()); map.put("name", customAnalysisItem.getName()); map.put("parentId", customAnalysisItem.getParentId()); return map; } @Transactional(rollbackFor = Exception.class) public String add(CustomAnalysisItem customAnalysisItem) { if (this.checkNameUnique(customAnalysisItem)) { return Response.error("名称重复"); } String uid = IdUtil.simpleUUID(); if (StringUtils.isNotEmpty(customAnalysisItem.getParentName())) { customAnalysisItem.setParentId(this.addGroupItem(customAnalysisItem)); } customAnalysisItem.setUid(uid); customAnalysisItem.setCreateBy(loginUtils.getId()); customAnalysisItem.insert(); if (customAnalysisItem.getType().equals(1)) { customAnalysisItemSettingService.add(customAnalysisItem.getSetting(), uid); customAnalysisItemSchemaService.add(customAnalysisItem.getSchema(), uid); customAnalysisItemSourceService.edit(customAnalysisItem); } return Response.success(this.getOptionReturnData(customAnalysisItem)); } @Transactional(rollbackFor = Exception.class) public String edit(CustomAnalysisItem customAnalysisItem) { if (this.checkNameUnique(customAnalysisItem)) { return Response.error("名称重复"); } CustomAnalysisItem temp = baseMapper.selectById(customAnalysisItem.getId()); if (StringUtils.isNotEmpty(customAnalysisItem.getParentName())) { customAnalysisItem.setParentId(this.addGroupItem(customAnalysisItem)); } temp.setName(customAnalysisItem.getName()); temp.setParentId(customAnalysisItem.getParentId()); temp.setSort(customAnalysisItem.getSort()); temp.setRemark(customAnalysisItem.getRemark()); temp.setType(customAnalysisItem.getType()); temp.setPermissions(customAnalysisItem.getPermissions()); temp.setSchema(customAnalysisItem.getSchema()); temp.setSetting(customAnalysisItem.getSetting()); temp.setSource(customAnalysisItem.getSource()); temp.setProjectId(customAnalysisItem.getProjectId()); temp.updateById(); if (temp.getType().equals(1)) { customAnalysisItemSettingService.edit(temp.getSetting(), temp.getUid()); customAnalysisItemSchemaService.edit(temp.getSchema(), temp.getUid()); customAnalysisItemSourceService.edit(temp); } return Response.success(this.getOptionReturnData(temp)); } @Transactional public String delete(Integer id) { CustomAnalysisItem customAnalysisItem = baseMapper.selectById(id); if (this.list(Wrappers.lambdaQuery().eq(CustomAnalysisItem::getParentId, id)).size() != 0) { return Response.error("删除失败,请先删除子节点"); } this.removeById(id); customAnalysisItemSchemaService.deleteByUid(customAnalysisItem.getUid()); customAnalysisItemSettingService.deleteByUid(customAnalysisItem.getUid()); customAnalysisItemSourceService.deleteByUid(customAnalysisItem.getUid()); return Response.success(true); } public List buildTree2(List items) { List returnList = items.stream().filter(item -> item.getParentId().equals(0)).collect(Collectors.toList()); returnList.forEach(item -> { item.setChildren(items.stream().filter(c -> c.getParentId().equals(item.getId())).collect(Collectors.toList())); }); return returnList; } public List buildTree(List items) { List returnList = new ArrayList<>(); List tempList = new ArrayList<>(); for (CustomAnalysisItem option : items) { tempList.add(option.getId()); } for (Iterator iterator = items.iterator(); iterator.hasNext(); ) { CustomAnalysisItem item = (CustomAnalysisItem) iterator.next(); if (!tempList.contains(item.getParentId())) { recursionFn(items, item); returnList.add(item); } } if (returnList.isEmpty()) { returnList = items; } return returnList; } private void recursionFn(List list, CustomAnalysisItem t) { List childList = getChildList(list, t); t.setChildren(childList); for (CustomAnalysisItem tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } private List getChildList(List list, CustomAnalysisItem t) { List tlist = new ArrayList<>(); Iterator it = list.iterator(); while (it.hasNext()) { CustomAnalysisItem n = (CustomAnalysisItem) it.next(); if (n.getParentId().equals(t.getId())) { tlist.add(n); } } return tlist; } private boolean hasChild(List list, CustomAnalysisItem t) { return getChildList(list, t).size() > 0 ? true : false; } public Boolean checkNameUnique(CustomAnalysisItem customAnalysisItem) { Integer id = StringUtils.isNull(customAnalysisItem.getId()) ? -1 : customAnalysisItem.getId(); CustomAnalysisItem info = this.getOne(Wrappers.lambdaQuery().eq(CustomAnalysisItem::getParentId, customAnalysisItem.getParentId()).eq(CustomAnalysisItem::getName, customAnalysisItem.getName()).eq(CustomAnalysisItem::getType, customAnalysisItem.getType()).last("limit 1")); return StringUtils.isNotNull(info) && !info.getId().equals(id); } }