package com.highdatas.mdm.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.highdatas.mdm.entity.*;
import com.highdatas.mdm.mapper.SysViewMapper;
import com.highdatas.mdm.mapper.TableInfoMapper;
import com.highdatas.mdm.pojo.*;
import com.highdatas.mdm.pojo.kettle.UnBigDataDataSourceInfo;
import com.highdatas.mdm.service.*;
import com.highdatas.mdm.util.*;
import com.highdatas.mdm.util.pool.MqEntity;
import com.highdatas.mdm.util.pool.MqMessage;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author kimi
* @since 2020-04-15
*/
@Service
@Slf4j
public class SysViewServiceImpl extends ServiceImpl implements ISysViewService {
@Autowired
ISysViewJoinService joinService;
@Autowired
IMaintainService maintainService;
@Autowired
UnBigDataDataSourceInfo unBigDataDataSourceInfo;
@Autowired
TableInfoMapper tableInfoMapper;
@Autowired
SysViewMapper viewMapper;
@Autowired
MasterDataService masterDataService;
@Autowired
IMasterAuthorService masterAuthorService;
@Autowired
ISysMenuService menuService;
@Autowired
IMenuMappingService menuMappingService;
@Autowired
ISysFieldService fieldService;
@Autowired
DispenseService dispenseService;
@Autowired
RuleClient ruleClient;
@Autowired
AntianaphylaxisClient antianaphylaxisClient;
@Autowired
RedisClient redisClient;
@Override
public Page getInitPageInfo(String viewId) {
SysView sysView = selectById(viewId);
String userId = sysView.getUserId();
String realRedisKey = RedisClient.getRealRedisKey(userId + "-" + sysView.getId());
Object redisValObj = redisClient.getRedisValObj(realRedisKey);
if (redisValObj != null) {
JSONObject object = (JSONObject) redisValObj;
Page page = JSONObject.parseObject(object.toJSONString(), Page.class);
return page;
}
Page page = new Page(0);
String viewTableName = sysView.getViewTableName();
List tableField = tableInfoMapper.getTableField(viewTableName);
int totalLength = 0;
for (TableSchemaResult tableSchemaResult : tableField) {
int length = tableSchemaResult.getLength();
totalLength += length;
}
int pageSize = 20;
if (totalLength != 0) {
pageSize = Constant.MaxDispenseSize / totalLength;
}
page.setPageSize(pageSize);
Long viewCount = getViewCount(sysView);
if (viewCount == 0) {
redisClient.putRedisValObj(realRedisKey, page);
return page;
}
page.setRecordCount(viewCount.intValue());
int pages;
if (viewCount % pageSize == 0) {
pages = Long.valueOf(viewCount/pageSize).intValue();
}else {
pages = (Long.valueOf(viewCount/pageSize).intValue()) + 1;
}
page.setPages(pages);
redisClient.putRedisValObj(realRedisKey, page);
return page;
}
@Override
public boolean createView(String viewId) {
try {
SysView sysView = selectById(viewId);
if (sysView == null) {
log.error("view not found");
return false;
}
String userId = sysView.getUserId();
TUser user = DbUtils.getUserById(userId);
if (user == null) {
log.error("user not found");
return false;
}
Maintain baseMaintain = getBaseMaintain(sysView);
if (baseMaintain == null) {
log.error("baseMaintain not found");
return false;
}
String baseTableName = baseMaintain.getTableName();
sysView.setBaseTableName(baseTableName);
List totalFieldList = getTotalFieldList(sysView);
//
String tableName = getViewTableName(sysView);
log.info("View TABLE name:" + tableName);
totalFieldList.add(Constant.ID);
boolean created = dropCreateViewTable(totalFieldList, tableName);
//TODO 主键
if (!created) {
log.info("un create view table:" + tableName);
return false;
}
totalFieldList.remove(Constant.ID);
List baseFieldList = getBaseFieldList(sysView);
//trans first
if (baseFieldList == null && baseFieldList.isEmpty()) {
log.error("base field not found:");
return false;
}
baseFieldList.add(Constant.ID);
String baseFields = baseFieldList.stream()
.map(s -> Constant.ID.equalsIgnoreCase(s) ? Constant.MYSQL_UUID : s)
.collect(Collectors.joining(Constant.COMMA));
String fixBaseFields = baseFieldList.stream()
.map(s -> Constant.ID.equalsIgnoreCase(s) ? Constant.ID : changeFieldName(baseTableName, s))
.collect(Collectors.joining(Constant.COMMA));
baseFieldList.remove(Constant.ID);
String filter = masterAuthorService.getFilter(user, baseMaintain.getId());
if (StringUtils.isEmpty(filter)) {
filter = Constant.WHERE_DEFAULT;
}
log.info("View base filter:" + filter);
String s = masterDataService.selectByVersionSql(null, baseTableName, baseFieldList, filter, baseMaintain.getVersion(), false);
log.info("View base select sql:" + s);
//base INSERT
tableInfoMapper.insertOneSelect(tableName, fixBaseFields, baseFields, s);
log.info("insert select");
// left insert
InsertJoin(sysView);
log.info("insert left join");
// change val common
changeValCommon(sysView);
log.info("changeValCommon");
//change logic
boolean checked = checkTempData(sysView);
if (!checked) {
sysView.setStatus(ViewStatus.unChecked).updateById();
} else {
sysView.setStatus(ViewStatus.working).updateById();
}
//
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean checkTempData(SysView sysView) {
SysAssembleCheckType checkType = sysView.getCheckType();
if (checkType == null) {
return false;
}
if (checkType.equals(SysAssembleCheckType.unlimited)) {
return true;
}
HashMap fieldResultSet = ruleClient.execuImmeForCollect(sysView.getViewTableName(), sysView.getUserId());
switch (checkType){
case successAdd:
String unSuccessFields = fieldResultSet.keySet().stream().filter(s -> !fieldResultSet.get(s)).collect(Collectors.joining(Constant.COMMA));
if (fieldResultSet.keySet().contains(false)) {
return false;
}
break;
case partSuccessAdd:
String checkFields = sysView.getCheckField();
String[] split = checkFields.split(Constant.SEMICOLON);
for (String s : split) {
Boolean checked = fieldResultSet.get(s);
if (checked == null || !checked) {
return false;
}
}
break;
}
return true;
}
private void InsertJoin(SysView sysView) {
String userId = sysView.getUserId();
TUser user = DbUtils.getUserById(userId);
String baseTableName = sysView.getBaseTableName();
String tableName = sysView.getViewTableName();
ContentBuilder joinBuilder = new ContentBuilder(Constant.EMPTY);
ContentBuilder updateFieldBuilder = new ContentBuilder(Constant.COMMA);
List viewJoinList = sysView.getViewJoinList();
for (SysViewJoin sysViewJoin : viewJoinList) {
sysViewJoin.setBaseField(changeFieldName(sysView.getBaseTableName(), sysViewJoin.getBaseField()));
Maintain joinMaintain = getJoinMaintain(sysViewJoin);
String joinTableName = joinMaintain.getTableName();
sysViewJoin.setBaseTableName(sysView.getViewTableName());
String joinStr = sysViewJoin.createJoinStr();
if (StringUtils.isEmpty(joinStr)) {
continue;
}
joinBuilder.append(joinStr);
List subFieldList = getSubFieldList(sysViewJoin, user);
for (String subOneField : subFieldList) {
String changeFieldName = changeFieldName(sysViewJoin.getJoinTableName(), subOneField);
String base = MessageFormat.format(Constant.Alias, sysView.getViewTableName(), changeFieldName);
String join = MessageFormat.format(Constant.Alias, joinTableName, subOneField);
Segment segment = new Segment(base, join);
updateFieldBuilder.append(segment.toRawString());
}
}
// JOIN
String joinSql = joinBuilder.toString();
if (StringUtils.isEmpty(joinSql)) {
log.info("sysViewJoin sql is null");
return;
}
tableInfoMapper.updateJoin(tableName, joinSql, updateFieldBuilder.toString(), Constant.WHERE_DEFAULT);
}
private void changeValCommon(SysView sysView) {
String mappingField = sysView.getMappingField();
String tableName = sysView.getViewTableName();
String mappingTable = sysView.getMappingTable();
mappingTable = tableInfoMapper.selectTableByName(mappingTable);
if (StringUtils.isEmpty(mappingTable)) {
return;
}
List split = DbUtils.split(mappingField);
for (String oneMapField : split) {
String base = MessageFormat.format(Constant.Alias, tableName, oneMapField);
String join = MessageFormat.format(Constant.Alias, mappingTable, Constant.Pre);
String updateJoin = MessageFormat.format(Constant.Alias, mappingTable, Constant.fix);
Segment joinSegment = new Segment(base, join);
Segment updateSegment = new Segment(base, updateJoin);
Segment filterSegment = new Segment(MessageFormat.format(Constant.Alias, mappingTable, Constant.Code), oneMapField);
String changeJoinStr = MessageFormat.format(Constant.InnerJoinTemplate, ViewJoinType.inner, mappingTable, joinSegment.toRawString());
if (StringUtils.isEmpty(changeJoinStr)){
return;
}
tableInfoMapper.updateJoin(tableName, changeJoinStr, updateSegment.toRawString(), filterSegment.toString());
}
}
private boolean dropCreateViewTable(List totalFieldList, String tableName) {
boolean created = unBigDataDataSourceInfo.dropData(tableName);
if (!created) {
return false;
}
created = unBigDataDataSourceInfo.createTable(tableName, totalFieldList);
if (!created) {
//TODO
return false;
}
return true;
}
@Override
public String getViewTableName(SysView view) {
String viewTableName = view.getViewTableName();
if (StringUtils.isEmpty(viewTableName)) {
Maintain baseMaintain = getBaseMaintain(view);
viewTableName = Constant.VIEW + baseMaintain.getTableName() + baseMaintain.getOrderNo() + DbUtils.getUUID(5);
view.setViewTableName(viewTableName).updateById();
}
return viewTableName;
}
@Override
public String getMappingTableName(SysView view) {
String id = view.getId();
String top = id.substring(0, 5);
String mappingTableName = Constant.VIEW + top + "mapping" + DbUtils.getUUID(4);
view.setMappingTable(mappingTableName).updateById();
return mappingTableName;
}
@Override
public List getSubFieldList(SysViewJoin join, TUser user) {
String fieldsStr = join.getFields();
List baseFieldList = new ArrayList<>();
if (Constant.All.equalsIgnoreCase(fieldsStr)) {
Maintain joinMaintain = getJoinMaintain(join);
List fieldList = masterAuthorService.getField(user, joinMaintain.getId());
if (fieldList != null) {
baseFieldList = fieldList.stream().map(sysField -> sysField.getField()).collect(Collectors.toList());
}
}else {
baseFieldList = DbUtils.split(fieldsStr);
}
return baseFieldList;
}
private List getBaseFieldList(SysView sysView) {
String fieldsStr = sysView.getFields();
List baseFieldList = new ArrayList<>();
if (Constant.All.equalsIgnoreCase(fieldsStr)) {
String userId = sysView.getUserId();
TUser user = DbUtils.getUserById(userId);
Maintain baseMaintain = getBaseMaintain(sysView);
List fieldList = masterAuthorService.getField(user, baseMaintain.getId());
baseFieldList = fieldList.stream().map(sysField -> sysField.getField()).collect(Collectors.toList());
}else {
baseFieldList = DbUtils.split(fieldsStr);
}
return baseFieldList;
}
@Override
public List getMapField(SysView sysView) {
List result = new ArrayList<>();
Maintain baseMaintain = getBaseMaintain(sysView);
SysMenu menuByTableName = menuMappingService.getMenuByTableName(baseMaintain.getTableName());
if (menuByTableName == null) {
return null;
}
List baseFieldList = getBaseFieldList(sysView);
for (String field : baseFieldList) {
String changeFieldName = changeFieldName(baseMaintain.getTableName(), field);
SysField oneFieldByMaintainField = fieldService.getOneFieldByMaintain(baseMaintain.getId(), field);
if (oneFieldByMaintainField == null) {
continue;
}
ViewMapFieldItem viewMapFieldItem = new ViewMapFieldItem();
viewMapFieldItem.setChangedField(changeFieldName);
viewMapFieldItem.setField(field);
viewMapFieldItem.setFieldName(oneFieldByMaintainField.getAlias());
viewMapFieldItem.setMenuId(menuByTableName.getId());
viewMapFieldItem.setMenuName(menuByTableName.getName());
result.add(viewMapFieldItem);
}
String userId = sysView.getUserId();
TUser user = DbUtils.getUserById(userId);
List joinList = getJoinList(sysView);
for (SysViewJoin sysViewJoin : joinList) {
Maintain joinMaintain = getJoinMaintain(sysViewJoin);
SysMenu subMenu = menuMappingService.getMenuByTableName(joinMaintain.getTableName());
List subFieldList = getSubFieldList(sysViewJoin, user);
for (String subField : subFieldList) {
String changeFieldName = changeFieldName(joinMaintain.getTableName(), subField);
SysField oneFieldByMaintainField = fieldService.getOneFieldByMaintain(joinMaintain.getId(), subField);
if (oneFieldByMaintainField == null) {
continue;
}
ViewMapFieldItem viewMapFieldItem = new ViewMapFieldItem();
viewMapFieldItem.setChangedField(changeFieldName);
viewMapFieldItem.setField(subField);
viewMapFieldItem.setFieldName(oneFieldByMaintainField.getAlias());
viewMapFieldItem.setMenuId(subMenu.getId());
viewMapFieldItem.setMenuName(subMenu.getName());
result.add(viewMapFieldItem);
}
}
return result;
}
private List getJoinList(SysView sysView) {
String id = sysView.getId();
Wrapper eq = new EntityWrapper().eq(Constant.PARENT_ID, id);
List joinList = joinService.selectList(eq);
return joinList;
}
public List getTotalFieldList(SysView sysView) {
String userId = sysView.getUserId();
TUser user = DbUtils.getUserById(userId);
List totalFieldList = new ArrayList<>();
Maintain baseMaintain = getBaseMaintain(sysView);
List baseFieldList = getBaseFieldList(sysView);
totalFieldList.addAll(baseFieldList);
totalFieldList = totalFieldList.stream().map(s -> changeFieldName(baseMaintain.getTableName(), s)).collect(Collectors.toList());
List sysViewJoins = joinService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, sysView.getId()));
for (SysViewJoin sysViewJoin : sysViewJoins) {
Maintain joinMaintain = getJoinMaintain(sysViewJoin);
List subFieldList = getSubFieldList(sysViewJoin, user);
subFieldList = subFieldList.stream().map(s -> changeFieldName(joinMaintain.getTableName(), s)).collect(Collectors.toList());
totalFieldList.addAll(subFieldList);
sysViewJoin.setJoinTableName(joinMaintain.getTableName());
sysViewJoin.setBaseTableName(baseMaintain.getTableName());
}
sysView.setViewJoinList(sysViewJoins);
return totalFieldList;
}
@Override
public Maintain getBaseMaintain(SysView sysView) {
String baseMaintainStr = sysView.getBaseMaintain();
if (StringUtils.isEmpty(baseMaintainStr)) {
return null;
}
Maintain baseMaintain;
if (sysView.getNeedUpdate()) {
baseMaintain = maintainService.getNowVersion(baseMaintainStr);
}else {
baseMaintain = maintainService.selectById(baseMaintainStr);
}
return baseMaintain;
}
@Override
public Maintain getJoinMaintain(SysViewJoin viewJoin) {
String baseMaintainStr = viewJoin.getJoinMaintain();
if (StringUtils.isEmpty(baseMaintainStr)) {
return null;
}
Maintain baseMaintain;
if (viewJoin.getNeedUpdate()) {
baseMaintain = maintainService.getNowVersion(baseMaintainStr);
}else {
baseMaintain = maintainService.selectById(baseMaintainStr);
}
return baseMaintain;
}
@Override
public String changeFieldName(String baseTableName, String field) {
return DbUtils.StrJoinLink(Constant.EMPTY_Str, baseTableName, Constant.UnderLine, field);
}
@Override
public void dealFlow(String maintainId, ActivitiStatus status) {
try {
if (!ActivitiStatus.open.equals(status)) {
return;
}
Maintain maintain = maintainService.selectById(maintainId);
String maintainTableName = maintain.getTableName();
Wrapper eq = new EntityWrapper()
.eq("need_update", true)
.eq("base_maintain", maintainTableName);
List sysViews = selectList(eq);
for (SysView sysView : sysViews) {
ViewStatus viewStatus = sysView.getStatus();
if (!ViewStatus.working.equals(viewStatus)) {
continue;
}
createView(sysView.getId());
Boolean subscribe = sysView.getSubscribe();
if (!subscribe) {
continue;
}
MqEntity mqEntity = new MqEntity();
mqEntity.setUserId(sysView.getUserId());
mqEntity.setMsgTopicName(Constant.View);
mqEntity.setType(Constant.View);
mqEntity.setDataId(sysView.getId());
mqEntity.setMsgTagName(sysView.getId());
mqEntity.setMsgKey(DbUtils.getUUID(16));
MqMessage mqMessage = new MqMessage(mqEntity);
dispenseService.pushActiveMq(mqMessage);
}
return;
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result deleteView(String id) throws Exception {
SysView sysView = selectById(id);
if (sysView == null) {
return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
}
joinService.delete(new EntityWrapper().eq(Constant.PARENT_ID, id));
String viewTableName = sysView.getViewTableName();
if (!StringUtils.isEmpty(viewTableName)) {
unBigDataDataSourceInfo.dropData(viewTableName);
}
String mappingTable = sysView.getMappingTable();
if (!StringUtils.isEmpty(mappingTable)) {
unBigDataDataSourceInfo.dropData(mappingTable);
}
sysView.deleteById();
return Result.success(CodeMsg.DELETE_SUCCESS);
}
@Override
public List getViewFieldMap(String viewId) {
SysView sysView = selectById(viewId);
if (sysView == null) {
return null;
}
Maintain baseMaintain = getBaseMaintain(sysView);
if (baseMaintain == null) {
return null;
}
String menuId = sysView.getMenuId();
SysMenu sysMenu = menuService.selectById(menuId);
if (sysMenu == null) {
return null;
}
List baseFieldList = getBaseFieldList(sysView);
ArrayList dictList = new ArrayList<>();
for (String field : baseFieldList) {
ViewDictItem viewDictItem = new ViewDictItem();
viewDictItem.setMenuId(sysMenu.getId());
viewDictItem.setRawField(field);
String changeFieldName = changeFieldName(baseMaintain.getTableName(), field);
viewDictItem.setViewField(changeFieldName);
dictList.add(viewDictItem);
}
List sysViewJoins = joinService.selectList(new EntityWrapper().eq(Constant.PARENT_ID, sysView.getId()));
for (SysViewJoin sysViewJoin : sysViewJoins) {
String subMenuId = sysViewJoin.getMenuId();
SysMenu subMenu = menuService.selectById(subMenuId);
if (subMenu == null) {
continue;
}
Maintain joinMaintain = getJoinMaintain(sysViewJoin);
if (joinMaintain == null) {
continue;
}
String fields = sysViewJoin.getFields();
List subFieldList = DbUtils.split(fields);
for (String field : subFieldList) {
ViewDictItem viewDictItem = new ViewDictItem();
viewDictItem.setMenuId(subMenu.getId());
viewDictItem.setRawField(field);
String changeFieldName = changeFieldName(joinMaintain.getTableName(), field);
viewDictItem.setViewField(changeFieldName);
dictList.add(viewDictItem);
}
}
return dictList;
}
@Override
public Result getMapData(SysView sysView, String changedField, Integer pageNo, int pageSize) {
String mappingTable = sysView.getMappingTable();
if (StringUtils.isEmpty(mappingTable) && !StringUtils.isEmpty(sysView.getMappingField())) {
return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
}
boolean exists = unBigDataDataSourceInfo.checkTableExists(mappingTable);
if (!exists) {
return null;
}
Segment segment = new Segment(Constant.Code, changedField);
Long count = tableInfoMapper.getCount(mappingTable, segment.toString());
if (count == 0) {
return null;
}
Page page = new Page(count);
page.setPageSize(pageSize);
page.setPageNo(pageNo);
ArrayList fields = new ArrayList<>();
fields.add(Constant.Code);
fields.add(Constant.Pre);
fields.add(Constant.fix);
String fieldStr = fields.stream().collect(Collectors.joining(Constant.COMMA));
List