kimi
2020-05-27 2893347bf72477c4d108e8589a0f61e3e97a990c
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
package com.highdatas.mdm.controller;
 
 
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.highdatas.mdm.entity.*;
import com.highdatas.mdm.mapper.TableInfoMapper;
import com.highdatas.mdm.pojo.CodeMsg;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.pojo.ViewMapFieldItem;
import com.highdatas.mdm.service.*;
import com.highdatas.mdm.util.Constant;
import com.highdatas.mdm.util.DbUtils;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * <p>
 *  前端控制器
 * </p>
 * @desctiption 视图接口
 * @author kimi
 * @since 2020-04-15
 */
@RestController
@RequestMapping("/sysView")
public class SysViewController {
    @Autowired
    ISysViewService viewService;
    @Autowired
    ISysViewJoinService sysViewJoinService;
    @Autowired
    IMaintainService maintainService;
    @Autowired
    ISysMenuService menuService;
    @Autowired
    IMasterAuthorService masterAuthorService;
    @Autowired
    MasterDataService masterDataService;
    @Autowired
    TableInfoMapper tableInfoMapper;
    @Autowired
    IMenuMappingService menuMappingService;
    @Autowired
    ISysViewLogicService logicService;
    @Autowired
    ISysViewLogicmapService logicmapService;
 
