目标监测:导出功能以及对应的预览

This commit is contained in:
huangge1199 2025-08-12 17:13:14 +08:00
parent 86913a00c8
commit 8d33aa536c
5 changed files with 204 additions and 5 deletions

View File

@ -2,6 +2,7 @@ package iet.ustb.sf.controller;
import com.alibaba.fastjson.JSONObject;
import iet.ustb.sf.common.R;
import iet.ustb.sf.domain.Monitor;
import iet.ustb.sf.service.TargetDataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
@ -33,4 +35,18 @@ public class TargetDataController {
return R.ok(targetDataService.getData(params, 1));
}
@Operation(summary = "指标监控列表")
@PostMapping("/getTargetMonitor")
public R<List<Monitor>> getTargetMonitor(@RequestBody JSONObject params) {
List<Monitor> monitorList = targetDataService.getTargetMonitor(params);
return R.ok(monitorList);
}
@Operation(summary = "导出预览")
@PostMapping("/exportPreview")
public R<Map<String, Object>> exportPreview(@RequestBody JSONObject params) {
Map<String, Object> result = targetDataService.exportPreview(params);
return R.ok(result);
}
}

View File

@ -2,15 +2,19 @@ package iet.ustb.sf.mapper;
import iet.ustb.sf.domain.Monitor;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author hyy
* @description 针对表mbgk_monitor的数据库操作Mapper
* @createDate 2025-08-05 15:36:01
* @Entity iet.ustb.sf.domain.Monitor
*/
* @author hyy
* @description 针对表mbgk_monitor的数据库操作Mapper
* @createDate 2025-08-05 15:36:01
* @Entity iet.ustb.sf.domain.Monitor
*/
public interface MonitorMapper extends BaseMapper<Monitor> {
List<Monitor> getMbgkTargetMonitorsByTargetId(@Param("ids") List<String> ids);
}

View File

@ -1,11 +1,13 @@
package iet.ustb.sf.service;
import com.alibaba.fastjson.JSONObject;
import iet.ustb.sf.domain.Monitor;
import iet.ustb.sf.domain.Target;
import iet.ustb.sf.domain.TargetData;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@ -28,4 +30,8 @@ public interface TargetDataService extends IService<TargetData> {
void saveTargetDate(Date date);
Map<String, Object> getData(JSONObject params, int type);
List<Monitor> getTargetMonitor(JSONObject params);
Map<String, Object> exportPreview(JSONObject params);
}

View File

