package com.highdatas.mdm.controller;
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.Flows;
import com.highdatas.mdm.entity.Maintain;
import com.highdatas.mdm.entity.TUser;
import com.highdatas.mdm.mapper.MaintainDetailMapper;
import com.highdatas.mdm.mapper.TableInfoMapper;
import com.highdatas.mdm.pojo.ActivitiStatus;
import com.highdatas.mdm.pojo.CodeMsg;
import com.highdatas.mdm.pojo.Operate;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.service.*;
import com.highdatas.mdm.util.Constant;
import com.highdatas.mdm.util.DbUtils;
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 java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
* @description 数据版本接口
* @author kimi
* @since 2019-12-16
*/
@RestController
@RequestMapping("/maintain")
public class MaintainController {
@Autowired
IMaintainService maintainService;
@Autowired
IMaintainDetailService maintainDetailService;
@Autowired
TableInfoMapper tableInfoMapper;
@Autowired
IFlowsService flowsService;
@Autowired
IMaintainFieldService maintainFieldService;
@Autowired
IMasterAuthorService masterAuthorService;
@Autowired
MaintainDetailMapper maintainDetailMapper;
/**
*
* @description: 通过id获取版本信息
* @param id maintainId
* @return: maintain信息
*
*/
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public Result get(@PathVariable String id) {
//通过id获取版本信息
Maintain maintain = maintainService.selectById(id);
if (maintain == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
return Result.success(maintain);
}
/**
*
* @description: 通过id 获取上个版本的相关数据
* @param maintainId 版本id
* @param id 数据id
* @return: 上个版本的数据信息
*
*/
@RequestMapping(value = "/getPreInfo/{id}", method = RequestMethod.GET)
public Result getPreInfo(@PathVariable String id, @RequestParam String maintainId) {
//通过id获取版本信息
Maintain maintain = maintainService.selectById(maintainId);
if (maintain == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
//通过id获取上个版本的数据信息
Map preInfo = maintainService.getPreInfo(maintain, id);
return Result.success(preInfo);
}
/**
*
* @description: 获取未提交的数据列表
* @param tableName 表名
* @param pageNo 页数
* @return: 未提交数据
*
*/
@RequestMapping(value = "{tableName}/unSubmit/{pageNo}", method = RequestMethod.GET)
public Result unSubmit(@PathVariable String tableName, @PathVariable Integer pageNo, HttpServletRequest request) throws UnsupportedEncodingException {
//pageSize 每页数据量 , whereSegment筛选条件
String pageSize = request.getParameter("pageSize");
String whereSegment = request.getParameter("whereSegment");
//请求头里获取用户信息
TUser user = DbUtils.getUser(request);
//获取筛选
if (StringUtils.isEmpty(whereSegment)) {
whereSegment = Constant.WHERE_DEFAULT;
}else {
whereSegment = URLDecoder.decode(whereSegment, "UTF-8");
}
//获取未提交的数据
return maintainService.getUnSubmitData(user, tableName, pageNo, pageSize, whereSegment);
}
/**
*
* @description: 获取未提交的数据量
* @param tableName 表名
* @return: 未提交数据量
*
*/
@RequestMapping(value = "{tableName}/unSubmitCnt", method = RequestMethod.GET)
public Result unSubmitCnt(@PathVariable String tableName,HttpServletRequest request) throws UnsupportedEncodingException {
//whereSegment 筛选条件
String whereSegment = request.getParameter("whereSegment");
TUser user = DbUtils.getUser(request);
if (StringUtils.isEmpty(whereSegment)) {
whereSegment = Constant.WHERE_DEFAULT;
}else {
whereSegment = URLDecoder.decode(whereSegment, "UTF-8");
}
//获取未提交的数据量
Long unSubmitDataCnt = maintainService.getUnSubmitDataCnt(user, tableName, whereSegment);
return Result.success(unSubmitDataCnt);
}
/**
*
* @description: 获取未审批的数据量
* @param tableName 表名
* @return: 未审批数据量
*
*/
@RequestMapping(value = "{tableName}/unflowCnt", method = RequestMethod.GET)
public Result unflow(@PathVariable String tableName, HttpServletRequest request) throws UnsupportedEncodingException {
//whereSegment 筛选条件
String whereSegment = request.getParameter("whereSegment");
TUser user = DbUtils.getUser(request);
//组合筛选条件
if (StringUtils.isEmpty(whereSegment)) {
whereSegment = Constant.WHERE_DEFAULT;
}else {
whereSegment = URLDecoder.decode(whereSegment, "UTF-8");
}
//获取未审批的数据条数
Long invalidVerionDataCnt = maintainService.getInvalidVerionDataCnt(user, tableName, whereSegment);
return Result.success(invalidVerionDataCnt);
}
/**
*
* @description: 获取未提交的数据列表
* @param tableName 表名
* @param pageNo 页数
* @return: 未提交数据
*
*/
@RequestMapping(value = "{tableName}/unflow/{pageNo}", method = RequestMethod.GET)
public Result unflow(@PathVariable String tableName, @PathVariable Integer pageNo, HttpServletRequest request) throws UnsupportedEncodingException {
//pageSize 每页数据量 , whereSegment筛选条件
String pageSize = request.getParameter("pageSize");
String whereSegment = request.getParameter("whereSegment");
//请求头里获取用户信息
TUser user = DbUtils.getUser(request);
//组装筛选条件
if (StringUtils.isEmpty(whereSegment)) {
whereSegment = Constant.WHERE_DEFAULT;
}else {
whereSegment = URLDecoder.decode(whereSegment, "UTF-8");
}
//获取未审批通过的数据
if (StringUtils.isEmpty(pageSize)) {
return maintainService.getInvalidVerionData(user, tableName, whereSegment, pageNo, null);
} else {
return maintainService.getInvalidVerionData(user, tableName, whereSegment, pageNo, Integer.valueOf(pageSize));
}
}
/**
*
* @description: 获取主题的版本list
* @param tableName 表名
* @return: 主题的版本list
*
*/
@RequestMapping(value = "/version/{tableName}", method = RequestMethod.GET)
public Result getHistory(@PathVariable String tableName, HttpServletRequest request) {
//获取请求头里的用户信息
TUser user = DbUtils.getUser(request);
String userId = user.getUserId();
//获取最大版本
Maintain maxVersion = maintainService.getMaxVersion(tableName);
if (maxVersion == null) {
return Result.error(new CodeMsg(100001,"无当前版本"));
}
//获取当前版本
Maintain nowVersion = maintainService.getNowVersion(tableName);
//获取版本list
List maintainList = maintainService.selectList(new EntityWrapper().eq("table_name", tableName).orderBy("order_no",false));
List result = new ArrayList<>();
int count = 0;
for (Maintain maintain : maintainList) {
String flowId = maintain.getFlowId();
//去除未生效的版本
if (StringUtils.isEmpty(flowId)) {
continue;
}
//校验是否有权限
boolean author = masterAuthorService.checkMaintainAuthor(user, maintain.getId());
if (!author) {
continue;
}
Flows flows = flowsService.selectById(maintain.getFlowId());
if (flows.getStatus().equals(ActivitiStatus.close)) {
continue;
}
//校验是否为下一节点审批人
if (flows.getStatus().equals(ActivitiStatus.working) || flows.getStatus().equals(ActivitiStatus.refuse)) {
boolean nextAudit = flowsService.isNextAudit(flows, userId);
if (nextAudit) {
count++;
}
// count++;
continue;
}else if(flows.getStatus().equals(ActivitiStatus.open)){
//历史i版本状态为1
maintain.setMaintainType(1);
}
if (nowVersion != null && maintain.getId().equalsIgnoreCase(nowVersion.getId())) {
//当前版本状态为0
maintain.setMaintainType(0);
}
result.add(maintain);
}
//
int cnt = maintainFieldService.getUnFlowCount(tableName, userId);
count += cnt;
if (count > 0) {
//未生效版本状态为-1
Maintain maintain = new Maintain();
maintain.setMaintainType(-1);
maintain.setVersion("待审核");
maintain.setTableName(tableName);
maintain.setRecordCount(count);
result.add(maintain);
}
//list 倒叙
Collections.sort(result, new Comparator() {
@Override
public int compare(Maintain o1, Maintain o2) {
return o1.getMaintainType().compareTo(o2.getMaintainType());
}
});
return Result.success(result);
}
// /**
// *
// * @description: 获取主题的版本list
// * @param tableName 表名
// * @return: 主题的版本list
// *
// */
// @RequestMapping(value = "/detail/{id}/{pageNo}", method = RequestMethod.GET)
// public Result detail(@PathVariable String id, @PathVariable int pageNo) {
// Maintain maintain = maintainService.selectById(id);
// String tableName = maintain.getTableName();
// String tableTempName = tableName + Constant.RECORD;
//
// List maintainDetailList = maintainDetailService.selectList(new EntityWrapper().eq("parent_id", id));
//
// return Result.success(maintain);
// }
/**
*
* @description: 获取所有版本的list
* @param pageno yeshu
* @return: 所有版本的list
*
*/
@RequestMapping(value = "/all/{pageno}", method = RequestMethod.GET)
public Result all(@PathVariable int pageno, HttpServletRequest request) {
//表名
String tableName = request.getParameter("tableName");
//检验表名是否存在
String s = tableInfoMapper.selectTableByName(tableName);
Page result;
//pageSize 每页数据量
String pageSize = request.getParameter("pageSize");
Page maintainPage;
if (StringUtils.isEmpty(pageSize)) {
maintainPage = new Page(pageno, 20);
} else {
maintainPage = new Page(pageno, Integer.valueOf(pageSize));
}
//筛选--表名
if (StringUtils.isEmpty(tableName)) {
result = maintainService.selectPage(maintainPage);
} else {
Wrapper tableNameWrapper = new EntityWrapper().eq("table_name", tableName);
tableNameWrapper.orderBy("order_no desc");
result = maintainService.selectPage(maintainPage, tableNameWrapper);
}
List records = result.getRecords();
List resultObj = new ArrayList<>();
for (Maintain record : records) {
//校验是否审批结束
String flowId = record.getFlowId();
if (StringUtils.isEmpty(flowId)) {
continue;
}
Flows flows = flowsService.selectById(flowId);
if (flows == null || !flows.getStatus().equals(ActivitiStatus.open)) {
continue;
}
//校验用户是否存在
String chargeId = record.getChargeId();
TUser user = DbUtils.getUserById(chargeId);
if (user == null) {
record.setChargeId("用户已删除");
}else {
record.setChargeId(user.getUserName());
}
resultObj.add(record);
}
result.setRecords(resultObj);
return Result.success(result);
}
/**
*
* @description: 获取允许比较的版本list
* @param pageNo 页数
* @return: 允许比较的版本list
*
*/
@RequestMapping(value = "/compareList/{pageNo}", method = RequestMethod.GET)
public Result compare(@PathVariable Integer pageNo, @RequestParam String tableName, HttpServletRequest request) {
//pageSize 每页数据量
String pageSizeStr = request.getParameter("pageSize");
int pageSize = 15;
if (!StringUtils.isEmpty(pageSizeStr)) {
pageSize = Integer.valueOf(pageSizeStr);
}
//筛选掉不含流程信息后的版本list
List maintainList = maintainService.selectList(new EntityWrapper().eq("table_name", tableName).isNotNull("flow_id").orderBy("order_no desc"));
com.highdatas.mdm.pojo.Page page = new com.highdatas.mdm.pojo.Page(maintainList.size());
page.setPageNo(pageNo);
page.setPageSize(pageSize);
//筛选审批成功的版本list,即当前生效的版本
List collect = maintainList.stream().filter(maintain -> ActivitiStatus.open.equals(flowsService.getStatusByBusinessId(maintain.getId())))
.skip(page.getBeginRecordNo_1()).limit(pageSize).collect(Collectors.toList());
List> result = new ArrayList<>();
for (int i = 0; i < collect.size(); i++) {
Maintain maintain = collect.get(i);
String version = maintain.getVersion();
Date createTime = maintain.getCreateTime();
String chargeId = maintain.getChargeId();
TUser user = DbUtils.getUserById(chargeId);
HashMap oneResult = new HashMap<>();
oneResult.put("version", version);
oneResult.put("time", createTime);
oneResult.put("userName", chargeId);
oneResult.put("id", maintain.getId());
if (user != null) {
//添加用户信息
oneResult.put("userName", user.getUserName());
}
if (i < collect.size() - 1) {
//获取上个版本的版本信息
Maintain preMaintain = collect.get(i + 1);
//BY操作类型获取上个版本的数据量
List