指标库:保存衍生指标

This commit is contained in:
huangge1199 2025-08-08 16:47:23 +08:00
parent 112c70fa4e
commit 948e66a369
4 changed files with 114 additions and 6 deletions

View File

@ -100,4 +100,11 @@ public class TargetController {
result.put("columnList", tableColumnService.getColumnsByTableName(result.getString("tableName")));
return R.ok(result);
}
@Operation(summary = "保存衍生指标")
@PostMapping("/saveExpandTarget")
public R<?> saveExpandTarget(@RequestBody JSONObject params) {
targetService.saveExpandTarget(params);
return R.ok();
}
}

View File

@ -30,4 +30,6 @@ public interface TargetService extends IService<Target> {
void deleteTargetById(JSONObject params);
JSONObject getDetailExpandTarget(JSONObject params);
void saveExpandTarget(JSONObject params);
}

View File

@ -170,11 +170,17 @@ public class TargetServiceImpl extends ServiceImpl<TargetMapper, Target>
categoryDeal(null, target);
}
targetMapper.insert(target);
saveData(target);
} else {
categoryDealByUpdate(target);
saveChildSql(target);
Target oldTarget = targetMapper.selectById(target.getId());
if (!oldTarget.getName().equals(target.getName())) {
List<Monitor> monitorList = monitorMapper.selectList(new QueryWrapper<Monitor>().eq("target_id", target.getId()));
for (Monitor monitor : monitorList) {
monitor.setName(target.getName());
}
monitorMapper.updateById(monitorList);
}
if (!cycle.equals(oldTarget.getCycle())) {
ThrowUtils.throwIf(
hasTogeth(target.getId()),
@ -210,6 +216,7 @@ public class TargetServiceImpl extends ServiceImpl<TargetMapper, Target>
}
targetMapper.insertOrUpdate(target);
}
saveData(target);
showList = optionsMap.values().stream().flatMap(List::stream).collect(Collectors.toList());
@ -454,6 +461,86 @@ public class TargetServiceImpl extends ServiceImpl<TargetMapper, Target>
return getDetailTarget(optionList, target);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void saveExpandTarget(JSONObject params) {
Target target = params.getObject("target", Target.class);
CheckUtils.checkEmpty(target.getParent(), "父指标ID");
CheckUtils.checkEmpty(target.getName(), "指标名称");
CheckUtils.checkTargetNameExist(targetMapper, target);
CheckUtils.checkEmpty(target.getOrganization(), "组织");
TargetOption expandOption = params.getObject("option", TargetOption.class);
CheckUtils.checkSingleOption(expandOption);
List<Target> childList = targetMapper.selectList(new QueryWrapper<Target>().eq("parent", target.getParent()));
if (!childList.isEmpty()) {
List<String> ids = childList.stream().map(Target::getId).collect(Collectors.toList());
QueryWrapper<TargetOption> query = new QueryWrapper<>();
query.eq("column_name", expandOption.getColumnName());
query.in("target_id", ids);
long cnt = targetOptionMapper.selectCount(query);
ThrowUtils.throwIf(cnt >= 0, ErrorCode.OPERATION_ERROR, "该原子指标已经衍生过该字段!");
}
ThrowUtils.throwIf(
expandOption.getType() != 2 && expandOption.getType() != 3,
ErrorCode.OPERATION_ERROR,
"衍生指标筛选只能是文本或数值!"
);
Target parentTarget = targetMapper.selectById(target.getParent());
String searchSql = parentTarget.getSearchSql();
if (!searchSql.contains(expandOption.getColumnName())) {
searchSql = searchSql.substring(0, searchSql.indexOf("FROM") - 1) + "," + expandOption.getColumnName()
+ " " + searchSql.substring(searchSql.indexOf("FROM"));
}
Date now = new Date();
String[] vals = expandOption.getVal().split(",");
List<Target> targetList = new ArrayList<>();
List<TargetOption> optionList = new ArrayList<>();
for (String val : vals) {
expandOption.setVal(val);
Target targetTmp = Target.builder()
.id(UUID.randomUUID().toString())
.name(target.getName() + "-" + val)
.categoryId(parentTarget.getCategoryId())
.unit(target.getUnit())
.type(1)
.isKey(target.getIsKey())
.targetInfo(target.getTargetInfo())
.resultSql(getExpandSql(expandOption, parentTarget.getResultSql()))
.level(parentTarget.getLevel() + 1)
.parent(parentTarget.getId())
.tableName(parentTarget.getTableName())
.cycle(parentTarget.getCycle())
.searchSql(getExpandSql(expandOption, searchSql))
.createTime(now)
.updateTime(now)
.organization(target.getOrganization())
.topic(parentTarget.getTopic())
.build();
targetList.add(targetTmp);
TargetOption optionTmp = TargetOption.builder()
.id(UUID.randomUUID().toString())
.targetId(targetTmp.getId())
.columnName(expandOption.getColumnName())
.type(expandOption.getType())
.op("0,1,2")
.val(val)
.createTime(now)
.updateTime(now)
.build();
optionList.add(optionTmp);
}
categoryDeal(null, target);
targetMapper.insert(targetList);
targetOptionMapper.insert(optionList);
for (Target mbgkTarget : targetList) {
saveData(mbgkTarget);
}
}
/**
* 查看指标详情
*
@ -605,11 +692,7 @@ public class TargetServiceImpl extends ServiceImpl<TargetMapper, Target>
*/
private void checkTarget(Target target) {
CheckUtils.checkEmpty(target.getName(), "指标名称");
QueryWrapper<Target> query = new QueryWrapper<>();
query.eq("name", target.getName());
Target nameCheck = targetMapper.selectOne(query);
boolean bl = nameCheck != null && (target.getId() == null || !nameCheck.getId().equals(target.getId()));
ThrowUtils.throwIf(bl, ErrorCode.PARAMS_ERROR, "指标名称不能重复!");
CheckUtils.checkTargetNameExist(targetMapper, target);
CheckUtils.checkEmpty(String.valueOf(target.getType()), "类型");
CheckUtils.checkEmpty(String.valueOf(target.getIsKey()), "是否启用");
CheckUtils.checkEmpty(target.getOrganization(), "组织");

View File

@ -1,10 +1,13 @@
package iet.ustb.sf.util;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import iet.ustb.sf.domain.Target;
import iet.ustb.sf.domain.TargetOption;
import iet.ustb.sf.exception.ErrorCode;
import iet.ustb.sf.exception.MyException;
import iet.ustb.sf.exception.ThrowUtils;
import iet.ustb.sf.mapper.TargetMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@ -166,4 +169,17 @@ public class CheckUtils {
bd = bd.setScale(round, RoundingMode.HALF_UP);
return bd.doubleValue();
}
/**
* 验证指标名称是否重复
* @param targetMapper mapper类
* @param target 指标
*/
public static void checkTargetNameExist(TargetMapper targetMapper, Target target) {
QueryWrapper<Target> query = new QueryWrapper<>();
query.eq("name", target.getName());
Target nameCheck = targetMapper.selectOne(query);
boolean bl = nameCheck != null && (target.getId() == null || !nameCheck.getId().equals(target.getId()));
ThrowUtils.throwIf(bl, ErrorCode.PARAMS_ERROR, "指标名称不能重复!");
}
}