@ -1,12 +1,15 @@
package iet.ustb.sf.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import iet.ustb.sf.domain.*;
import iet.ustb.sf.exception.ErrorCode;
import iet.ustb.sf.exception.MyException;
import iet.ustb.sf.exception.ThrowUtils;
import iet.ustb.sf.mapper.*;
import iet.ustb.sf.service.TargetDataService;
import iet.ustb.sf.service.UtilService;
@ -18,6 +21,7 @@ import org.springframework.stereotype.Service;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
@ -26,6 +30,7 @@ import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author hyy
@ -54,6 +59,9 @@ public class TargetDataServiceImpl extends ServiceImpl<TargetDataMapper, TargetD
@Resource
private JobLogMapper jobLogMapper;
@Resource
private TableColumnMapper tableColumnMapper;
@Override
@Scheduled(cron = "0 45 6 * * ?")
public void saveTargetDate(Date date) {
@ -215,6 +223,154 @@ public class TargetDataServiceImpl extends ServiceImpl<TargetDataMapper, TargetD
return map;
}
@Override
public List<Monitor> getTargetMonitor(JSONObject params) {
Target target = JSON.toJavaObject(params, Target.class);
String topic = target.getTopic();
String organization = target.getOrganization();
ThrowUtils.throwIf(
StringUtils.isEmpty(topic) && StringUtils.isEmpty(organization),
ErrorCode.PARAMS_ERROR,
"主题和组织至少传入一个参数!"
);
String categoryId = target.getCategoryId();
ThrowUtils.throwIf(
!StringUtils.isEmpty(categoryId) && StringUtils.isEmpty(topic),
ErrorCode.PARAMS_ERROR,
"传入分类ID时主题必须传入"
);
QueryWrapper<Target> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_key", 1);
if (!StringUtils.isEmpty(topic)) {
queryWrapper.eq("topic", topic);
}
if (!StringUtils.isEmpty(organization)) {
queryWrapper.like("organization", "%" + organization + "%");
}
if (!StringUtils.isEmpty(categoryId)) {
queryWrapper.eq("category_id", categoryId);
}
if (!StringUtils.isEmpty(target.getName())) {
queryWrapper.like("name", "%" + target.getName() + "%");
}
List<Target> targetList = targetMapper.selectList(queryWrapper);
List<String> ids = new ArrayList<>();
if (!StringUtils.isEmpty(target.getId())) {
for (Target targetItem : targetList) {
if (targetItem.getId().equals(target.getId()) ||
(!StringUtils.isEmpty(targetItem.getParent()) && targetItem.getParent().equals(target.getId()))
) {
ids.add(targetItem.getId());
}
}
} else {
ids = targetList.stream().map(Target::getId).collect(Collectors.toList());
}
if (ids.isEmpty()) {
return Collections.emptyList();
}
List<Monitor> monitorList = monitorMapper.getMbgkTargetMonitorsByTargetId(ids);
if (ids.size() == monitorList.size()) {
return monitorList;
}
List<String> addIds = new ArrayList<>(ids);
for (Monitor monitor : monitorList) {
addIds.remove(monitor.getTargetId());
}
Map<String, Target> targetMap = targetList.stream()
.collect(Collectors.toMap(Target::getId, vo -> vo));
Map<String, String[]> map = utilService.getCurrentCycleData(new Date());
for (String id : addIds) {
Target target1 = targetMap.get(id);
String[] strArr = map.get(target1.getCycle());
QueryWrapper<TargetData> qw = new QueryWrapper<>();
qw.eq("target_id", id);
qw.eq("x_show", strArr[0]);
TargetData targetData = targetDataMapper.selectOne(qw);
saveMonitor(targetData);
}
return monitorMapper.getMbgkTargetMonitorsByTargetId(ids);
}
@Override
public Map<String, Object> exportPreview(JSONObject params) {
String targetId = params.getString("targetId");
CheckUtils.checkEmpty(targetId, "指标ID");
Target target = targetMapper.selectById(targetId);
ThrowUtils.throwIf(target == null, ErrorCode.PARAMS_ERROR, "指标不存在!");
ThrowUtils.throwIf(target.getType() == 2, ErrorCode.OPERATION_ERROR, "聚合指标无法导出数据!");
String type = params.getString("type");
CheckUtils.checkEmpty(type, "类型");
ThrowUtils.throwIf(
!"total".equals(type) && !"page".equals(type),
ErrorCode.PARAMS_ERROR,
"类型传参异常!"
);
String start = params.getString("start");
String end = params.getString("end");
String[] strArr = utilService.getCurrentCycleDataByCycle(new Date(), target.getCycle());
try {
if (!StringUtils.isEmpty(start)) {
LocalDate.parse(start);
} else {
start = strArr[3];
}
} catch (DateTimeParseException e) {
throw new MyException(ErrorCode.PARAMS_ERROR, "开始日期格式不对!");
}
try {
if (!StringUtils.isEmpty(end)) {
end = LocalDate.parse(end).plusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
} else {
end = strArr[4];
}
} catch (DateTimeParseException e) {
throw new MyException(ErrorCode.PARAMS_ERROR, "结束日期格式不对!");
}
String searchSql = target.getSearchSql();
String[] columnNames = searchSql.substring(7, searchSql.indexOf("FROM") - 1).split(",");
QueryWrapper<TableColumn> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("table_name", target.getTableName());
queryWrapper.in("column_name", Arrays.asList(columnNames));
List<TableColumn> columnList = tableColumnMapper.selectList(queryWrapper);
List<Map<String, String>> columns = columnList.stream()
.map(col -> {
Map<String, String> map = new HashMap<>();
map.put("prop", col.getColumnName());
map.put("label", col.getColumnNameCn());
return map;
})
.collect(Collectors.toList());
Map<String, Object> map = new HashMap<>(5);
map.put("columns", columns);
if ("page".equals(type)) {
String countSql = "SELECT COUNT(1) " + searchSql.substring(searchSql.indexOf("FROM"));
long total = SqlRunner.db().selectCount(countSql, start, end);
int pageIndex = Optional.ofNullable(params.getInteger("pageIndex")).orElse(1);
int pageSize = Optional.ofNullable(params.getInteger("pageSize")).orElse(10);
Page<Map<String, Object>> page = new Page<>(pageIndex, pageSize);
page.setTotal(total);
long offset = (long) (pageIndex - 1) * pageSize;
String sql = searchSql + " LIMIT " + pageSize + " OFFSET " + offset;
Page<Map<String, Object>> data = SqlRunner.db().selectPage(page, sql, start, end);
map.put("data", data);
map.put("cnt", data.getRecords().size());
} else {
List<Map<String, Object>> data = SqlRunner.db().selectList(searchSql, start, end);
map.put("data", data);
map.put("cnt", data.size());
}
map.put("start", start.substring(0, 10));
map.put("end", end.substring(0, 10));
return map;
}
/**
* 获取列表中位数
*

View File

@ -31,4 +31,21 @@
val,warn_level,set_date,x_show,create_time,
update_time,warn_type
</sql>
<select id="getMbgkTargetMonitorsByTargetId" resultType="iet.ustb.sf.domain.Monitor">
SELECT *
FROM (
SELECT
m.*,
ROW_NUMBER() OVER (
PARTITION BY m.TARGET_ID
ORDER BY m.X_SHOW DESC, m.WARN_LEVEL ASC
) AS rn
FROM mbgk_monitor m
WHERE m.TARGET_ID IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
) subquery
WHERE rn = 1
</select>
</mapper>