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;
/**
*
* 前端控制器
*
* @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 eq = new EntityWrapper().eq(Constant.USERID, userId);
List 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 sysViewJoins = sysViewJoinService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, id));
List menuIds = sysViewJoins.stream()
.map(sysViewJoin -> sysViewJoin.getMenuId())
.collect(Collectors.toList());
if (!menuIds.isEmpty()) {
List 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> 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 field = masterAuthorService.getField(user, nowVersion.getId());
return Result.success(field) ;
}
//根据权限获取字段
List 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 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 parentIdSet = new LinkedHashSet<>();
parentIdSet.add(menuId);
LinkedHashSet byParentId = menuService.getByParentId(parentIdSet);
ArrayList strings = new ArrayList<>(byParentId);
Collections.reverse(strings);
String collect = strings.stream().collect(Collectors.joining(Constant.SEMICOLON));
sysView.setMenuName(collect);
//获取关联主题
List sysViewJoins = sysViewJoinService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, id));
for (SysViewJoin sysViewJoin : sysViewJoins) {
//获取关联主题的父级主题链
parentIdSet.clear();
parentIdSet.add(sysViewJoin.getMenuId());
LinkedHashSet subParent = menuService.getByParentId(parentIdSet);
ArrayList subList = new ArrayList<>(subParent);
Collections.reverse(subList);
String subMenuName = subList.stream().collect(Collectors.joining(Constant.SEMICOLON));
sysViewJoin.setMenuName(subMenuName);
}
sysView.setViewJoinList(sysViewJoins);
List sysViewLogicmaps = logicmapService.selectList(new EntityWrapper().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 userWrapper = new EntityWrapper().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().eq(Constant.PARENT_ID, id).eq(Constant.FIELD, changedField));
List sysViewLogicmaps = logicmapService.selectList(new EntityWrapper().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 subFieldList = viewService.getSubFieldList(sysViewJoin, user);
boolean delete = false;
for (String subField: subFieldList) {
String changeFieldName = viewService.changeFieldName(joinMaintain.getTableName(), subField);
logicmapService.delete(new EntityWrapper()
.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 maintainSet = masterAuthorService.getMaintainSet(tableNameByMenu, user);
ArrayList 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 logicmapList = view.getLogicmapList();
//delete 之前关联的逻辑转换 数据
logicmapService.delete(new EntityWrapper().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().eq(Constant.PARENT_ID, view.getId()));
List 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);
}
}