package com.zt.modules.sys.service; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.zt.common.constant.CacheKey; 
 | 
import com.zt.common.constant.Constant; 
 | 
import com.zt.common.service.BaseService; 
 | 
import com.zt.common.utils.CacheUtils; 
 | 
import com.zt.core.db.annotation.DataFilterParser; 
 | 
import com.zt.core.db.model.DataFilterField; 
 | 
import com.zt.core.db.model.DataFilterMethod; 
 | 
import com.zt.modules.sys.dao.SysInterfaceDao; 
 | 
import com.zt.modules.sys.dao.SysInterfaceFieldDao; 
 | 
import com.zt.modules.sys.dto.InterfaceDto; 
 | 
import com.zt.modules.sys.mapstruct.SysInterfaceMapper; 
 | 
import com.zt.modules.sys.model.SysInterface; 
 | 
import com.zt.modules.sys.model.SysInterfaceField; 
 | 
import org.springframework.stereotype.Service; 
 | 
  
 | 
import javax.annotation.Resource; 
 | 
import java.util.ArrayList; 
 | 
import java.util.HashMap; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * SYS_INTERFACE 
 | 
 * 
 | 
 * @author hehz 
 | 
 * @since 1.0.0 2020-06-02 
 | 
 */ 
 | 
@Service 
 | 
public class SysInterfaceService extends BaseService<SysInterfaceDao, SysInterface> { 
 | 
  
 | 
    @Resource 
 | 
    private SysInterfaceMapper sysInterfaceMapper; 
 | 
    @Resource 
 | 
    private DataFilterParser dataFilterParser; 
 | 
    @Resource 
 | 
    private SysInterfaceFieldDao sysInterfaceFieldDao; 
 | 
  