    /**
     *
     * @description:  By用户获取视图list
     * @param userId  用户id
     * @return: 视图list
     *
     */
    @RequestMapping(value = "/all/{userId}",  method = RequestMethod.GET)
    public Result getAll(@PathVariable String userId, HttpServletRequest request) {
        //ByuserId 获取视图列表
        Wrapper<SysView> eq = new EntityWrapper<SysView>().eq(Constant.USERID, userId);
        List<SysView> records = viewService.selectList(eq);
        for (SysView record : records) {
            String id = record.getId();
            Maintain baseMaintain = viewService.getBaseMaintain(record);
            //校验基准版本是否存在
            if (baseMaintain == null) {
                continue;
            }
            //获取 版本号,表名返回前端
            record.setBaseTableName(baseMaintain.getTableName());
            record.setBaseVersion(baseMaintain.getVersion());
            String menuId = record.getMenuId();
            SysMenu sysMenu = menuService.selectById(menuId);
            //校验主题是否存在
            if (sysMenu == null) {
                continue;
            }
            //获取主题名称返回前端
            record.setMenuName(sysMenu.getName());
            //获取关联主题
            List<SysViewJoin> sysViewJoins = sysViewJoinService.selectList(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, id));
            List<String> menuIds = sysViewJoins.stream()
                    .map(sysViewJoin -> sysViewJoin.getMenuId())
                    .collect(Collectors.toList());
            if (!menuIds.isEmpty()) {
                List<SysMenu> sysMenus = menuService.selectBatchIds(menuIds);
                Collections.reverse(sysMenus);
                String subMenuName = sysMenus.stream().map(subMenu -> subMenu.getName()).collect(Collectors.joining(Constant.SEMICOLON));
                //获取关联主题的名称组合后返回给前端
                record.setSubMenuName(subMenuName);
            }
 
        }
        return Result.success(records);
    }
 
    /**
     *
     * @description:  更新视图数据
     * @param id 视图id
     * @return: 是否更新成功
     *
     */
    @RequestMapping(value = "/refreshData/{id}",  method = RequestMethod.GET)
    public Result createView(@RequestParam String id, @RequestParam Boolean active) {
        //获取视图信息
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        //从新创建视图
        viewService.createView(sysView.getId());
        return Result.success(sysView);
    }
 
    /**
     *
     * @description:  保存关联字段信息
     * @param id 视图id
     * @param mapField 关联字段
     * @return: 是否保存成功
     *
     */
    @RequestMapping(value = "/saveMapField/{id}",  method = RequestMethod.GET)
    public Result saveMapField(@RequestParam String id, @RequestParam String mapField) {
        //获取视图信息
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        //保存关联字段
        sysView.setMappingField(mapField).updateById();
        return Result.success(sysView);
    }
 
    /**
     *
     * @description:  创建视图
     * @param id 视图id
     * @return: 是否创建成功
     *
     */
 
    @RequestMapping(value = "/createView/{id}",  method = RequestMethod.GET)
    public Result createView(@PathVariable String id) {
        //获取视图信息
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        //创建视图
        boolean view = viewService.createView(sysView.getId());
        if (view) {
            return Result.success(null);
        } else {
            return Result.error(CodeMsg.CREATE_ERROR);
        }
 
    }
 
    /**
     *
     * @description:  更新视图激活状态
     * @param id 视图id
     * @return: 是否更新成功
     *
     */
    @RequestMapping(value = "/active/{id}",  method = RequestMethod.GET)
    public Result active(@PathVariable String id, @RequestParam Boolean active) {
        //获取视图信息
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        //更新激活状态
        sysView.setActive(active).updateById();
        return Result.success(sysView);
    }
 
    /**
     *
     * @description:  获取视图数据
     * @param id 视图id
     * @param pageNo 页数
     * @return: 视图术后据
     *
     */
 
    @RequestMapping(value = "/getViewData/{id}/page/{pageNo}",  method = RequestMethod.GET)
    public Result getViewData(@PathVariable String id, @PathVariable Integer pageNo, HttpServletRequest request) {
        //pageSize ,每页数据量
        String pageSizeStr = request.getParameter("pageSize");
        //获取视图数据
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        int pageSize = 15;
        if (!StringUtils.isEmpty(pageSizeStr)) {
            pageSize = Integer.valueOf(pageSizeStr);
        }
        //分页获取视图数据
        return viewService.getViewData(sysView, pageNo, pageSize);
 
    }
 
    /**
     *
     * @description:  获取视图一对一转换的map数据
     * @param id 视图id
     * @param pageNo 页数
     * @return: map数据
     *
     */
    @RequestMapping(value = "/getMapData/{id}/page/{pageNo}",  method = RequestMethod.GET)
    public Result getMapData(@PathVariable String id, @PathVariable Integer pageNo, @RequestParam String changedField, HttpServletRequest request) {
        //pageSize 每页数据
        String pageSizeStr = request.getParameter("pageSize");
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        int pageSize = 15;
        if (!StringUtils.isEmpty(pageSizeStr)) {
            pageSize = Integer.valueOf(pageSizeStr);
        }
        //获取maping的数据
        return viewService.getMapData(sysView, changedField, pageNo, pageSize);
 
    }
 
    /**
     *
     * @description:  通过用户获取有权限的字段
     * @param userId 用户id
     * @param needUpdate 是否需要从新获取一遍数据
     * @param maintainId 版本id
     * @return: 字段列表
     *
     */
 
    @RequestMapping(value = "/field/{userId}", method = RequestMethod.GET)
    public Result<List<SysField>> fieldList(@PathVariable String userId, @RequestParam boolean needUpdate,  @RequestParam String maintainId, HttpServletRequest request) {
        //请求头里获取用户信息
        TUser user = DbUtils.getUserById(userId);
        if (user == null) {
            return Result.error(CodeMsg.USER_NOT_MATHED);
        }
 
        if (needUpdate) {
            //从新获取一遍最新的版本字段
            Maintain nowVersion = maintainService.getNowVersion(maintainId);
            List<SysField> field = masterAuthorService.getField(user, nowVersion.getId());
            return Result.success(field) ;
        }
        //根据权限获取字段
        List<SysField> field = masterAuthorService.getField(user, maintainId);
        return Result.success(field) ;
    }
 
    /**
     *
     * @description:  获取视图一对一转换的map数据
     * @param id 视图id
     * @return: map数据
     *
     */
    @RequestMapping(value = "/mapFieldList/{id}",  method = RequestMethod.GET)
    public Result active(@PathVariable String id) {
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
 
        List<ViewMapFieldItem> mapField = viewService.getMapField(sysView);
        return Result.success(mapField);
    }
 
    /**
     *
     * @description:  获取视图数据
     * @param id 视图id
     * @return: 视图数据
     *
     */
    @RequestMapping(value = "/get/{id}",  method = RequestMethod.GET)
    public Result get(@PathVariable String id) {
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        String menuId = sysView.getMenuId();
        //获取主题的父级主题链
        LinkedHashSet<String> parentIdSet = new LinkedHashSet<>();
        parentIdSet.add(menuId);
        LinkedHashSet<String> byParentId = menuService.getByParentId(parentIdSet);
        ArrayList<String> strings = new ArrayList<>(byParentId);
        Collections.reverse(strings);
        String collect = strings.stream().collect(Collectors.joining(Constant.SEMICOLON));
        sysView.setMenuName(collect);
        //获取关联主题
        List<SysViewJoin> sysViewJoins = sysViewJoinService.selectList(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, id));
        for (SysViewJoin sysViewJoin : sysViewJoins) {
            //获取关联主题的父级主题链
            parentIdSet.clear();
            parentIdSet.add(sysViewJoin.getMenuId());
            LinkedHashSet<String> subParent = menuService.getByParentId(parentIdSet);
            ArrayList<String> subList = new ArrayList<>(subParent);
            Collections.reverse(subList);
            String subMenuName = subList.stream().collect(Collectors.joining(Constant.SEMICOLON));
            sysViewJoin.setMenuName(subMenuName);
        }
        sysView.setViewJoinList(sysViewJoins);
 
        List<SysViewLogicmap> sysViewLogicmaps = logicmapService.selectList(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, sysView.getId()));
        sysView.setLogicmapList(sysViewLogicmaps);
        return Result.success(sysView);
    }
    /**
     *
     * @description:  获取可用视图
     * @param userId 用户id
     * @return: 视图数
     *
     */
    @RequestMapping(value = "/getCnt/{userId}",  method = RequestMethod.GET)
    public Result cnt(@PathVariable String userId, HttpServletRequest request) {
        //获取用户信息
        TUser user = DbUtils.getUserById(userId);
        if (user == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        Wrapper<SysView> userWrapper = new EntityWrapper<SysView>().eq("user_id", userId);
        //获取视图总数
        int totalCnt = viewService.selectCount(userWrapper);
        //可用视图数
        userWrapper.eq("active", true);
        int activeCnt = viewService.selectCount(userWrapper);
        //已注册视图数
        userWrapper.eq("subscribe", true);
        int subscribeCnt = viewService.selectCount(userWrapper);
        JSONObject object = new JSONObject();
        object.fluentPut("totalCnt", totalCnt);
        object.fluentPut("activeCnt", activeCnt);
        object.fluentPut("subscribeCnt", subscribeCnt);
        return Result.success(object);
    }
 
    /**
     *
     * @description:  创建视图
     * @param userId 用户id
     * @return: 视图数据
     *
     */
    @RequestMapping(value = "/create/{userId}",  method = RequestMethod.GET)
    public Result add(@PathVariable String userId, HttpServletRequest request) {
        SysView sysView = new SysView();
        //设置视图初始数据
        sysView.setId(DbUtils.getUUID())
                .setUserId(userId)
                .setCreateTime(new Date())
                .setStatus(ViewStatus.edit)
                .setEmptyData(true)
                .insert();
        //生成并保存mapping表 表名
        viewService.getMappingTableName(sysView);
        return Result.success(sysView);
    }
 
    /**
     *
     * @description:  删除一对一mapping
     * @param id 视图id
     * @return: map数据
     *
     */
    @SneakyThrows
    @RequestMapping(value = "/deleteMap/{id}",  method = RequestMethod.GET)
    public Result deleteMap(@PathVariable String id, @RequestParam String changedField) {
        //获取视图数据
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        //删除mapping字段
        viewService.deleteMapField(sysView, changedField);
        logicmapService.delete(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, id).eq(Constant.FIELD, changedField));
        List<SysViewLogicmap> sysViewLogicmaps = logicmapService.selectList(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, sysView.getId()));
        sysView.setLogicmapList(sysViewLogicmaps);
        return Result.success(sysView);
    }
    /**
     *
     * @description:  删除关联主题数据
     * @param id 视图关联主题id
     * @return: 是否删除成功
     *
     */
 
    @SneakyThrows
    @RequestMapping(value = "/delete/detail/{id}",  method = RequestMethod.GET)
    public Result deleteDetail(@PathVariable String id) {
        //获取关联主题数据
        SysViewJoin sysViewJoin = sysViewJoinService.selectById(id);
        if (sysViewJoin == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        String parentId = sysViewJoin.getParentId();
        SysView sysView = viewService.selectById(parentId);
        String userId = sysView.getUserId();
        //获取用户信息
        TUser user = DbUtils.getUserById(userId);
 
        //获取关联主题信息
        Maintain joinMaintain = viewService.getJoinMaintain(sysViewJoin);
        List<String> subFieldList = viewService.getSubFieldList(sysViewJoin, user);
        boolean delete = false;
 
        for (String subField: subFieldList) {
            String changeFieldName = viewService.changeFieldName(joinMaintain.getTableName(), subField);
            logicmapService.delete(new EntityWrapper<SysViewLogicmap>()
                    .eq(Constant.PARENT_ID, sysView.getId())
                    .eq(Constant.FIELD, changeFieldName)
            );
            //删除1对1mapping 表内数据
            delete = viewService.deleteMapField(sysView, changeFieldName);
        }
        if (delete) {
            return  Result.success(CodeMsg.DELETE_SUCCESS);
        } else {
            return  Result.error(CodeMsg.DELETE_ERROR);
        }
    }
    /**
     *
     * @description:  删除视图
     * @param id 视图id
     * @return: 是否删除
     *
     */
 
    @SneakyThrows
    @RequestMapping(value = "/delete/{id}",  method = RequestMethod.GET)
    public Result delete(@PathVariable String id) {
        return viewService.deleteView(id);
    }
 
    /**
     *
     * @description:  通过用户获取某主题下的版本泪飙
     * @param userId 用户id
     * @param menuId 主题
     * @return: map数据
     *
     */
    @RequestMapping(value = "/maintainList/{userId}", method = RequestMethod.GET)
    public Result add(@PathVariable String userId, @RequestParam String menuId, HttpServletRequest request) {
        //获取用户信息
        TUser user = DbUtils.getUserById(userId);
        if (user == null) {
            return Result.error(CodeMsg.USER_NOT_MATHED);
        }
        //获取表名
        String tableNameByMenu = menuMappingService.getTableNameByMenu(menuId);
        if (StringUtils.isEmpty(tableNameByMenu)) {
            return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
        }
        //获取版本list
        LinkedHashSet<Maintain> maintainSet = masterAuthorService.getMaintainSet(tableNameByMenu, user);
        ArrayList<Maintain> maintains = new ArrayList<>(maintainSet);
        for (Maintain maintain : maintains) {
            maintain.setNeedUpdate(false);
        }
        Maintain max = new Maintain();
        max.setId(tableNameByMenu);
        max.setTableName(tableNameByMenu);
        max.setNeedUpdate(true);
        maintains.add(0, max);
        return Result.success(maintains);
    }
    /**
     *
     * @description: 更新视图
     * @return: 视图数据
     *
     */
    @RequestMapping(value = "/update",  method = RequestMethod.POST)
    public Result add(@RequestBody SysView view) {
        //校验必传字段
        if (StringUtils.isEmpty(view.getId())) {
            return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
        }
        if (StringUtils.isEmpty(view.getMenuId()) || StringUtils.isEmpty(view.getBaseMaintain()) ) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        if (StringUtils.isEmpty(view.getViewTableName())) {
            viewService.getViewTableName(view);
        }
        List<SysViewLogicmap> logicmapList = view.getLogicmapList();
        //delete 之前关联的逻辑转换 数据
        logicmapService.delete(new EntityWrapper<SysViewLogicmap>().eq(Constant.PARENT_ID, view.getId()));
        if (logicmapList != null) {
            for (SysViewLogicmap logicmap : logicmapList) {
                logicmap.setId(DbUtils.getUUID()).setParentId(view.getId()).insert();
            }
        }
 
        view.setEmptyData(false).setStatus(ViewStatus.edit);
        //delete 之前关联主题数据
        sysViewJoinService.delete(new EntityWrapper<SysViewJoin>().eq(Constant.PARENT_ID, view.getId()));
 
        List<SysViewJoin> viewJoinList = view.getViewJoinList();
        boolean insert;
        for (SysViewJoin sysViewJoin : viewJoinList) {
            insert = sysViewJoin.setId(DbUtils.getUUID()).insert();
            if (!insert) {
                return Result.error(CodeMsg.INSERT_ERROR);
            }
        }
        view.setUpdateTime(new Date());
        view.updateById();
        return Result.success(view);
    }
    /**
     *
     * @description:  下载视图一对一转换的map数据
     * @param id 视图id
     * @param menuId 主题id
     * @param field 字段
     * @return: map数据
     *
     */
    @SneakyThrows
    @RequestMapping(value = "/download/{id}",  method = RequestMethod.GET)
    public void download(@PathVariable String id,  @RequestParam String menuId, @RequestParam String field, HttpServletResponse response) {
        //获取视图信息
        SysView sysView = viewService.selectById(id);
        if (sysView == null) {
            return;
        }
        String userId = sysView.getUserId();
        //获取用户信息
        TUser user = DbUtils.getUserById(userId);
        if (user == null) {
            return;
        }
        //下载某个主题下的字段关联的1对1 mapping数据
        viewService.downlodMap(sysView,user, response, field, menuId);
    }
}