package com.highdatas.mdm.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.highdatas.mdm.entity.*;
import com.highdatas.mdm.entity.Character;
import com.highdatas.mdm.pojo.CodeMsg;
import com.highdatas.mdm.pojo.DispenseField;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.pojo.SubscribeEntity;
import com.highdatas.mdm.service.*;
import com.highdatas.mdm.util.Constant;
import com.highdatas.mdm.util.DbUtils;
import com.highdatas.mdm.util.RedisClient;
import com.highdatas.mdm.util.pool.MqEntity;
import com.highdatas.mdm.util.pool.MqMessage;
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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author kimi
* @since 2019-12-31
*/
@RestController
@RequestMapping("/subscribe")
public class DispenseController {
@Autowired
DispenseService dispenseService;
@Autowired
RedisClient redisClient;
@Autowired
MasterDataService masterDataService;
@Autowired
IMasterAuthorService masterAuthorService;
@Autowired
IMaintainFieldService maintainFieldService;
@Autowired
IMaintainService maintainService;
@Autowired
IMenuMappingService menuMappingService;
@Autowired
IMasterAuthorSubscribeService subscribeService;
@Autowired
ISysMenuService menuService;
@Autowired
ISysViewService viewService;
@Autowired
IMasterAuthorSubscribeService masterAuthorSubscribeService;
@Autowired
IMasterAuthorUnactiveService masterAuthorUnactiveService;
@Autowired
ISysDispenseLogsService dispenseLogsService;
@Autowired
ISysFieldService fieldService;
@RequestMapping(value = "/dispense/surface", method = RequestMethod.GET)
public Result surface(@RequestParam String userId, @RequestParam String type, @RequestParam String dataId, HttpServletRequest request, HttpServletResponse response) {
String versionId = request.getParameter("versionId");
return addPassiveMq(userId, type, dataId, versionId, request, "surface");
}
@RequestMapping(value = "/api/count", method = RequestMethod.POST)
public Result count(@RequestBody JSONObject reqObj) {
String token = reqObj.getString("token");
String type = reqObj.getString("type");
String dataId = reqObj.getString("dataId");
String versionId = reqObj.getString("versionId");
String incrementStr = reqObj.getString("increment");
if (StringUtils.isEmpty(token) || StringUtils.isEmpty(type) || StringUtils.isEmpty(dataId)) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
String userId = redisClient.getRedisVal(token);
if (StringUtils.isEmpty(userId)) {
return Result.error(CodeMsg.ERROR_FIND_TOKEN);
}
boolean increment = true;
if (!StringUtils.isEmpty(incrementStr)) {
increment = Boolean.valueOf(incrementStr);
}
if (type.equalsIgnoreCase(Constant.Master)) {
if (StringUtils.isEmpty(versionId)) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
Maintain maintain = maintainService.selectById(versionId);
if (maintain == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
SysMenu sysMenu = menuService.selectById(dataId);
if (sysMenu == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
int subscribeCnt = subscribeService.selectCount(new EntityWrapper().eq("menu_id", dataId).eq("user_id", userId));
if (subscribeCnt < 1) {
return Result.error(CodeMsg.SUBSCRIBE_UN_ERROR);
}
int i = masterAuthorUnactiveService.selectCount(new EntityWrapper().eq("maintain_id", versionId).eq("user_id", userId));
if (i > 0) {
return Result.error(CodeMsg.Active_UN_ERROR);
}
MasterAuthor masterAuthor = new MasterAuthor().setTableName(maintain.getTableName());
TUser user = new TUser().setUserId(userId);
com.highdatas.mdm.pojo.Page initPageInfo = DbUtils.masterAuthorService.getInitPageInfo(masterAuthor, maintain, user, increment);
if (initPageInfo != null) {
return Result.success(initPageInfo.getRecordCount());
}
return Result.success(0);
} else if (type.equalsIgnoreCase(Constant.View)) {
SysView sysView = viewService.selectById(dataId);
if (sysView == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
Boolean active = sysView.getActive();
if (!active) {
return Result.error(CodeMsg.Active_UN_ERROR);
}
long viewCount = viewService.getViewCount(sysView);
return Result.success(viewCount);
} else {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
}
@RequestMapping(value = "/api/data", method = RequestMethod.POST)
public Result data(@RequestBody JSONObject reqObj) {
SysDispenseLogs logs = new SysDispenseLogs().setId(DbUtils.getUUID()).setCreateTime(new Date());
logs.setTouchType("rest");
logs.insert();
String token = reqObj.getString("token");
String type = reqObj.getString("type");
String dataId = reqObj.getString("dataId");
String versionId = reqObj.getString("versionId");
String incrementStr = reqObj.getString("increment");
Integer beginNo = reqObj.getInteger("beginNo");
Integer endNo = reqObj.getInteger("endNo");
logs.setTopicId(type).setTagId(dataId).setDataType(type);
if (beginNo == null || endNo == null) {
logs.setErrorInfo("beginNo or endNo not exists").setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
} else if (endNo < beginNo) {
logs.setErrorInfo("beginNo > endNo ").setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
if (beginNo < 0 || endNo < 0) {
logs.setErrorInfo("beginNo or endNo < 0").setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
if (StringUtils.isEmpty(token) || StringUtils.isEmpty(type) || StringUtils.isEmpty(dataId)) {
logs.setErrorInfo("token or type or dataId not found").setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
String userId = redisClient.getRedisVal(token);
if (StringUtils.isEmpty(userId)) {
logs.setErrorInfo(CodeMsg.ERROR_FIND_TOKEN.getMsg()).setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_FIND_TOKEN);
}
TUser userById = DbUtils.getUserById(userId);
logs.setUserName(userById.getUserName());
logs.setUserId(userId).updateById();
boolean increment = true;
if (!StringUtils.isEmpty(incrementStr)) {
increment = Boolean.valueOf(incrementStr);
}
com.highdatas.mdm.pojo.Page initPageInfo = null;
if (type.equalsIgnoreCase(Constant.Master)) {
if (StringUtils.isEmpty(versionId)) {
logs.setErrorInfo("versionId not exists").setStatus("false").updateById();
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
Maintain maintain = maintainService.selectById(versionId);
if (maintain == null) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
logs.setMaintainId(maintain.getId()).setVersion(maintain.getVersion());
logs.updateById();
SysMenu sysMenu = menuService.selectById(dataId);
if (sysMenu == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
logs.setName(sysMenu.getName());
logs.updateById();
int subscribeCnt = subscribeService.selectCount(new EntityWrapper().eq("menu_id", dataId).eq("user_id", userId));
if (subscribeCnt < 1) {
logs.setErrorInfo(CodeMsg.SUBSCRIBE_UN_ERROR.getMsg()).updateById();
return Result.error(CodeMsg.SUBSCRIBE_UN_ERROR);
}
int i = masterAuthorUnactiveService.selectCount(new EntityWrapper().eq("maintain_id", versionId).eq("user_id", userId));
if (i > 0) {
logs.setErrorInfo(CodeMsg.Active_UN_ERROR.getMsg()).updateById();
return Result.error(CodeMsg.Active_UN_ERROR);
}
MasterAuthor masterAuthor = new MasterAuthor().setTableName(maintain.getTableName());
TUser user = new TUser().setUserId(userId);
initPageInfo = masterAuthorService.getInitPageInfo(masterAuthor, maintain, user, increment);
if (initPageInfo == null) {
return Result.success(null);
}
boolean b = refreshInitPage(initPageInfo, beginNo, endNo);
if(!b) {
return Result.error(CodeMsg.ERROR_SIZE_TOO_LONG);
}
if (increment) {
String maintainTableName = maintain.getTableName();
String tempTableName = maintainTableName + Constant.RECORD;
List fieldByMaintain = DbUtils.fieldService.getFieldByMaintain(maintain.getId());
List fieldList = fieldByMaintain.stream().map(sysField -> sysField.getField()).collect(Collectors.toList());
String fields = fieldByMaintain.stream().map(sysField -> sysField.getField()).collect(Collectors.joining(Constant.COMMA));
String filter = DbUtils.masterAuthorService.getFilter(user, maintain.getId());
if (StringUtils.isEmpty(filter)) {
filter = Constant.WHERE_DEFAULT;
}
List