 | 
    private List<SysInterface> getAll() { 
 | 
        List<SysInterface> interfaces = (List<SysInterface>) CacheUtils.get(Constant.Cache.SYS, CacheKey.SYS_INTERFACE); 
 | 
        if (interfaces == null) { 
 | 
            interfaces = baseDao.selectList(new QueryWrapper<SysInterface>().eq(Constant.TableColumn.IS_DELETE, 
 | 
                    Constant.Bool.NO)); 
 | 
  
 | 
            List<SysInterfaceField> fields = sysInterfaceFieldDao.selectList(new QueryWrapper<SysInterfaceField>().eq( 
 | 
                    Constant.TableColumn.IS_DELETE, Constant.Bool.NO)); 
 | 
  
 | 
            for (SysInterface anInterface : interfaces) { 
 | 
                anInterface.setFields(fields.stream().filter(f -> f.getInterfaceId().equals(anInterface.getId())) 
 | 
                        .collect(Collectors.toList())); 
 | 
            } 
 | 
            CacheUtils.put(Constant.Cache.SYS, CacheKey.SYS_INTERFACE, interfaces); 
 | 
        } 
 | 
        return interfaces; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取接口树 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public List<InterfaceDto> tree() { 
 | 
        List<SysInterface> all = getAll(); 
 | 
        List<InterfaceDto> list = new ArrayList<>(); 
 | 
        Map<String, InterfaceDto> group1Map = new HashMap<>(); 
 | 
        Map<String, InterfaceDto.Group2> group2Map = new HashMap<>(); 
 | 
  
 | 
        for (int i = 0; i < all.size(); i++) { 
 | 
            SysInterface sysInterface = all.get(i); 
 | 
            String group1 = sysInterface.getGroup1(); 
 | 
            String group2 = sysInterface.getGroup2(); 
 | 
            String method = sysInterface.getMethod(); 
 | 
  
 | 
            InterfaceDto interfaceDto; 
 | 
            if (group1Map.containsKey(group1)) { 
 | 
                interfaceDto = group1Map.get(group1); 
 | 
            } else { 
 | 
                interfaceDto = new InterfaceDto(100L + i, 0L, group1); 
 | 
                list.add(interfaceDto); 
 | 
                group1Map.put(group1, interfaceDto); 
 | 
            } 
 | 
  
 | 
            InterfaceDto.Group2 groug2Dto; 
 | 
            String group2Key = group1 + ":" + group2; 
 | 
            if (group2Map.containsKey(group2Key)) { 
 | 
                groug2Dto = group2Map.get(group2Key); 
 | 
            } else { 
 | 
                groug2Dto = new InterfaceDto.Group2(1000000L + i, interfaceDto.getId(), group2); 
 | 
                interfaceDto.getChildren().add(groug2Dto); 
 | 
                group2Map.put(group2Key, groug2Dto); 
 | 
            } 
 | 
  
 | 
            InterfaceDto.Method methodDto = new InterfaceDto.Method(sysInterface.getId(), groug2Dto.getId(), method, 
 | 
                    sysInterface.getId()); 
 | 
            groug2Dto.getChildren().add(methodDto); 
 | 
  
 | 
            List<SysInterfaceField> fields = sysInterface.getFields(); 
 | 
            for (SysInterfaceField field : fields) { 
 | 
                InterfaceDto.Field dto = new InterfaceDto.Field(); 
 | 
                dto.setId(field.getId()); 
 | 
                dto.setPid(field.getInterfaceId()); 
 | 
                dto.setName(field.getName()); 
 | 
                dto.setField(field.getField()); 
 | 
                dto.setOp(field.getOp()); 
 | 
                dto.setFieldId(field.getId()); 
 | 
                dto.setAccept(field.getAccept()); 
 | 
                dto.setDefaul(field.getDefaul()); 
 | 
                methodDto.getFields().add(dto); 
 | 
            } 
 | 
  
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存自动扫描的接口 
 | 
     */ 
 | 
    public void saveInterfaces() throws Exception { 
 | 
        List<DataFilterMethod> methods = dataFilterParser.getFilteredMethods(); 
 | 
  
 | 
        List<SysInterface> interfaces = this.getAll(); 
 | 
        Map<String, SysInterface> interfaceMap = new HashMap<>(); 
 | 
        for (SysInterface interfaceEntity : interfaces) { 
 | 
            interfaceMap.put(interfaceEntity.getUrl(), interfaceEntity); 
 | 
        } 
 | 
  
 | 
        for (DataFilterMethod method : methods) { 
 | 
            SysInterface interfaceDb = interfaceMap.get(method.getUrl()); 
 | 
            if (interfaceDb == null) {// 新加的 
 | 
                // 新增接口 
 | 
                SysInterface interfaceEntity = getByMethod(method); 
 | 
                interfaceEntity.setDelete(false); 
 | 
                baseDao.insert(interfaceEntity); 
 | 
                // 新增接口字段 
 | 
                for (DataFilterField field : method.getFields()) { 
 | 
                    this.addInterfaceField(interfaceEntity.getId(), field); 
 | 
                } 
 | 
            } else {// 已有的 
 | 
                interfaceMap.remove(interfaceDb.getUrl());// 从map删除 
 | 
                // 判断接口名称是否需要修改 
 | 
                if (!interfaceDb.getInterfaceName().equals(method.getMethodName())) {// 需要修改的 
 | 
                    SysInterface entity = sysInterfaceMapper.fromMethod(method); 
 | 
                    entity.setId(interfaceDb.getId()); 
 | 
                    entity.setDelete(false); 
 | 
                    baseDao.updateById(entity); 
 | 
                } 
 | 
                // 判断字段是否需要修改 
 | 
                Map<String, SysInterfaceField> fieldMap = interfaceDb.getFields().stream() 
 | 
                        .collect(Collectors.toMap(f -> f.getField(), f -> f)); 
 | 
                for (DataFilterField field : method.getFields()) { 
 | 
                    SysInterfaceField fieldDb = fieldMap.get(field.getField()); 
 | 
                    if (fieldDb == null) { // 新加的 
 | 
                        this.addInterfaceField(interfaceDb.getId(), field); 
 | 
                    } else { 
 | 
                        fieldMap.remove(fieldDb.getField());// 从map删除 
 | 
                        if (!fieldDb.getName().equals(field.getName()) || !fieldDb.getAccept().equals(field.getAccept()) || fieldDb.getOp().equals(field.getOp())) {// 需要修改 
 | 
                            fieldDb.setName(field.getName()); 
 | 
                            fieldDb.setAccept(field.getAccept()); 
 | 
                            fieldDb.setOp(field.getOp()); 
 | 
                            sysInterfaceFieldDao.updateById(fieldDb); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
                for (SysInterfaceField fieldDb : fieldMap.values()) {// 剩余的设置为无效 
 | 
                    fieldDb.setDelete(true); 
 | 
                    sysInterfaceFieldDao.updateById(fieldDb); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        for (SysInterface interfaceEntityDb : interfaceMap.values()) {// 剩余的设置为无效 
 | 
            interfaceEntityDb.setDelete(true); 
 | 
            baseDao.updateById(interfaceEntityDb); 
 | 
        } 
 | 
  
 | 
        CacheUtils.remove(Constant.Cache.SYS, CacheKey.SYS_INTERFACE);// 清除缓存 
 | 
    } 
 | 
  
 | 
    private void addInterfaceField(Long interfaceId, DataFilterField field) { 
 | 
        SysInterfaceField entity = new SysInterfaceField(); 
 | 
        entity.setInterfaceId(interfaceId); 
 | 
        entity.setField(field.getField()); 
 | 
        entity.setAccept(field.getAccept()); 
 | 
        entity.setName(field.getName()); 
 | 
        entity.setOp(field.getOp()); 
 | 
        entity.setDelete(false); 
 | 
        sysInterfaceFieldDao.insert(entity); 
 | 
    } 
 | 
  
 | 
    public SysInterface getInterfaceByUrl(String url) { 
 | 
        List<SysInterface> list = getAll().stream().filter(entity -> entity.getUrl().equals(url)) 
 | 
                .collect(Collectors.toList()); 
 | 
        return list.size() > 0 ? list.get(0) : null; 
 | 
    } 
 | 
  
 | 
    private SysInterface getByMethod(DataFilterMethod method) { 
 | 
        SysInterface sysInterface = new SysInterface(); 
 | 
        sysInterface.setUrl(method.getUrl()); 
 | 
        sysInterface.setGroup1(method.getSwagger()); 
 | 
        sysInterface.setGroup2(method.getApiTags()); 
 | 
        sysInterface.setMethod(method.getMethod()); 
 | 
        sysInterface.setDelete(false); 
 | 
        return sysInterface; 
 | 
    } 
 | 
  
 | 
} 
 |