jinlin
2023-11-16 6af5b3def3f511a19c7ccff6f223ef239b178d48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
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;
    }
 
}