终端模块新增对外接口

This commit is contained in:
2022-08-25 16:34:15 +08:00
parent cce56ec69b
commit 4be65353c9
21 changed files with 1610 additions and 28 deletions

View File

@@ -0,0 +1,75 @@
package com.njcn.harmonic.service;
import cn.hutool.json.JSONArray;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.harmonic.pojo.param.ReportTemplateParam;
import com.njcn.harmonic.pojo.po.ReportTemplate;
import com.njcn.harmonic.pojo.vo.ReportTemplateVO;
import com.njcn.harmonic.pojo.vo.ReportTreeVO;
import com.njcn.web.pojo.param.BaseParam;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* pqs
*
* @author cdf
* @date 2022/8/16
*/
public interface CustomReportService {
/**
* 新增自定义报表模板
* @author cdf
* @date 2022/8/16
*/
boolean addCustomReportTemplate(ReportTemplateParam reportTemplateParam);
/**
* 修改自定义报表模板
* @author cdf
* @date 2022/8/16
*/
boolean updateCustomReportTemplate(ReportTemplateParam reportTemplateParam);
/**
* 根据id获取模板
* @author cdf
* @date 2022/8/16
*/
ReportTemplate getCustomReportTemplateById(String id);
/**
* 模板列表
* @author cdf
* @date 2022/8/16
*/
Page<ReportTemplateVO> getReportTemplateList(BaseParam baseParam);
/**
* 删除模板
* @author cdf
* @date 2022/8/23
*/
boolean delTemplate(String id);
/**
* 切换模板激活状态
* @author cdf
* @date 2022/8/23
*/
boolean updateStatus(String id);
JSONArray getCustomReport();
List<ReportTreeVO> reportChooseTree();
}

View File

