diff --git a/src/main/java/neatlogic/module/deploy/api/appconfig/env/FallbackDeployAppConfigEnvAutoConfigApi.java b/src/main/java/neatlogic/module/deploy/api/appconfig/env/FallbackDeployAppConfigEnvAutoConfigApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b38339cf95e71bc7228e7e38e567aa0b47d02bc
--- /dev/null
+++ b/src/main/java/neatlogic/module/deploy/api/appconfig/env/FallbackDeployAppConfigEnvAutoConfigApi.java
@@ -0,0 +1,181 @@
+/*Copyright (C) 2023 深圳极向量科技有限公司 All Rights Reserved.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .*/
+
+package neatlogic.module.deploy.api.appconfig.env;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import neatlogic.framework.asynchronization.threadlocal.UserContext;
+import neatlogic.framework.auth.core.AuthAction;
+import neatlogic.framework.common.constvalue.ApiParamType;
+import neatlogic.framework.deploy.auth.DEPLOY_BASE;
+import neatlogic.framework.deploy.constvalue.DeployAppConfigAction;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigAuditVo;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigKeyValueVo;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigVo;
+import neatlogic.framework.restful.annotation.*;
+import neatlogic.framework.restful.constvalue.OperationTypeEnum;
+import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase;
+import neatlogic.framework.util.TableResultUtil;
+import neatlogic.module.deploy.dao.mapper.DeployAppConfigMapper;
+import neatlogic.module.deploy.service.DeployAppAuthorityService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional
+@AuthAction(action = DEPLOY_BASE.class)
+@OperationType(type = OperationTypeEnum.OPERATE)
+public class FallbackDeployAppConfigEnvAutoConfigApi extends PrivateApiComponentBase {
+
+ @Resource
+ private DeployAppConfigMapper deployAppConfigMapper;
+
+ @Resource
+ DeployAppAuthorityService deployAppAuthorityService;
+
+ @Override
+ public String getToken() {
+ return "deploy/app/config/env/auto/config/fallback";
+ }
+
+ @Override
+ public String getName() {
+ return "回滚应用环境实例autoConfig";
+ }
+
+ @Override
+ public String getConfig() {
+ return null;
+ }
+
+ @Input({
+ @Param(name = "appSystemId", type = ApiParamType.LONG, isRequired = true, desc = "应用 id"),
+ @Param(name = "appModuleId", type = ApiParamType.LONG, isRequired = true, desc = "模块 id"),
+ @Param(name = "envId", type = ApiParamType.LONG, isRequired = true, desc = "环境 id"),
+ @Param(name = "instanceId", type = ApiParamType.LONG, desc = "应用实例 id"),
+ @Param(name = "uuidList", type = ApiParamType.JSONARRAY, isRequired = true, minSize = 1, desc = "变量名列表"),
+ })
+ @Output({
+ })
+ @Description(desc = "回滚应用环境实例autoConfig")
+ @Override
+ public Object myDoService(JSONObject paramObj) {
+ Long appSystemId = paramObj.getLong("appSystemId");
+ Long appModuleId = paramObj.getLong("appModuleId");
+ Long envId = paramObj.getLong("envId");
+ Long instanceId = paramObj.getLong("instanceId");
+ if (instanceId == null) {
+ instanceId = 0L;
+ }
+ //校验环境权限、编辑配置的操作权限
+ deployAppAuthorityService.checkEnvAuth(appSystemId, paramObj.getLong("envId"));
+ deployAppAuthorityService.checkOperationAuth(appSystemId, DeployAppConfigAction.EDIT);
+ List idList = new ArrayList<>();
+ Map> id2KeyListMap = new HashMap<>();
+ JSONArray uuidList = paramObj.getJSONArray("uuidList");
+ for (int i = 0; i < uuidList.size(); i++) {
+ String uuid = uuidList.getString(i);
+ String[] split = uuid.split("_");
+ Long id = Long.parseLong(split[0]);
+ idList.add(id);
+ id2KeyListMap.computeIfAbsent(id, key -> new ArrayList<>()).add(split[1]);
+ }
+ if (CollectionUtils.isNotEmpty(idList)) {
+ JSONArray jsonArray = new JSONArray();
+ Map oldKeyValueMap = new HashMap<>();
+ DeployAppEnvAutoConfigVo appEnvAutoConfigVo = new DeployAppEnvAutoConfigVo(appSystemId, appModuleId, envId, instanceId);
+ List oldKeyValueList = deployAppConfigMapper.getAppEnvAutoConfigKeyValueList(appEnvAutoConfigVo);
+ if (CollectionUtils.isNotEmpty(oldKeyValueList)) {
+ oldKeyValueMap = oldKeyValueList.stream().filter(Objects::nonNull).collect(Collectors.toMap(DeployAppEnvAutoConfigKeyValueVo::getKey, e -> e));
+ }
+ List auditList = deployAppConfigMapper.getAppEnvAutoConfigAuditListByIdList(idList);
+ for (DeployAppEnvAutoConfigAuditVo auditVo : auditList) {
+ List keyList = id2KeyListMap.get(auditVo.getId());
+ if (CollectionUtils.isNotEmpty(keyList)) {
+ JSONObject config = auditVo.getConfig();
+ if (MapUtils.isNotEmpty(config)) {
+ JSONArray tbodyList = config.getJSONArray("tbodyList");
+ if (CollectionUtils.isNotEmpty(tbodyList)) {
+ for (int i = 0; i < tbodyList.size(); i++) {
+ JSONObject tbody = tbodyList.getJSONObject(i);
+ String key = tbody.getString("key");
+ if (keyList.contains(key)) {
+ Integer isEmpty = tbody.getInteger("beforeIsEmpty");
+ String type = tbody.getString("beforeType");
+ String value = tbody.getString("beforeValue");
+ String action = tbody.getString("action");
+ if (Objects.equals(action, "insert")) {
+ DeployAppEnvAutoConfigKeyValueVo keyValueVo = oldKeyValueMap.get(key);
+ if (keyValueVo != null) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("key", key);
+ jsonObj.put("beforeType", keyValueVo.getType());
+ jsonObj.put("beforeValue", keyValueVo.getValue());
+ jsonObj.put("beforeIsEmpty", keyValueVo.getIsEmpty());
+ jsonObj.put("action", "delete");
+ jsonArray.add(jsonObj);
+ deployAppConfigMapper.deleteAppEnvAutoConfigByKey(appSystemId, appModuleId, envId, instanceId, key);
+ }
+ } else if (Objects.equals(action, "delete") || Objects.equals(action, "update")) {
+ DeployAppEnvAutoConfigKeyValueVo keyValueVo = oldKeyValueMap.get(key);
+ if (keyValueVo != null) {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("key", key);
+ jsonObj.put("beforeType", keyValueVo.getType());
+ jsonObj.put("beforeValue", keyValueVo.getValue());
+ jsonObj.put("beforeIsEmpty", keyValueVo.getIsEmpty());
+ jsonObj.put("afterType", type);
+ jsonObj.put("afterValue", value);
+ jsonObj.put("afterIsEmpty", isEmpty);
+ jsonObj.put("action", "update");
+ jsonArray.add(jsonObj);
+ } else {
+ JSONObject jsonObj = new JSONObject();
+ jsonObj.put("key", key);
+ jsonObj.put("afterType", type);
+ jsonObj.put("afterValue", value);
+ jsonObj.put("afterIsEmpty", isEmpty);
+ jsonObj.put("action", "insert");
+ jsonArray.add(jsonObj);
+ }
+ String lcu = UserContext.get().getUserUuid();
+ deployAppConfigMapper.insertAppEnvAutoConfigByKey(appSystemId, appModuleId, envId, instanceId, key, type, value, isEmpty, lcu);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (CollectionUtils.isNotEmpty(jsonArray)) {
+ DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo = new DeployAppEnvAutoConfigAuditVo();
+ deployAppEnvAutoConfigAuditVo.setAppSystemId(appSystemId);
+ deployAppEnvAutoConfigAuditVo.setAppModuleId(appModuleId);
+ deployAppEnvAutoConfigAuditVo.setEnvId(envId);
+ deployAppEnvAutoConfigAuditVo.setInstanceId(instanceId);
+ deployAppEnvAutoConfigAuditVo.setConfig(TableResultUtil.getResult(jsonArray));
+ deployAppConfigMapper.insertAppEnvAutoConfigAudit(deployAppEnvAutoConfigAuditVo);
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/neatlogic/module/deploy/api/appconfig/env/ListDeployAppConfigEnvAutoConfigAuditApi.java b/src/main/java/neatlogic/module/deploy/api/appconfig/env/ListDeployAppConfigEnvAutoConfigAuditApi.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebbfd2ea1dfd2f4ebc8707c9c14dd10e24b64406
--- /dev/null
+++ b/src/main/java/neatlogic/module/deploy/api/appconfig/env/ListDeployAppConfigEnvAutoConfigAuditApi.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package neatlogic.module.deploy.api.appconfig.env;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import neatlogic.framework.auth.core.AuthAction;
+import neatlogic.framework.autoexec.constvalue.ParamType;
+import neatlogic.framework.common.constvalue.ApiParamType;
+import neatlogic.framework.dao.mapper.UserMapper;
+import neatlogic.framework.deploy.auth.DEPLOY_BASE;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigAuditVo;
+import neatlogic.framework.dto.UserVo;
+import neatlogic.framework.restful.annotation.*;
+import neatlogic.framework.restful.constvalue.OperationTypeEnum;
+import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase;
+import neatlogic.framework.util.TableResultUtil;
+import neatlogic.module.deploy.dao.mapper.DeployAppConfigMapper;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AuthAction(action = DEPLOY_BASE.class)
+@OperationType(type = OperationTypeEnum.OPERATE)
+public class ListDeployAppConfigEnvAutoConfigAuditApi extends PrivateApiComponentBase {
+
+ @Resource
+ private DeployAppConfigMapper deployAppConfigMapper;
+
+ @Resource
+ private UserMapper userMapper;
+
+ @Override
+ public String getName() {
+ return "查询应用环境实例autoConfig审计列表";
+ }
+ @Input({
+ @Param(name = "appSystemId", type = ApiParamType.LONG, isRequired = true, desc = "应用 id"),
+ @Param(name = "appModuleId", type = ApiParamType.LONG, isRequired = true, desc = "模块 id"),
+ @Param(name = "envId", type = ApiParamType.LONG, isRequired = true, desc = "环境 id"),
+ @Param(name = "instanceId", type = ApiParamType.LONG, desc = "应用实例 id"),
+ @Param(name = "currentPage", type = ApiParamType.INTEGER, defaultValue = "1", desc = "common.currentpage"),
+ @Param(name = "pageSize", type = ApiParamType.INTEGER, defaultValue = "10", desc = "common.pagesize"),
+ })
+ @Output({
+ })
+ @Description(desc = "查询应用环境实例autoConfig审计列表")
+ @Override
+ public Object myDoService(JSONObject paramObj) throws Exception {
+ JSONObject resultObj = new JSONObject();
+ JSONArray tableList = new JSONArray();
+ Long appSystemId = paramObj.getLong("appSystemId");
+ Long appModuleId = paramObj.getLong("appModuleId");
+ Long envId = paramObj.getLong("envId");
+ Long instanceId = paramObj.getLong("instanceId");
+ if (instanceId == null) {
+ instanceId = 0L;
+ }
+ Integer currentPage = paramObj.getInteger("currentPage");
+ Integer pageSize = paramObj.getInteger("pageSize");
+ DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo = new DeployAppEnvAutoConfigAuditVo();
+ deployAppEnvAutoConfigAuditVo.setAppSystemId(appSystemId);
+ deployAppEnvAutoConfigAuditVo.setAppModuleId(appModuleId);
+ deployAppEnvAutoConfigAuditVo.setEnvId(envId);
+ deployAppEnvAutoConfigAuditVo.setInstanceId(instanceId);
+ deployAppEnvAutoConfigAuditVo.setCurrentPage(currentPage);
+ deployAppEnvAutoConfigAuditVo.setPageSize(pageSize);
+ int rowNum = deployAppConfigMapper.getAppEnvAutoConfigAuditCount(deployAppEnvAutoConfigAuditVo);
+ if (rowNum > 0) {
+ deployAppEnvAutoConfigAuditVo.setRowNum(rowNum);
+ Map userMap = new HashMap<>();
+ List list = deployAppConfigMapper.getAppEnvAutoConfigAuditList(deployAppEnvAutoConfigAuditVo);
+ Set userUuidSet = list.stream().filter(Objects::nonNull).map(DeployAppEnvAutoConfigAuditVo::getFcu).filter(Objects::nonNull).collect(Collectors.toSet());
+ if (CollectionUtils.isNotEmpty(userUuidSet)) {
+ List userList = userMapper.getUserByUserUuidList(new ArrayList<>(userUuidSet));
+ if (CollectionUtils.isNotEmpty(userList)) {
+ userMap = userList.stream().collect(Collectors.toMap(UserVo::getUuid, e -> e));
+ }
+ }
+ for (DeployAppEnvAutoConfigAuditVo appEnvAutoConfigAuditVo : list) {
+ JSONObject tableObj = new JSONObject();
+ Long id = appEnvAutoConfigAuditVo.getId();
+ String fcu = appEnvAutoConfigAuditVo.getFcu();
+ Date fcd = appEnvAutoConfigAuditVo.getFcd();
+ JSONObject config = appEnvAutoConfigAuditVo.getConfig();
+ JSONArray tbodyList = config.getJSONArray("tbodyList");
+ for (int i = 0; i < tbodyList.size(); i++) {
+ JSONObject tbody = tbodyList.getJSONObject(i);
+ String key = tbody.getString("key");
+ tbody.put("uuid", id + "_" + key);
+// String action = tbody.getString("action");
+// if (Objects.equals(action, "insert")) {
+// tbody.put("colorClass", "bg-success-grey");
+// } else if (Objects.equals(action, "update")) {
+// tbody.put("colorClass", "bg-warning-grey");
+// } else if (Objects.equals(action, "delete")) {
+// tbody.put("colorClass", "bg-error-grey");
+// }
+ Integer beforeIsEmpty = tbody.getInteger("beforeIsEmpty");
+ if (Objects.equals(beforeIsEmpty, 1)) {
+ tbody.put("beforeValue", "设为空");
+ }
+ Integer afterIsEmpty = tbody.getInteger("afterIsEmpty");
+ if (Objects.equals(afterIsEmpty, 1)) {
+ tbody.put("afterValue", "设为空");
+ }
+ String beforeType = tbody.getString("beforeType");
+ if (StringUtils.isNotBlank(beforeType)) {
+ ParamType paramType = ParamType.getParamType(beforeType);
+ if (paramType != null) {
+ tbody.put("beforeTypeText", paramType.getText());
+ }
+ }
+ String afterType = tbody.getString("afterType");
+ if (StringUtils.isNotBlank(afterType)) {
+ ParamType paramType = ParamType.getParamType(afterType);
+ if (paramType != null) {
+ tbody.put("afterTypeText", paramType.getText());
+ }
+ }
+ }
+ tableObj.put("id", id);
+ tableObj.put("fcd", fcd);
+ tableObj.put("fcu", fcu);
+ tableObj.put("_expand", true);
+ UserVo userVo = userMap.get(fcu);
+ if (userVo != null) {
+ tableObj.put("fcuName", userVo.getUserName());
+ } else {
+ tableObj.put("fcuName", "");
+ }
+ JSONObject table = new JSONObject();
+ table.put("tbodyList", tbodyList);
+ tableObj.put("table", table);
+ tableList.add(tableObj);
+ }
+ }
+ resultObj.put("tableList", tableList);
+ return TableResultUtil.getResult(tableList, deployAppEnvAutoConfigAuditVo);
+ }
+
+ @Override
+ public String getToken() {
+ return "deploy/app/config/env/auto/config/audit/list";
+ }
+}
diff --git a/src/main/java/neatlogic/module/deploy/api/appconfig/env/SaveDeployAppConfigEnvAutoConfigApi.java b/src/main/java/neatlogic/module/deploy/api/appconfig/env/SaveDeployAppConfigEnvAutoConfigApi.java
index d18f8d15ec4befe469d508de936baff52e0a16aa..5eb87e481e7a675637c46e5232e208dbb30439aa 100644
--- a/src/main/java/neatlogic/module/deploy/api/appconfig/env/SaveDeployAppConfigEnvAutoConfigApi.java
+++ b/src/main/java/neatlogic/module/deploy/api/appconfig/env/SaveDeployAppConfigEnvAutoConfigApi.java
@@ -15,24 +15,28 @@ along with this program. If not, see .*/
package neatlogic.module.deploy.api.appconfig.env;
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import neatlogic.framework.auth.core.AuthAction;
import neatlogic.framework.common.constvalue.ApiParamType;
import neatlogic.framework.deploy.auth.DEPLOY_BASE;
import neatlogic.framework.deploy.constvalue.DeployAppConfigAction;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigAuditVo;
+import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigKeyValueVo;
import neatlogic.framework.deploy.dto.app.DeployAppEnvAutoConfigVo;
import neatlogic.framework.restful.annotation.*;
import neatlogic.framework.restful.constvalue.OperationTypeEnum;
import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase;
+import neatlogic.framework.util.TableResultUtil;
import neatlogic.module.deploy.dao.mapper.DeployAppConfigMapper;
import neatlogic.module.deploy.service.DeployAppAuthorityService;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
-import java.util.Date;
+import java.util.*;
/**
* @author lvzk
@@ -41,7 +45,7 @@ import java.util.Date;
@Service
@Transactional
@AuthAction(action = DEPLOY_BASE.class)
-@OperationType(type = OperationTypeEnum.SEARCH)
+@OperationType(type = OperationTypeEnum.OPERATE)
public class SaveDeployAppConfigEnvAutoConfigApi extends PrivateApiComponentBase {
@Resource
@@ -78,23 +82,119 @@ public class SaveDeployAppConfigEnvAutoConfigApi extends PrivateApiComponentBase
@Description(desc = "保存应用环境实例autoConfig接口")
@Override
public Object myDoService(JSONObject paramObj) {
-
+ Long appSystemId = paramObj.getLong("appSystemId");
+ Long appModuleId = paramObj.getLong("appModuleId");
+ Long envId = paramObj.getLong("envId");
+ Long instanceId = paramObj.getLong("instanceId");
+ if (instanceId == null) {
+ instanceId = 0L;
+ }
+ List keyValueList = new ArrayList<>();
+ JSONArray keyValueArray = paramObj.getJSONArray("keyValueList");
+ if (CollectionUtils.isNotEmpty(keyValueArray)) {
+ keyValueList = keyValueArray.toJavaList(DeployAppEnvAutoConfigKeyValueVo.class);
+ }
//校验环境权限、编辑配置的操作权限
- deployAppAuthorityService.checkEnvAuth(paramObj.getLong("appSystemId"), paramObj.getLong("envId"));
- deployAppAuthorityService.checkOperationAuth(paramObj.getLong("appSystemId"), DeployAppConfigAction.EDIT);
+ deployAppAuthorityService.checkEnvAuth(appSystemId, paramObj.getLong("envId"));
+ deployAppAuthorityService.checkOperationAuth(appSystemId, DeployAppConfigAction.EDIT);
- DeployAppEnvAutoConfigVo appEnvAutoConfigVo = JSON.toJavaObject(paramObj, DeployAppEnvAutoConfigVo.class);
- Date nowDate = new Date(System.currentTimeMillis());
- appEnvAutoConfigVo.setLcd(nowDate);
- if (CollectionUtils.isNotEmpty(appEnvAutoConfigVo.getKeyValueList())) {
- deployAppConfigMapper.insertAppEnvAutoConfig(appEnvAutoConfigVo);
+// DeployAppEnvAutoConfigVo appEnvAutoConfigVo = JSON.toJavaObject(paramObj, DeployAppEnvAutoConfigVo.class);
+ DeployAppEnvAutoConfigVo appEnvAutoConfigVo = new DeployAppEnvAutoConfigVo(appSystemId, appModuleId, envId, instanceId);
+ List oldKeyValueList = deployAppConfigMapper.getAppEnvAutoConfigKeyValueList(appEnvAutoConfigVo);
+ JSONArray tbodyList = getTbodyList(oldKeyValueList, keyValueList);
+ if (CollectionUtils.isNotEmpty(tbodyList)) {
+ Date nowDate = new Date(System.currentTimeMillis());
+ appEnvAutoConfigVo.setLcd(nowDate);
+ if (CollectionUtils.isNotEmpty(keyValueList)) {
+ appEnvAutoConfigVo.setKeyValueList(keyValueList);
+ deployAppConfigMapper.insertAppEnvAutoConfig(appEnvAutoConfigVo);
+ }
+ deployAppConfigMapper.deleteAppEnvAutoConfig(appEnvAutoConfigVo);
+ DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo = new DeployAppEnvAutoConfigAuditVo();
+ deployAppEnvAutoConfigAuditVo.setAppSystemId(appSystemId);
+ deployAppEnvAutoConfigAuditVo.setAppModuleId(appModuleId);
+ deployAppEnvAutoConfigAuditVo.setEnvId(envId);
+ deployAppEnvAutoConfigAuditVo.setInstanceId(instanceId);
+ deployAppEnvAutoConfigAuditVo.setConfig(TableResultUtil.getResult(tbodyList));
+ deployAppConfigMapper.insertAppEnvAutoConfigAudit(deployAppEnvAutoConfigAuditVo);
}
- deployAppConfigMapper.deleteAppEnvAutoConfig(appEnvAutoConfigVo);
Long deleteInstanceId = paramObj.getLong("deleteInstanceId");
if (deleteInstanceId != null) {
- DeployAppEnvAutoConfigVo deleteAppEnvAutoConfigVo = new DeployAppEnvAutoConfigVo(paramObj.getLong("appSystemId"), paramObj.getLong("appModuleId"), paramObj.getLong("envId"), deleteInstanceId);
+ DeployAppEnvAutoConfigVo deleteAppEnvAutoConfigVo = new DeployAppEnvAutoConfigVo(appSystemId, appModuleId, envId, deleteInstanceId);
deployAppConfigMapper.deleteAppEnvAutoConfig(deleteAppEnvAutoConfigVo);
}
return null;
}
+
+ private JSONArray getTbodyList(List oldKeyValueList, List newKeyValueList) {
+ oldKeyValueList.sort(Comparator.comparing(DeployAppEnvAutoConfigKeyValueVo::getKey));
+ newKeyValueList.sort(Comparator.comparing(DeployAppEnvAutoConfigKeyValueVo::getKey));
+ JSONArray tbodyList = new JSONArray();
+ if (CollectionUtils.isNotEmpty(oldKeyValueList)) {
+ for (int index = 0; index < oldKeyValueList.size(); index++) {
+ DeployAppEnvAutoConfigKeyValueVo keyValueVo = oldKeyValueList.get(index);
+ JSONObject tbody = new JSONObject();
+ tbody.put("key", keyValueVo.getKey());
+ tbody.put("beforeType", keyValueVo.getType());
+ tbody.put("beforeValue", keyValueVo.getValue());
+ tbody.put("beforeIsEmpty", keyValueVo.getIsEmpty());
+ tbody.put("action", "delete");
+ tbodyList.add(tbody);
+ }
+ }
+ if (CollectionUtils.isNotEmpty(newKeyValueList)) {
+ int lastIndex = -1;
+ for (DeployAppEnvAutoConfigKeyValueVo keyValueVo : newKeyValueList) {
+ Integer index = null;
+ for (int i = 0; i < tbodyList.size(); i++) {
+ JSONObject tbody = tbodyList.getJSONObject(i);
+ String key = tbody.getString("key");
+ if (Objects.equals(key, keyValueVo.getKey())) {
+ index = i;
+ }
+ }
+ if (index != null) {
+ JSONObject tbody = tbodyList.getJSONObject(index);
+ tbody.put("afterType", keyValueVo.getType());
+ tbody.put("afterValue", keyValueVo.getValue());
+ tbody.put("afterIsEmpty", keyValueVo.getIsEmpty());
+ tbody.put("action", "update");
+ lastIndex = index;
+ } else {
+ lastIndex++;
+ JSONObject tbody = new JSONObject();
+ tbody.put("key", keyValueVo.getKey());
+ tbody.put("afterType", keyValueVo.getType());
+ tbody.put("afterValue", keyValueVo.getValue());
+ tbody.put("afterIsEmpty", keyValueVo.getIsEmpty());
+ tbody.put("action", "insert");
+ tbodyList.add(lastIndex, tbody);
+ }
+ }
+ }
+ for (int index = tbodyList.size() - 1; index >= 0; index--) {
+ JSONObject tbody = tbodyList.getJSONObject(index);
+ String action = tbody.getString("action");
+ if (Objects.equals(action, "update")) {
+ Integer beforeIsEmpty = tbody.getInteger("beforeIsEmpty");
+ Integer afterIsEmpty = tbody.getInteger("afterIsEmpty");
+ if (Objects.equals(beforeIsEmpty, afterIsEmpty)) {
+ if (Objects.equals(beforeIsEmpty, 1)) {
+ tbodyList.remove(index);
+ } else {
+ String beforeValue = tbody.getString("beforeValue");
+ String afterValue = tbody.getString("afterValue");
+ if (Objects.equals(beforeValue, afterValue)) {
+ tbodyList.remove(index);
+ } else {
+ if (StringUtils.isBlank(beforeValue) && StringUtils.isBlank(afterValue)) {
+ tbodyList.remove(index);
+ }
+ }
+ }
+ }
+ }
+ }
+ return tbodyList;
+ }
}
diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.java b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.java
index 1b408ff16f68521c8ed807ddeffe85e66b174289..d187f49d2a09b7ce9c03116735a07e8ef7005d17 100644
--- a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.java
+++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.java
@@ -107,6 +107,12 @@ public interface DeployAppConfigMapper extends IDeployAppConfigCrossoverMapper {
List getAppModuleListBySystemId(Long appSystemId);
+ int getAppEnvAutoConfigAuditCount(DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo);
+
+ List getAppEnvAutoConfigAuditList(DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo);
+
+ List getAppEnvAutoConfigAuditListByIdList(List idList);
+
Integer insertAppConfigAuthority(DeployAppConfigAuthorityVo deployAppConfigAuthorityVo);
Integer insertAppModuleRunnerGroup(@Param("appSystemId") Long appSystemId, @Param("appModuleId") Long appModuleId, @Param("runnerGroupId") Long runnerGroupId);
@@ -126,6 +132,20 @@ public interface DeployAppConfigMapper extends IDeployAppConfigCrossoverMapper {
void insertBatchAppEnvAutoConfig(@Param("appEnvAutoConfigVoList") List appEnvAutoConfigVoList);
+ void insertAppEnvAutoConfigByKey(
+ @Param("appSystemId") Long appSystemId,
+ @Param("appModuleId") Long appModuleId,
+ @Param("envId") Long envId,
+ @Param("instanceId") Long instanceId,
+ @Param("key") String key,
+ @Param("type") String type,
+ @Param("value") String value,
+ @Param("isEmpty") Integer isEmpty,
+ @Param("lcu") String lcu
+ );
+
+ int insertAppEnvAutoConfigAudit(DeployAppEnvAutoConfigAuditVo deployAppEnvAutoConfigAuditVo);
+
Integer insertAppConfig(DeployAppConfigVo deployAppConfigVo);
void insertBatchAppConfig(@Param("configList") List configList);
@@ -156,6 +176,14 @@ public interface DeployAppConfigMapper extends IDeployAppConfigCrossoverMapper {
Integer deleteAppEnvAutoConfigByAppSystemIdAndAppModuleIdAndEnvId(@Param("appSystemId") Long appSystemId, @Param("appModuleId") Long appModuleId, @Param("envId") Long envId);
+ void deleteAppEnvAutoConfigByKey(
+ @Param("appSystemId") Long appSystemId,
+ @Param("appModuleId") Long appModuleId,
+ @Param("envId") Long envId,
+ @Param("instanceId") Long instanceId,
+ @Param("key") String key
+ );
+
Integer deleteAppConfigDraft(DeployAppConfigVo deployAppConfigDraftVo);
Integer getAppSystemIdListCount(DeployResourceSearchVo searchVo);
diff --git a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.xml b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.xml
index 81c83bb1f47f42bc5538d464e538ecbe3629a410..9cfcf428c67b984766f378c913edf754136ede0a 100644
--- a/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.xml
+++ b/src/main/java/neatlogic/module/deploy/dao/mapper/DeployAppConfigMapper.xml
@@ -1541,6 +1541,52 @@ along with this program. If not, see .-->
AND `env_id` = #{envId}
+
+
+
+
+
+
UPDATE `deploy_app_config` SET `config` = #{configStr} WHERE `id` = #{id}
@@ -1626,6 +1672,64 @@ along with this program. If not, see .-->
ON DUPLICATE KEY UPDATE `key` = VALUES(`key`)
+
+ INSERT INTO `deploy_app_env_auto_config` (
+ `app_system_id`,
+ `app_module_id`,
+ `env_id`,
+ `instance_id`,
+ `key`,
+ `type`,
+ `value`,
+ `is_empty`,
+ `lcu`,
+ `lcd`
+ )
+ VALUES
+ (
+ #{appSystemId},
+ #{appModuleId},
+ #{envId},
+ #{instanceId},
+ #{key},
+ #{type},
+ #{value},
+ #{isEmpty},
+ #{lcu},
+ NOW(3)
+ )
+ ON DUPLICATE KEY UPDATE
+ `type` = #{type},
+ `value` = #{value},
+ `is_empty` = #{isEmpty},
+ `lcu` = #{lcu},
+ `lcd` = NOW(3)
+
+
+
+ INSERT INTO `deploy_app_env_auto_config_audit` (
+ `id`,
+ `app_system_id`,
+ `app_module_id`,
+ `env_id`,
+ `instance_id`,
+ `config`,
+ `fcu`,
+ `fcd`
+ )
+ VALUES
+ (
+ #{id},
+ #{appSystemId},
+ #{appModuleId},
+ #{envId},
+ #{instanceId},
+ #{configStr, typeHandler=CompressHandler},
+ #{fcu},
+ NOW(3)
+ )
+
+
INSERT INTO `deploy_app_config` (`id`,
`app_system_id`,
@@ -1855,6 +1959,16 @@ along with this program. If not, see .-->
+
+ DELETE
+ FROM deploy_app_env_auto_config
+ WHERE `app_system_id` = #{appSystemId}
+ AND `app_module_id` = #{appModuleId}
+ AND `env_id` = #{envId}
+ AND `instance_id` = #{instanceId}
+ AND `key` = #{key}
+
+
DELETE
FROM `deploy_app_config_draft`
diff --git a/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-16/neatlogic_tenant.sql b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-16/neatlogic_tenant.sql
index 09cddd932e54e587bdab3c2043686b1fecdb3c56..b9920f1789f602f8186f5cec89bb6a0ce5f7472d 100644
--- a/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-16/neatlogic_tenant.sql
+++ b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-16/neatlogic_tenant.sql
@@ -1,3 +1,3 @@
-ALTER TABLE `neatlogic_develop`.`deploy_app_env_auto_config`
+ALTER TABLE `deploy_app_env_auto_config`
CHANGE `type` `type` ENUM ('text', 'password', 'textarea') CHARSET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'text' NULL COMMENT '变量类型';
diff --git a/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/neatlogic_tenant.sql b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/neatlogic_tenant.sql
new file mode 100644
index 0000000000000000000000000000000000000000..16578d58e8e8794a800ea1fcfdaf93ff2a3ed82c
--- /dev/null
+++ b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/neatlogic_tenant.sql
@@ -0,0 +1,12 @@
+CREATE TABLE IF NOT EXISTS `deploy_app_env_auto_config_audit` (
+ `id` bigint NOT NULL COMMENT '主键ID',
+ `app_system_id` bigint NOT NULL COMMENT '应用id',
+ `app_module_id` bigint NOT NULL COMMENT '模块id',
+ `env_id` bigint NOT NULL COMMENT '环境资产id',
+ `instance_id` bigint NOT NULL COMMENT '实例资产id',
+ `config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '修改记录',
+ `fcd` timestamp(3) NOT NULL COMMENT '创建者',
+ `fcu` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='发布应用环境变量配置审计';
+
diff --git a/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/version.json b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/version.json
new file mode 100644
index 0000000000000000000000000000000000000000..48171b676fc9f2fa37e2075aa3e31ba5efd0421f
--- /dev/null
+++ b/src/main/resources/neatlogic/resources/deploy/changelog/2025-04-17/version.json
@@ -0,0 +1,10 @@
+{
+ "content":[
+ {
+ "type":"新增功能",
+ "detail":[
+ {"msg":"应用配置-环境层配置文件适配变量增加审计功能"}
+ ]
+ }
+ ]
+}