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":"应用配置-环境层配置文件适配变量增加审计功能"} + ] + } + ] +}