@@ -0,0 +1,475 @@
package com.njcn.harmonic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.harmonic.enums.HarmonicResponseEnum;
import com.njcn.harmonic.mapper.CustomReportMapper;
import com.njcn.harmonic.mapper.EleEpdMapper;
import com.njcn.harmonic.pojo.dto.ReportTemplateDTO;
import com.njcn.harmonic.pojo.param.ReportTemplateParam;
import com.njcn.harmonic.pojo.po.EleEpdPqd;
import com.njcn.harmonic.pojo.po.ReportTemplate;
import com.njcn.harmonic.pojo.vo.ReportTemplateVO;
import com.njcn.harmonic.pojo.vo.ReportTreeVO;
import com.njcn.harmonic.service.CustomReportService;
import com.njcn.influxdb.param.InfluxDBPublicParam;
import com.njcn.influxdb.utils.InfluxDbUtils;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.pojo.po.DictData;
import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.po.Dept;
import com.njcn.web.factory.PageFactory;
import com.njcn.web.pojo.param.BaseParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* pqs
* 自定义报表
*
* @author cdf
* @date 2022/8/16
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class CustomReportServiceImpl implements CustomReportService {
private final CustomReportMapper customReportMapper;
private final DeptFeignClient deptFeignClient;
private final EleEpdMapper eleEpdMapper;
private final InfluxDbUtils influxDbUtils;
private final DicDataFeignClient dicDataFeignClient;
@Override
public boolean addCustomReportTemplate(ReportTemplateParam reportTemplateParam) {
checkName(reportTemplateParam, false);
try {
new JSONArray(reportTemplateParam.getDocContent());
} catch (Exception e) {
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON);
}
ReportTemplate reportTemplate = new ReportTemplate();
BeanUtils.copyProperties(reportTemplateParam, reportTemplate);
reportTemplate.setState(DataStateEnum.ENABLE.getCode());
reportTemplate.setActive(DataStateEnum.DELETED.getCode());
customReportMapper.insert(reportTemplate);
return true;
}
@Override
public boolean updateCustomReportTemplate(ReportTemplateParam reportTemplateParam) {
checkName(reportTemplateParam, true);
try {
new JSONArray(reportTemplateParam.getDocContent());
} catch (Exception e) {
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON);
}
ReportTemplate reportTemplate = new ReportTemplate();
BeanUtils.copyProperties(reportTemplateParam, reportTemplate);
customReportMapper.updateById(reportTemplate);
return true;
}
@Override
public ReportTemplate getCustomReportTemplateById(String id) {
return customReportMapper.selectById(id);
}
@Override
public Page<ReportTemplateVO> getReportTemplateList(BaseParam baseParam) {
return customReportMapper.getReportTemplateList(new Page<>(PageFactory.getPageNum(baseParam),PageFactory.getPageSize(baseParam)),baseParam);
}
@Override
public boolean delTemplate(String id) {
ReportTemplate reportTemplate = new ReportTemplate();
reportTemplate.setId(id);
reportTemplate.setState(DataStateEnum.DELETED.getCode());
customReportMapper.updateById(reportTemplate);
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateStatus(String id) {
ReportTemplate report = new ReportTemplate();
report.setActive(0);
UpdateWrapper<ReportTemplate> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("sys_report_template.active",1).eq("sys_report_template.state",1);
customReportMapper.update(report,updateWrapper);
ReportTemplate reportTemplate = new ReportTemplate();
reportTemplate.setId(id);
reportTemplate.setActive(DataStateEnum.ENABLE.getCode());
customReportMapper.updateById(reportTemplate);
return true;
}
@Override
public JSONArray getCustomReport() {
List<String> stringList = new ArrayList<>();
List<ReportTemplateDTO> reportTemplateDTOList = new ArrayList<>();
LambdaQueryWrapper<ReportTemplate> lambdaQuery= new LambdaQueryWrapper<>();
lambdaQuery.eq(ReportTemplate::getActive,DataStateEnum.ENABLE.getCode())
.eq(ReportTemplate::getState,DataStateEnum.ENABLE.getCode());
ReportTemplate tem = customReportMapper.selectOne(lambdaQuery);
JSONArray jsonArray = new JSONArray(tem.getDocContent());
jsonArray.forEach(item->{
JSONObject jsonObject = (JSONObject)item;
JSONArray itemArr = (JSONArray) jsonObject.get("data");
itemArr.forEach((ite)->{
JSONArray j = (JSONArray)ite;
j.forEach(it->{
if (Objects.nonNull(it) && !"null".equals(it.toString())) {
JSONObject son = (JSONObject) it; //获取到1列
if (son.containsKey("v")) {
String v = son.getStr("v");
System.out.println(v);
if (v.charAt(0) == '$' && v.contains("#")) {
v=v.replace("$","");
String[] vItem = v.split("#");
ReportTemplateDTO reportTemplateDTO = new ReportTemplateDTO();
reportTemplateDTO.setItemName(v);
String t = vItem[0].replace("_","");
if(vItem.length == 3){
reportTemplateDTO.setTemplateName(t);
reportTemplateDTO.setPhase(vItem[1]);
reportTemplateDTO.setStatMethod(vItem[2]);
}else if(vItem.length == 2){
reportTemplateDTO.setTemplateName(t);
reportTemplateDTO.setStatMethod(vItem[1]);
reportTemplateDTO.setPhase("M");
}
if (vItem[0].contains("_")) {
String col = vItem[0].split("_")[0];
reportTemplateDTO.setName(col);
stringList.add(col);
} else {
reportTemplateDTO.setName(vItem[0]);
stringList.add(vItem[0]);
}
reportTemplateDTOList.add(reportTemplateDTO);
}
}
}
});
});
});
List<ReportTemplateDTO> endList = new ArrayList<>();
LambdaQueryWrapper<EleEpdPqd> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(EleEpdPqd::getName,stringList.stream().distinct().collect(Collectors.toList())).orderByAsc(EleEpdPqd::getSort);
List<EleEpdPqd> eleEpdPqdList = eleEpdMapper.selectList(lambdaQueryWrapper);
Map<String, List<EleEpdPqd>> mapEpd = eleEpdPqdList.stream().collect(Collectors.groupingBy(EleEpdPqd::getClassId));
mapEpd.forEach((key,tableClass)->{
List<String> column = tableClass.stream().map(EleEpdPqd::getName).distinct().collect(Collectors.toList());
List<ReportTemplateDTO> classList = reportTemplateDTOList.stream().filter(item->column.contains(item.getName())).collect(Collectors.toList());
Map<String, List<ReportTemplateDTO>> phaseMap = classList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getPhase));
//开始组织sql
phaseMap.forEach((phKey,phValue)->{
if("M".equals(phKey)){
}else {
Map<String, List<ReportTemplateDTO>> statMap = phValue.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getStatMethod));
statMap.forEach((statKey,statValue)->{
StringBuilder sql = new StringBuilder("select ");
if(statKey.equals("max")){
for(int i = 0;i<statValue.size();i++){
if(i==statValue.size()-1){
sql.append("MAX("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName());
}else {
sql.append("MAX("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName()).append(",");
}
}
sql.append(" from ").append(key).append(" where Phase = '").append(phKey).append("' and LineId='00B78D123456$DEV$NPQS588$0002$NPQS588$01'").append(" and Stat_Method='").append(statKey+"'").append(" order by time desc limit 1").append(InfluxDBPublicParam.TIME_ZONE);
List<Map<String, Object>> resMap = influxDbUtils.getMapResult(sql.toString());
if(CollUtil.isNotEmpty(resMap)) {
List<ReportTemplateDTO> temValue = statValue.stream().map(item -> {
String value = resMap.get(0).get(item.getTemplateName()).toString();
item.setValue(value);
return item;
}).collect(Collectors.toList());
endList.addAll(temValue);
}
}else if(statKey.equals("min")){
for(int i = 0;i<statValue.size();i++){
if(i==statValue.size()-1){
sql.append("MIN("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName());
}else {
sql.append("MIN("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName()).append(",");
}
}
sql.append(" from ").append(key).append(" where Phase = '").append(phKey).append("' and LineId='00B78D123456$DEV$NPQS588$0002$NPQS588$01'").append(" and Stat_Method='").append(statKey+"'").append(" order by time desc limit 1").append(InfluxDBPublicParam.TIME_ZONE);
List<Map<String, Object>> resMap = influxDbUtils.getMapResult(sql.toString());
if(CollUtil.isNotEmpty(resMap)) {
List<ReportTemplateDTO> temValue = statValue.stream().map(item -> {
String value = resMap.get(0).get(item.getTemplateName()).toString();
item.setValue(value);
return item;
}).collect(Collectors.toList());
endList.addAll(temValue);
}
}else if(statKey.equals("avg")){
for(int i = 0;i<statValue.size();i++){
if(i==statValue.size()-1){
sql.append("MEAN("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName());
}else {
sql.append("MEAN("+statValue.get(i).getTemplateName()+") as ").append(statValue.get(i).getTemplateName()).append(",");
}
}
sql.append(" from ").append(key).append(" where Phase = '").append(phKey).append("' and LineId='00B78D123456$DEV$NPQS588$0002$NPQS588$01'").append(" and Stat_Method='").append(statKey+"'").append(" order by time desc limit 1").append(InfluxDBPublicParam.TIME_ZONE);
List<Map<String, Object>> resMap = influxDbUtils.getMapResult(sql.toString());
if(CollUtil.isNotEmpty(resMap)) {
List<ReportTemplateDTO> temValue = statValue.stream().map(item -> {
String value = resMap.get(0).get(item.getTemplateName()).toString();
item.setValue(value);
return item;
}).collect(Collectors.toList());
endList.addAll(temValue);
}
}else if(statKey.equals("cp95")){
for(int i = 0;i<statValue.size();i++){
if(i==statValue.size()-1){
sql.append("PERCENTILE("+statValue.get(i).getTemplateName()+",95) as ").append(statValue.get(i).getTemplateName());
}else {
sql.append("PERCENTILE("+statValue.get(i).getTemplateName()+",95) as ").append(statValue.get(i).getTemplateName()).append(",");
}
}
sql.append(" from ").append(key).append(" where Phase = '").append(phKey).append("' and LineId='00B78D123456$DEV$NPQS588$0002$NPQS588$01'").append(" and Stat_Method='").append(statKey+"'").append(" order by time desc limit 1").append(InfluxDBPublicParam.TIME_ZONE);
List<Map<String, Object>> resMap = influxDbUtils.getMapResult(sql.toString());
if(CollUtil.isNotEmpty(resMap)) {
List<ReportTemplateDTO> temValue = statValue.stream().map(item -> {
String value = resMap.get(0).get(item.getTemplateName()).toString();
item.setValue(value);
return item;
}).collect(Collectors.toList());
endList.addAll(temValue);
}
}
});
}
});
});
//进行反向赋值到模板
Map<String, List<ReportTemplateDTO>> assMap = endList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getItemName));
jsonArray.forEach(item->{
JSONObject jsonObject = (JSONObject)item;
JSONArray itemArr = (JSONArray) jsonObject.get("data");
itemArr.forEach((ite)->{
JSONArray j = (JSONArray)ite;
j.forEach(it->{
if (Objects.nonNull(it) && !"null".equals(it.toString())) {
JSONObject son = (JSONObject) it; //获取到1列
if (son.containsKey("v")) {
String v = son.getStr("v");
System.out.println(v);
if (v.charAt(0) == '$' && v.contains("#")) {
String str = assMap.get(v.replace("$","")).get(0).getValue();
son.set("v",str);
son.set("m",str);
}
}
}
});
});
});
return jsonArray;
}
@Override
public List<ReportTreeVO> reportChooseTree() {
long a = System.currentTimeMillis();
LambdaQueryWrapper<EleEpdPqd> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.orderByAsc(EleEpdPqd::getSort);
List<EleEpdPqd> list = eleEpdMapper.selectList(lambdaQueryWrapper);
Map<String, List<EleEpdPqd>> map = list.stream().collect(Collectors.groupingBy(EleEpdPqd::getName));
List<ReportTreeVO> tree = new ArrayList<>();
map.forEach((key, value) -> {
ReportTreeVO reportTreeVO = new ReportTreeVO();
reportTreeVO.setName(key);
reportTreeVO.setShowName(value.get(0).getShowName());
//存在1-50次 2-50次情况
if (Objects.nonNull(value.get(0).getHarmStart()) && Objects.nonNull(value.get(0).getHarmEnd())) {
List<ReportTreeVO> reHarm = new ArrayList<>();
for (int i = value.get(0).getHarmStart(); i < value.get(0).getHarmEnd(); i++) {
ReportTreeVO reportTreeCount = new ReportTreeVO();
reportTreeCount.setName(value.get(0).getName() + "_" + i);
reportTreeCount.setShowName(i + "" + value.get(0).getShowName());
reportTreeVO.setFlag(1);
assPhase(value, reportTreeCount);
reHarm.add(reportTreeCount);
}
reportTreeVO.setChildren(reHarm);
} else {
assPhase(value, reportTreeVO);
}
tree.add(reportTreeVO);
});
long b = System.currentTimeMillis();
System.out.println(b - a);
return tree;
}
/*组装相别*/
private void assPhase(List<EleEpdPqd> value, ReportTreeVO reportTreeItem) {
if (Objects.nonNull(value.get(0).getPhase()) && !"M".equals(value.get(0).getPhase())) {
List<ReportTreeVO> phaseTree = new ArrayList<>();
value.forEach(item -> {
List<ReportTreeVO> statTree = new ArrayList<>();
ReportTreeVO reportTreePhase = new ReportTreeVO();
reportTreePhase.setName(item.getPhase());
reportTreePhase.setShowName(item.getPhase());
assStatMethod(item, statTree);
reportTreePhase.setChildren(statTree);
phaseTree.add(reportTreePhase);
});
reportTreeItem.setChildren(phaseTree);
} else {
List<ReportTreeVO> statTree = new ArrayList<>();
assStatMethod(value.get(0), statTree);
reportTreeItem.setChildren(statTree);
}
}
private void assStatMethod(EleEpdPqd item, List<ReportTreeVO> statTree) {
//存在向别为M但是Stat_Method不为空
if (StrUtil.isNotBlank(item.getStatMethod())) {
String[] arr = item.getStatMethod().split(",");
List<String> stat = Stream.of(arr).collect(Collectors.toList());
if (CollUtil.isNotEmpty(stat)) {
stat.forEach(statItem -> {
ReportTreeVO reportTreeStat = new ReportTreeVO();
reportTreeStat.setName(statItem);
reportTreeStat.setShowName(statItem);
statTree.add(reportTreeStat);
});
}
}
}
private void checkName(ReportTemplateParam reportTemplateParam, boolean isUpdate) {
LambdaQueryWrapper<ReportTemplate> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ReportTemplate::getState, DataStateEnum.ENABLE.getCode()).eq(ReportTemplate::getName, reportTemplateParam.getName());
if (isUpdate) {
if (reportTemplateParam instanceof ReportTemplateParam.UpdateReportTemplateParam) {
lambdaQueryWrapper.ne(ReportTemplate::getId, ((ReportTemplateParam.UpdateReportTemplateParam) reportTemplateParam).getId());
}
}
int count = customReportMapper.selectCount(lambdaQueryWrapper);
if (count > 0) {
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_REPEAT);
}
if(StrUtil.isNotBlank(reportTemplateParam.getDeptId())){
Dept dept = deptFeignClient.getDeptById(reportTemplateParam.getDeptId()).getData();
if(Objects.isNull(dept)){
throw new BusinessException(CommonResponseEnum.FAIL);
}
lambdaQueryWrapper.clear();
lambdaQueryWrapper.eq(ReportTemplate::getDeptId,reportTemplateParam.getDeptId())
.eq(ReportTemplate::getState,DataStateEnum.ENABLE.getCode());
if (isUpdate) {
if (reportTemplateParam instanceof ReportTemplateParam.UpdateReportTemplateParam) {
lambdaQueryWrapper.ne(ReportTemplate::getId, ((ReportTemplateParam.UpdateReportTemplateParam) reportTemplateParam).getId());
}
}
int countDept = customReportMapper.selectCount(lambdaQueryWrapper);
if(countDept>0){
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_DEPT);
}
}
DictData dictData = dicDataFeignClient.getDicDataById(reportTemplateParam.getReportType()).getData();
if(Objects.isNull(dictData)){
throw new BusinessException(HarmonicResponseEnum.CUSTOM_TYPE);
}
}
}