|
@@ -2,6 +2,7 @@ package com.qmth.ops.biz.service;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qmth.boot.core.exception.ParameterException;
|
|
|
import com.qmth.boot.core.exception.StatusException;
|
|
|
import com.qmth.ops.biz.dao.ConfigItemDao;
|
|
@@ -14,18 +15,21 @@ import javax.annotation.Resource;
|
|
|
import javax.validation.constraints.NotNull;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
-import java.util.Comparator;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
-public class ConfigService {
|
|
|
+public class ConfigService extends ServiceImpl<ConfigItemDao, ConfigItem> {
|
|
|
|
|
|
private static final long BASELINE_ENV_ID = 0L;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private EnvService envService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ConfigGroupService configGroupService;
|
|
|
+
|
|
|
@Resource
|
|
|
private ConfigItemDao configItemDao;
|
|
|
|
|
@@ -54,7 +58,7 @@ public class ConfigService {
|
|
|
configItemDao.delete(new LambdaUpdateWrapper<ConfigItem>().eq(ConfigItem::getAppId, app.getId())
|
|
|
.eq(ConfigItem::getVersionId, version.getId()).eq(ConfigItem::getModuleId, module.getId())
|
|
|
.eq(ConfigItem::getEnvId, BASELINE_ENV_ID));
|
|
|
- Map<String, ConfigItem> baseMap = new HashMap<>();
|
|
|
+ final Map<String, ConfigItem> baseMap = new HashMap<>();
|
|
|
if (inheritVersion != null) {
|
|
|
listBaseline(app.getId(), inheritVersion.getId(), module.getId())
|
|
|
.forEach(item -> baseMap.put(item.getKey(), item));
|
|
@@ -72,9 +76,68 @@ public class ConfigService {
|
|
|
item.setMode(base.getMode());
|
|
|
item.setComment(base.getComment());
|
|
|
}
|
|
|
- configItemDao.insert(item);
|
|
|
}
|
|
|
- return listBaseline(app.getId(), version.getId(), module.getId());
|
|
|
+ saveBatch(list);
|
|
|
+ List<ConfigItem> baseline = listBaseline(app.getId(), version.getId(), module.getId());
|
|
|
+ baseMap.clear();
|
|
|
+ baseline.forEach(item -> baseMap.put(item.getKey(), item));
|
|
|
+ List<Env> envList = envService.list(app.getId());
|
|
|
+ for (Env env : envList) {
|
|
|
+ resetEnvConfig(app, version, module, env, inheritVersion, baseMap);
|
|
|
+ }
|
|
|
+ return baseline;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定版本和最新基线,继承环境自定义配置
|
|
|
+ *
|
|
|
+ * @param app
|
|
|
+ * @param version
|
|
|
+ * @param module
|
|
|
+ * @param env
|
|
|
+ * @param inheritVersion
|
|
|
+ * @param baseMap
|
|
|
+ */
|
|
|
+ private void resetEnvConfig(App app, Version version, Module module, Env env, Version inheritVersion,
|
|
|
+ Map<String, ConfigItem> baseMap) {
|
|
|
+ configItemDao.delete(new LambdaUpdateWrapper<ConfigItem>().eq(ConfigItem::getAppId, app.getId())
|
|
|
+ .eq(ConfigItem::getVersionId, version.getId()).eq(ConfigItem::getModuleId, module.getId())
|
|
|
+ .eq(ConfigItem::getEnvId, env.getId()));
|
|
|
+ if (inheritVersion != null) {
|
|
|
+ long time = System.currentTimeMillis();
|
|
|
+ List<ConfigItem> inheritList = listConfigItem(app.getId(), inheritVersion.getId(), module.getId(),
|
|
|
+ env.getId());
|
|
|
+ List<ConfigItem> saveList = new LinkedList<>();
|
|
|
+ for (ConfigItem item : inheritList) {
|
|
|
+ if (accept(item, baseMap)) {
|
|
|
+ item.setVersionId(version.getId());
|
|
|
+ item.setCreateTime(time);
|
|
|
+ item.setUpdateTime(time);
|
|
|
+ saveList.add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ saveBatch(saveList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 继承版本的环境自定义配置,是否可以在当前版本保留
|
|
|
+ *
|
|
|
+ * @param item
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean accept(ConfigItem item, Map<String, ConfigItem> baseMap) {
|
|
|
+ //当前基线包含且非只读,可以保留
|
|
|
+ ConfigItem base = baseMap.get(item.getKey());
|
|
|
+ if (base != null && base.getMode() != ConfigMode.READONLY) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //配置分组判断是否保留
|
|
|
+ if (configGroupService.accept(item.getKey(), item.getValue())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //应用自定义且不在基线内,不能保留
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
@Transactional
|