diff --git a/backend/pom.xml b/backend/pom.xml
index fe0f3fd9..93fade5a 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -137,11 +137,11 @@
provided
-
+
- nl.basjes.parse.useragent
- yauaa
- 7.26.0
+ com.blueconic
+ browscap-java
+ 1.4.3
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java
index bb5833ba..a91f2392 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationApiController.java
@@ -7,10 +7,10 @@ import com.qqchen.deploy.backend.deploy.query.ApplicationQuery;
import com.qqchen.deploy.backend.deploy.service.IApplicationService;
import com.qqchen.deploy.backend.framework.api.Response;
import com.qqchen.deploy.backend.framework.controller.BaseController;
+import com.qqchen.deploy.backend.framework.dto.PageResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -54,9 +54,9 @@ public class ApplicationApiController extends BaseController> page(ApplicationQuery query) {
- return super.page(query);
+ @GetMapping("/page")
+ public Response> pageWithStats(ApplicationQuery query) {
+ return Response.success(applicationService.pageWithStats(query));
}
@Override
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java
index 63117b61..f2846192 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java
@@ -34,7 +34,7 @@ public class ApplicationCategoryApiController extends BaseController update(Long id, @Validated @RequestBody ApplicationCategoryDTO dto) {
+ public Response update(@PathVariable Long id, @Validated @RequestBody ApplicationCategoryDTO dto) {
return super.update(id, dto);
}
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java
index 0b3ffcdd..6936a9d3 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/EnvironmentApiController.java
@@ -37,12 +37,12 @@ public class EnvironmentApiController extends BaseController delete(@Validated @RequestBody Long id) {
+ public Response delete(@PathVariable Long id) {
return super.delete(id);
}
@Override
- public Response findById(@Validated @RequestBody Long id) {
+ public Response findById(@PathVariable Long id) {
return super.findById(id);
}
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java
index 712aa362..9f4119d9 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/JenkinsSyncHistoryApiController.java
@@ -8,8 +8,8 @@ import com.qqchen.deploy.backend.deploy.query.JenkinsSyncHistoryQuery;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@@ -26,23 +26,23 @@ public class JenkinsSyncHistoryApiController extends BaseController create(JenkinsSyncHistoryDTO dto) {
+ public Response create(@Validated @RequestBody JenkinsSyncHistoryDTO dto) {
return super.create(dto);
}
@Override
- public Response update(Long aLong, JenkinsSyncHistoryDTO dto) {
- return super.update(aLong, dto);
+ public Response update(@PathVariable Long id, @Validated @RequestBody JenkinsSyncHistoryDTO dto) {
+ return super.update(id, dto);
}
@Override
- public Response delete(Long aLong) {
- return super.delete(aLong);
+ public Response delete(@PathVariable Long id) {
+ return super.delete(id);
}
@Override
- public Response findById(Long aLong) {
- return super.findById(aLong);
+ public Response findById(@PathVariable Long id) {
+ return super.findById(id);
}
@Override
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java
index 77781ebc..b60d26b9 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/RepositoryGroupApiController.java
@@ -13,6 +13,7 @@ import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -31,23 +32,23 @@ public class RepositoryGroupApiController extends BaseController create(RepositoryGroupDTO dto) {
+ public Response create(@Validated @RequestBody RepositoryGroupDTO dto) {
return super.create(dto);
}
@Override
- public Response update(Long aLong, RepositoryGroupDTO dto) {
- return super.update(aLong, dto);
+ public Response update(@PathVariable Long id, @Validated @RequestBody RepositoryGroupDTO dto) {
+ return super.update(id, dto);
}
@Override
- public Response delete(Long aLong) {
- return super.delete(aLong);
+ public Response delete(@PathVariable Long id) {
+ return super.delete(id);
}
@Override
- public Response findById(Long aLong) {
- return super.findById(aLong);
+ public Response findById(@PathVariable Long id) {
+ return super.findById(id);
}
@Override
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegrationImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegrationImpl.java
index 36dc5692..3425945e 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegrationImpl.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/integration/impl/JenkinsServiceIntegrationImpl.java
@@ -57,6 +57,9 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
@Slf4j
@Service
@@ -65,12 +68,24 @@ public class JenkinsServiceIntegrationImpl extends BaseExternalSystemIntegration
@Resource
private IExternalSystemRepository systemRepository;
- private final RestTemplate restTemplate = new RestTemplate();
+ private final RestTemplate restTemplate;
// Jenkins Crumb缓存 - 线程安全
private static final Map CRUMB_CACHE = new ConcurrentHashMap<>();
+
+ // 每个Jenkins系统独立的锁 - 避免不同系统间互相阻塞
+ private static final Map SYSTEM_LOCKS = new ConcurrentHashMap<>();
private static final long CRUMB_EXPIRE_TIME = 25 * 60 * 1000; // 25分钟过期
+ private static final long LOCK_TIMEOUT_SECONDS = 3; // 锁超时时间:3秒
+
+ public JenkinsServiceIntegrationImpl() {
+ // 配置RestTemplate超时,防止网络故障时长时间阻塞
+ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+ factory.setConnectTimeout(5000); // 连接超时5秒
+ factory.setReadTimeout(10000); // 读取超时10秒
+ this.restTemplate = new RestTemplate(factory);
+ }
/**
* Jenkins Crumb缓存内部类
@@ -95,29 +110,71 @@ public class JenkinsServiceIntegrationImpl extends BaseExternalSystemIntegration
/**
* 线程安全地获取Jenkins Crumb缓存
+ * 使用ReentrantLock + tryLock实现带超时的锁机制,避免死锁
* 如果缓存不存在或已过期,会重新获取和解密
*/
- private synchronized JenkinsCrumbCache getCrumbCache(ExternalSystem system) {
+ private JenkinsCrumbCache getCrumbCache(ExternalSystem system) {
Long systemId = system.getId();
+
+ // 快速路径:如果缓存有效,直接返回
JenkinsCrumbCache cache = CRUMB_CACHE.get(systemId);
-
- if (cache == null || cache.isExpired()) {
- log.debug("Jenkins Crumb缓存失效,重新获取: systemId={}", systemId);
-
- // 解密系统信息(只在这里解密一次)
- ExternalSystem decryptedSystem = decryptSystem(system);
-
- // 获取新的crumb
- JenkinsCrumbIssuerResponse crumb = fetchCrumbFromJenkins(decryptedSystem);
-
- // 创建新缓存
- cache = new JenkinsCrumbCache(crumb, decryptedSystem);
- CRUMB_CACHE.put(systemId, cache);
-
- log.debug("Jenkins Crumb缓存已更新: systemId={}, expireTime={}", systemId, cache.expireTime);
+ if (cache != null && !cache.isExpired()) {
+ return cache;
+ }
+
+ // 获取该Jenkins系统的独立锁(公平锁,避免线程饥饿)
+ ReentrantLock lock = SYSTEM_LOCKS.computeIfAbsent(systemId, k -> new ReentrantLock(true));
+
+ try {
+ // 尝试获取锁,最多等待3秒
+ if (lock.tryLock(LOCK_TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
+ try {
+ // 双重检查:获取锁后再次检查缓存
+ cache = CRUMB_CACHE.get(systemId);
+ if (cache != null && !cache.isExpired()) {
+ log.debug("Jenkins Crumb缓存命中(双重检查): systemId={}", systemId);
+ return cache;
+ }
+
+ log.debug("Jenkins Crumb缓存失效,重新获取: systemId={}", systemId);
+
+ // 解密系统信息(只在这里解密一次)
+ ExternalSystem decryptedSystem = decryptSystem(system);
+
+ // 获取新的crumb(网络I/O,但不持有synchronized锁)
+ JenkinsCrumbIssuerResponse crumb = fetchCrumbFromJenkins(decryptedSystem);
+
+ // 创建新缓存
+ cache = new JenkinsCrumbCache(crumb, decryptedSystem);
+ CRUMB_CACHE.put(systemId, cache);
+
+ log.debug("Jenkins Crumb缓存已更新: systemId={}, expireTime={}", systemId, cache.expireTime);
+ return cache;
+ } finally {
+ lock.unlock();
+ }
+ } else {
+ // 获取锁超时,使用降级策略
+ log.warn("获取Jenkins Crumb锁超时({}秒),systemId={}", LOCK_TIMEOUT_SECONDS, systemId);
+
+ // 降级策略:使用过期缓存(容忍短暂的认证失败)
+ cache = CRUMB_CACHE.get(systemId);
+ if (cache != null) {
+ log.warn("使用过期的Jenkins Crumb缓存作为降级: systemId={}, 过期时间差={}ms",
+ systemId, System.currentTimeMillis() - cache.expireTime);
+ return cache;
+ }
+
+ // 没有缓存可用,抛出异常
+ throw new BusinessException(ResponseCode.JENKINS_API_ERROR,
+ new Object[]{"CRUMB_LOCK_TIMEOUT", "获取Jenkins认证信息超时,请稍后重试"});
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ log.error("获取Jenkins Crumb锁被中断: systemId={}", systemId, e);
+ throw new BusinessException(ResponseCode.JENKINS_API_ERROR,
+ new Object[]{"CRUMB_LOCK_INTERRUPTED", "获取Jenkins认证信息被中断"});
}
-
- return cache;
}
/**
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java
index bef80b10..1e49e302 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java
@@ -1,7 +1,9 @@
package com.qqchen.deploy.backend.deploy.repository;
import com.qqchen.deploy.backend.deploy.entity.Application;
+import com.qqchen.deploy.backend.deploy.repository.projection.ApplicationEnabledStatistics;
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
+import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@@ -14,4 +16,15 @@ public interface IApplicationRepository extends IBaseRepository countByEnabledGroupBy();
+
}
\ No newline at end of file
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/projection/ApplicationEnabledStatistics.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/projection/ApplicationEnabledStatistics.java
new file mode 100644
index 00000000..97118663
--- /dev/null
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/projection/ApplicationEnabledStatistics.java
@@ -0,0 +1,20 @@
+package com.qqchen.deploy.backend.deploy.repository.projection;
+
+/**
+ * 应用启用状态统计投影接口
+ * 用于Spring Data JPA的查询结果映射
+ */
+public interface ApplicationEnabledStatistics {
+
+ /**
+ * 获取启用状态
+ * @return true=已启用,false=已禁用
+ */
+ Boolean getEnabled();
+
+ /**
+ * 获取该状态下的应用数量
+ * @return 应用数量
+ */
+ Long getCount();
+}
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java
index f759939a..08b6a1a2 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationService.java
@@ -4,15 +4,20 @@ import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO;
import com.qqchen.deploy.backend.deploy.dto.DevelopmentLanguageTypeDTO;
import com.qqchen.deploy.backend.deploy.entity.Application;
import com.qqchen.deploy.backend.deploy.query.ApplicationQuery;
+import com.qqchen.deploy.backend.framework.dto.PageResult;
import com.qqchen.deploy.backend.framework.service.IBaseService;
-import org.springframework.data.domain.Page;
import java.util.List;
public interface IApplicationService extends IBaseService {
- Page page(ApplicationQuery query);
-
+ /**
+ * 分页查询应用(带统计信息)
+ *
+ * @param query 查询条件
+ * @return 分页结果,包含已启用和已禁用的总数统计
+ */
+ PageResult pageWithStats(ApplicationQuery query);
List getAllDevelopmentLanguageTypes();
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java
index 2f535bea..47808470 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java
@@ -19,7 +19,9 @@ import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository;
import com.qqchen.deploy.backend.deploy.repository.IExternalSystemRepository;
import com.qqchen.deploy.backend.deploy.repository.IRepositoryProjectRepository;
import com.qqchen.deploy.backend.deploy.repository.ITeamApplicationRepository;
+import com.qqchen.deploy.backend.deploy.repository.projection.ApplicationEnabledStatistics;
import com.qqchen.deploy.backend.deploy.service.IApplicationService;
+import com.qqchen.deploy.backend.framework.dto.PageResult;
import com.qqchen.deploy.backend.framework.enums.ResponseCode;
import com.qqchen.deploy.backend.framework.exception.BusinessException;
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
@@ -109,6 +111,31 @@ public class ApplicationServiceImpl extends BaseServiceImpl pageWithStats(ApplicationQuery query) {
+ Page page = super.page(query);
+ fillApplicationRelations(page.getContent());
+
+ // 一次查询获取启用和禁用状态的应用总数(按enabled分组统计)
+ List statistics = applicationRepository.countByEnabledGroupBy();
+
+ // 解析统计结果
+ Long enabledCount = 0L;
+ Long disabledCount = 0L;
+ for (ApplicationEnabledStatistics stat : statistics) {
+ if (Boolean.TRUE.equals(stat.getEnabled())) {
+ enabledCount = stat.getCount();
+ } else if (Boolean.FALSE.equals(stat.getEnabled())) {
+ disabledCount = stat.getCount();
+ }
+ }
+
+ // 构建PageResult并添加统计字段
+ return new PageResult<>(page)
+ .addExtraField("enabledCount", enabledCount)
+ .addExtraField("disabledCount", disabledCount);
+ }
+
@Override
public Page page(ApplicationQuery query) {
Page page = super.page(query);
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/PageResult.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/PageResult.java
new file mode 100644
index 00000000..47ea765a
--- /dev/null
+++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/dto/PageResult.java
@@ -0,0 +1,239 @@
+package com.qqchen.deploy.backend.framework.dto;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * 通用分页结果包装类
+ * 实现Page接口,保留Spring Data Page的所有字段,并支持添加额外的统计字段
+ * 额外字段会通过@JsonAnyGetter展开到与totalElements同一层级
+ *
+ * @param 分页数据类型
+ */
+public class PageResult implements Page, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 内部Page对象,用于委托所有Page接口方法
+ */
+ @JsonIgnore
+ private final Page page;
+
+ /**
+ * 额外的统计字段,会被展开到JSON的顶层
+ */
+ @JsonIgnore
+ private final Map extraFields = new HashMap<>();
+
+ /**
+ * 构造函数
+ *
+ * @param page Spring Data Page对象
+ */
+ public PageResult(Page page) {
+ this.page = page;
+ }
+
+ /**
+ * 添加额外的统计字段
+ *
+ * @param key 字段名
+ * @param value 字段值
+ * @return 当前对象(支持链式调用)
+ */
+ public PageResult addExtraField(String key, Object value) {
+ this.extraFields.put(key, value);
+ return this;
+ }
+
+ /**
+ * Jackson注解:将extraFields的内容展开到JSON的顶层
+ * 使得额外字段与totalElements等在同一层级
+ */
+ @JsonAnyGetter
+ public Map getExtraFields() {
+ return extraFields;
+ }
+
+ /**
+ * Jackson注解:支持反序列化时设置额外字段
+ */
+ @JsonAnySetter
+ public void setExtraField(String key, Object value) {
+ extraFields.put(key, value);
+ }
+
+ // ==================== 实现Page接口的所有方法 ====================
+
+ /**
+ * 获取当前页的数据列表
+ */
+ @Override
+ public List getContent() {
+ return page.getContent();
+ }
+
+ /**
+ * 获取总记录数
+ */
+ @Override
+ public long getTotalElements() {
+ return page.getTotalElements();
+ }
+
+ /**
+ * 获取总页数
+ */
+ @Override
+ public int getTotalPages() {
+ return page.getTotalPages();
+ }
+
+ /**
+ * 获取当前页码(从0开始)
+ */
+ @Override
+ public int getNumber() {
+ return page.getNumber();
+ }
+
+ /**
+ * 获取每页大小
+ */
+ @Override
+ public int getSize() {
+ return page.getSize();
+ }
+
+ /**
+ * 获取当前页的实际记录数
+ */
+ @Override
+ public int getNumberOfElements() {
+ return page.getNumberOfElements();
+ }
+
+ /**
+ * 是否有内容
+ */
+ @Override
+ public boolean hasContent() {
+ return page.hasContent();
+ }
+
+ /**
+ * 是否为空
+ */
+ @Override
+ public boolean isEmpty() {
+ return page.isEmpty();
+ }
+
+ /**
+ * 是否为第一页
+ */
+ @Override
+ public boolean isFirst() {
+ return page.isFirst();
+ }
+
+ /**
+ * 是否为最后一页
+ */
+ @Override
+ public boolean isLast() {
+ return page.isLast();
+ }
+
+ /**
+ * 是否有下一页
+ */
+ @Override
+ public boolean hasNext() {
+ return page.hasNext();
+ }
+
+ /**
+ * 是否有上一页
+ */
+ @Override
+ public boolean hasPrevious() {
+ return page.hasPrevious();
+ }
+
+ /**
+ * 获取排序信息
+ */
+ @Override
+ public Sort getSort() {
+ return page.getSort();
+ }
+
+ /**
+ * 获取分页信息
+ */
+ @Override
+ public Pageable getPageable() {
+ return page.getPageable();
+ }
+
+ /**
+ * 获取下一页的分页信息
+ */
+ @Override
+ public Pageable nextPageable() {
+ return page.nextPageable();
+ }
+
+ /**
+ * 获取上一页的分页信息
+ */
+ @Override
+ public Pageable previousPageable() {
+ return page.previousPageable();
+ }
+
+ /**
+ * 转换当前页的数据类型
+ *
+ * @param converter 转换函数
+ * @param 目标类型
+ * @return 新的PageResult对象
+ */
+ @Override
+ public PageResult map(Function super T, ? extends U> converter) {
+ Page mappedPage = page.map(converter);
+ PageResult result = new PageResult<>(mappedPage);
+ // 复制额外字段
+ result.extraFields.putAll(this.extraFields);
+ return result;
+ }
+
+ /**
+ * 获取迭代器
+ */
+ @Override
+ public Iterator iterator() {
+ return page.iterator();
+ }
+
+ /**
+ * 获取内部Page对象(用于需要直接访问Page的场景)
+ */
+ @JsonIgnore
+ public Page getPage() {
+ return page;
+ }
+}
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/UserAgentUtil.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/UserAgentUtil.java
index 27b74f67..0338a12c 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/UserAgentUtil.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/utils/UserAgentUtil.java
@@ -1,13 +1,16 @@
package com.qqchen.deploy.backend.framework.utils;
+import com.blueconic.browscap.Capabilities;
+import com.blueconic.browscap.ParseException;
+import com.blueconic.browscap.UserAgentParser;
+import com.blueconic.browscap.UserAgentService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
-import nl.basjes.parse.useragent.UserAgent;
-import nl.basjes.parse.useragent.UserAgentAnalyzer;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.stereotype.Component;
+import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -19,20 +22,32 @@ import java.util.concurrent.TimeoutException;
* @date 2025-11-20
*
* 🔧 死锁修复说明:
- * 1. 原问题:UserAgent解析库在持有缓存锁时写日志,导致死锁
- * 2. 解决方案:异步解析 + 超时降级
- * 3. 超时时间:200ms(可配置)
- * 4. 降级策略:超时返回"Unknown"
+ * 1. 原问题:yauaa库在持有缓存锁时写日志,导致死锁
+ * 2. 解决方案1:异步解析 + 超时降级
+ * 3. 解决方案2:更换为Browscap Java库(无日志依赖,线程安全)
+ * 4. 超时时间:200ms(可配置)
+ * 5. 降级策略:超时返回"Unknown"
+ *
+ * 📝 2025-12-29更新:
+ * - 从yauaa更换为Browscap Java
+ * - Browscap优势:性能更好(~2ms)、活跃维护、无日志依赖问题
*/
@Slf4j
@Component
public class UserAgentUtil {
- private static final UserAgentAnalyzer USER_AGENT_ANALYZER = UserAgentAnalyzer
- .newBuilder()
- .hideMatcherLoadStats()
- .withCache(10000)
- .build();
+ private static final UserAgentParser USER_AGENT_PARSER;
+
+ static {
+ try {
+ // 初始化Browscap解析器(使用默认配置)
+ USER_AGENT_PARSER = new UserAgentService().loadParser();
+ log.info("Browscap UserAgent解析器初始化成功");
+ } catch (IOException | ParseException e) {
+ log.error("Browscap UserAgent解析器初始化失败", e);
+ throw new RuntimeException("Failed to initialize Browscap UserAgent parser", e);
+ }
+ }
/**
* UserAgent解析专用线程池
@@ -85,7 +100,7 @@ public class UserAgentUtil {
/**
* 同步解析User-Agent信息(内部方法)
*
- * ⚠️ 此方法可能导致死锁,仅供内部使用
+ * ⚠️ 此方法可能耗时,仅供内部使用
* ⚠️ 外部调用请使用 parseUserAgentAsync()
*
* @param userAgentString User-Agent字符串
@@ -93,14 +108,15 @@ public class UserAgentUtil {
*/
private UserAgentInfo parseUserAgentSync(String userAgentString) {
try {
- UserAgent userAgent = USER_AGENT_ANALYZER.parse(userAgentString);
+ // 使用Browscap解析User-Agent
+ Capabilities capabilities = USER_AGENT_PARSER.parse(userAgentString);
return UserAgentInfo.builder()
- .browser(getBrowserName(userAgent))
- .browserVersion(userAgent.getValue(UserAgent.AGENT_VERSION))
- .os(getOperatingSystem(userAgent))
- .osVersion(userAgent.getValue(UserAgent.OPERATING_SYSTEM_VERSION))
- .deviceType(userAgent.getValue(UserAgent.DEVICE_CLASS))
+ .browser(getBrowserName(capabilities))
+ .browserVersion(capabilities.getBrowserMajorVersion())
+ .os(getOperatingSystem(capabilities))
+ .osVersion(capabilities.getPlatformVersion())
+ .deviceType(capabilities.getDeviceType())
.build();
} catch (Exception e) {
log.warn("解析User-Agent失败: {}", userAgentString, e);
@@ -111,7 +127,7 @@ public class UserAgentUtil {
/**
* 解析User-Agent信息(兼容旧代码)
*
- * ⚠️ 已废弃:此方法可能导致死锁
+ * ⚠️ 已废弃:建议使用异步方法
* ⚠️ 请使用 parseUserAgentAsync() 替代
*
* @param userAgentString User-Agent字符串
@@ -174,71 +190,39 @@ public class UserAgentUtil {
/**
* 获取浏览器名称
*/
- private String getBrowserName(UserAgent userAgent) {
- String agentName = userAgent.getValue(UserAgent.AGENT_NAME);
- String agentVersion = userAgent.getValue(UserAgent.AGENT_VERSION);
+ private String getBrowserName(Capabilities capabilities) {
+ String browser = capabilities.getBrowser();
+ String version = capabilities.getBrowserMajorVersion();
- if ("Unknown".equals(agentName)) {
+ if (browser == null || browser.isEmpty() || "Unknown".equals(browser)) {
return "Unknown";
}
// 返回浏览器名称 + 主版本号
- if (agentVersion != null && !agentVersion.isEmpty() && !"Unknown".equals(agentVersion)) {
- String majorVersion = agentVersion.split("\\.")[0];
- return agentName + " " + majorVersion;
+ if (version != null && !version.isEmpty() && !"Unknown".equals(version)) {
+ return browser + " " + version;
}
- return agentName;
+ return browser;
}
/**
* 获取操作系统名称
*/
- private String getOperatingSystem(UserAgent userAgent) {
- String osName = userAgent.getValue(UserAgent.OPERATING_SYSTEM_NAME);
- String osVersion = userAgent.getValue(UserAgent.OPERATING_SYSTEM_VERSION);
+ private String getOperatingSystem(Capabilities capabilities) {
+ String platform = capabilities.getPlatform();
+ String version = capabilities.getPlatformVersion();
- if ("Unknown".equals(osName)) {
+ if (platform == null || platform.isEmpty() || "Unknown".equals(platform)) {
return "Unknown";
}
- // Windows NT 版本号转换为友好名称
- if ("Windows NT".equals(osName) && osVersion != null && !osVersion.isEmpty()) {
- return convertWindowsNTVersion(osVersion);
- }
-
// 返回操作系统名称 + 版本
- if (osVersion != null && !osVersion.isEmpty() && !"Unknown".equals(osVersion)) {
- return osName + " " + osVersion;
+ if (version != null && !version.isEmpty() && !"Unknown".equals(version)) {
+ return platform + " " + version;
}
- return osName;
- }
-
- /**
- * 将Windows NT版本号转换为用户友好的显示名称
- */
- private String convertWindowsNTVersion(String ntVersion) {
- switch (ntVersion) {
- case "10.0":
- return "Windows 10/11"; // Windows 10 和 11 都是 NT 10.0
- case "6.3":
- return "Windows 8.1";
- case "6.2":
- return "Windows 8";
- case "6.1":
- return "Windows 7";
- case "6.0":
- return "Windows Vista";
- case "5.2":
- return "Windows Server 2003";
- case "5.1":
- return "Windows XP";
- case "5.0":
- return "Windows 2000";
- default:
- return "Windows NT " + ntVersion; // 未知版本保持原样
- }
+ return platform;
}
/**
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java
index c177df40..b155b2b5 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/system/api/RoleApiController.java
@@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.data.domain.Page;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -27,23 +28,23 @@ public class RoleApiController extends BaseController create(RoleDTO dto) {
+ public Response create(@Validated @RequestBody RoleDTO dto) {
return super.create(dto);
}
@Override
- public Response update(Long aLong, RoleDTO dto) {
- return super.update(aLong, dto);
+ public Response update(@PathVariable Long id, @Validated @RequestBody RoleDTO dto) {
+ return super.update(id, dto);
}
@Override
- public Response delete(Long aLong) {
- return super.delete(aLong);
+ public Response delete(@PathVariable Long id) {
+ return super.delete(id);
}
@Override
- public Response findById(Long aLong) {
- return super.findById(aLong);
+ public Response findById(@PathVariable Long id) {
+ return super.findById(id);
}
@Override
diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java
index 619a004b..06a12b6e 100644
--- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java
+++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/FormDataApiController.java
@@ -12,6 +12,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -33,23 +34,23 @@ public class FormDataApiController extends BaseController create(FormDataDTO dto) {
+ public Response create(@Validated @RequestBody FormDataDTO dto) {
return super.create(dto);
}
@Override
- public Response update(Long aLong, FormDataDTO dto) {
- return super.update(aLong, dto);
+ public Response update(@PathVariable Long id, @Validated @RequestBody FormDataDTO dto) {
+ return super.update(id, dto);
}
@Override
- public Response delete(Long aLong) {
- return super.delete(aLong);
+ public Response delete(@PathVariable Long id) {
+ return super.delete(id);
}
@Override
- public Response findById(Long aLong) {
- return super.findById(aLong);
+ public Response findById(@PathVariable Long id) {
+ return super.findById(id);
}
@Override
diff --git a/backend/src/main/resources/db/changelog/init/v1.0.0-data.sql b/backend/src/main/resources/db/changelog/init/v1.0.0-data.sql
index 27d19c83..464bc317 100644
--- a/backend/src/main/resources/db/changelog/init/v1.0.0-data.sql
+++ b/backend/src/main/resources/db/changelog/init/v1.0.0-data.sql
@@ -668,7 +668,8 @@ INSERT INTO `deploy-ease-platform`.`workflow_definition` (`id`, `name`, `key`, `
-- --------------------------------------------------------------------------------------
INSERT INTO `deploy-ease-platform`.`deploy_application_category` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `code`, `name`, `description`, `icon`, `enabled`, `sort`) VALUES (1, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'DL-SCP', '需求计划', '', '', b'1', 0);
INSERT INTO `deploy-ease-platform`.`deploy_application_category` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `code`, `name`, `description`, `icon`, `enabled`, `sort`) VALUES (2, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'SZ-ISCP', '供应计划', '', '', b'1', 0);
-INSERT INTO `deploy-ease-platform`.`deploy_application_category` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `code`, `name`, `description`, `icon`, `enabled`, `sort`) VALUES (3, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 'OMS-ORDER', '订单', '', '', b'1', 0);
+INSERT INTO `deploy-ease-platform`.`deploy_application_category` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `code`, `name`, `description`, `icon`, `enabled`, `sort`) VALUES (3, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'OMS-ORDER', '订单', '', '', b'1', 0);
+INSERT INTO `deploy-ease-platform`.`deploy_application_category` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `code`, `name`, `description`, `icon`, `enabled`, `sort`) VALUES (4, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'OMS-ORDER-HP', '订单豪鹏项目', '', '', b'1', 0);
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (1, 'scp-meta', '元数据', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
@@ -685,14 +686,14 @@ INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (12, 'scp-process', 'scp-process', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (13, 'scp-service-manager', 'scp-service-manager', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (14, 'scp-customization-engine', 'scp-customization-engine', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (15, 'themetis-engine', 'themetis-engine', '', 0, 2, b'1', 0, 'dengqichen', NOW(), 'dengqichen', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (15, 'themetis-engine', 'themetis-engine', '', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (16, 'themetis-scheduler', 'themetis-scheduler', '', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (17, 'scp-xxl-job', 'scp-xxl-job', '', 0, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (18, 'stone-message-center', 'stone-message-center', '', 0, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (19, 'scp-order', 'scp-order', '', 0, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (20, 'datax-admin', 'datax-admin', '', 0, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (21, 'scp-algorithm', 'scp-algorithm', '', 0, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (22, 'scp-forecast-model', 'scp-forecast-model', '', 2, 1, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (17, 'scp-xxl-job', 'scp-xxl-job', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (18, 'stone-message-center', 'stone-message-center', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (19, 'scp-order', 'scp-order', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (20, 'datax-admin', 'datax-admin', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (21, 'scp-algorithm', 'scp-algorithm', '', 0, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (22, 'scp-forecast-model', 'scp-forecast-model', '', 2, 1, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (23, 'etl-ignite-server', 'etl-ignite-server', '内存数据库', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (24, 'etl-integration-ui-server', 'etl-integration-ui-server', 'UI server', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (25, 'etl-executor', 'etl-executor', 'etl执行器', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
@@ -700,26 +701,61 @@ INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (27, 'themetis-control-panel-server', 'themetis-control-panel-server', '控制台', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (28, 'themetis-permission-server', 'themetis-permission-server', '权限系统', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (29, 'themetis-gateway', 'themetis-gateway', '网关', 0, 2, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (30, 'lianyu-oms-admin', 'lianyu-oms-admin', 'oms2.0-后台管理服务', 0, 3, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 2, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (31, 'lianyu-oms-gateway', 'lianyu-oms-gateway', 'oms2.0-网关服务', 0, 3, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 2, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (32, 'lianyu-oms-job', 'lianyu-oms-job', 'oms2.0-定时任务', 0, 3, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 2, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (33, 'lianyu-oms-main', 'lianyu-oms-main', 'oms2.0-主业务', 0, 3, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (34, 'lianyu-oms-web', 'lianyu-oms-web', 'oms2.0-前端', 0, 3, b'1', 0, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (30, 'lianyu-oms-admin', 'lianyu-oms-admin', 'oms2.0-后台管理服务', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (31, 'lianyu-oms-gateway', 'lianyu-oms-gateway', 'oms2.0-网关服务', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (32, 'lianyu-oms-job', 'lianyu-oms-job', 'oms2.0-定时任务', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (33, 'lianyu-oms-main', 'lianyu-oms-main', 'oms2.0-主业务', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (34, 'lianyu-oms-web', 'lianyu-oms-web', 'oms2.0-前端', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (35, 'service-lianyu-oms-api', 'service-lianyu-oms-api', '链宇OMS 2.0 基础包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (36, 'service-lianyu-oms-cir', 'service-lianyu-oms-cir', '链宇OMS 2.0 要货需求jar包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (37, 'service-lianyu-oms-cpq', 'service-lianyu-oms-cpq', '链宇OMS 2.0 cpq的jar包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (38, 'service-lianyu-oms-ioa', 'service-lianyu-oms-ioa', '链宇OMS 2.0 要货需求jar包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (39, 'service-lianyu-oms-mdm', 'service-lianyu-oms-mdm', '链宇OMS 2.0 要货需求jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (40, 'service-lianyu-oms-oam', 'service-lianyu-oms-oam', '链宇OMS 2.0 要货需求jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (41, 'service-lianyu-oms-oct', 'service-lianyu-oms-oct', '链宇OMS 2.0 要货需求jar包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (42, 'service-lianyu-oms-orm', 'service-lianyu-oms-orm', '链宇OMS 2.0 要货需求jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (43, 'service-lianyu-oms-osp', 'service-lianyu-oms-osp', '链宇OMS 2.0 要货需求jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (44, 'service-lianyu-oms-otm', 'service-lianyu-oms-otm', '链宇OMS 2.0 关联交易jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (45, 'service-lianyu-oms-sso', 'service-lianyu-oms-sso', '链宇OMS 2.0 系统服务包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (46, 'service-lianyu-oms-sys', 'service-lianyu-oms-sys', '链宇OMS 2.0 系统服务包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (47, 'service-lianyu-oms-wop', 'service-lianyu-oms-wop', '链宇OMS 2.0 要货需求jar包', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (48, 'tools-lianyu-oms-base', 'tools-lianyu-oms-base', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (49, 'tools-lianyu-oms-config', 'tools-lianyu-oms-config', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (50, 'tools-lianyu-oms-core', 'tools-lianyu-oms-core', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (51, 'tools-lianyu-oms-entity', 'tools-lianyu-oms-entity', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (52, 'tools-lianyu-oms-model', 'tools-lianyu-oms-model', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (53, 'tools-lianyu-oms-parent', 'tools-lianyu-oms-parent', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (54, 'tools-lianyu-oms-task', 'tools-lianyu-oms-task', '链宇OMS 2.0 基础包\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (55, 'lianyu-oms-jenkins', 'lianyu-oms-jenkins', '链宇OMS 2.0 标准产品统一环境\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (56, 'lianyu-oms-nacos', 'lianyu-oms-nacos', 'Nacos集群环境配置\n', 0, 3, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (57, 'hp-lianyu-oms-datahub', 'hp-lianyu-oms-datahub', 'OMS 2.0 集成服务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (58, 'hp-lianyu-oms-front', 'hp-lianyu-oms-front', 'OMS2.0 豪鹏开发环境前端服务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (59, 'hp-lianyu-oms-gateway', 'hp-lianyu-oms-gateway', 'OMS 2.0 豪鹏开发环境网关服务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (60, 'hp-lianyu-oms-job', 'hp-lianyu-oms-job', 'OMS 2.0 豪鹏开发环境定时任务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (61, 'hp-lianyu-oms-main', 'hp-lianyu-oms-main', 'OMS 2.0 主业务服务任务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (62, 'hp-lianyu-oms-starter', 'hp-lianyu-oms-starter', 'OMS 2.0 主查询服务', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (63, 'hp-lianyu-oms-system', 'hp-lianyu-oms-system', 'OMS 2.0', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 2, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (64, 'hp-tools-lianyu-oms-admin', 'hp-tools-lianyu-oms-admin', '豪鹏工具后台管理服务,提供用户权限、菜单、资源等接口信息。', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (65, 'hp-tools-lianyu-oms-base', 'hp-tools-lianyu-oms-base', '豪鹏基础jar包。', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (66, 'hp-tools-lianyu-oms-core', 'hp-tools-lianyu-oms-core', '豪鹏工具核心包。', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (67, 'hp-tools-lianyu-oms-datacenter', 'hp-tools-lianyu-oms-datacenter', '豪鹏基础类包。', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_application` (`id`, `app_code`, `app_name`, `app_desc`, `language`, `application_category_id`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (68, 'hp-tools-lianyu-oms-parent', 'hp-tools-lianyu-oms-parent', '豪鹏父类包。\n', 0, 4, b'1', 0, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (1, NULL, 'LONGI-DEV', '隆基DEV', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 2, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (2, NULL, 'LONGI-UAT', '隆基UAT', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 3, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (5, NULL, 'LOCALIZATION_DEV', '国产化DEV', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (6, NULL, 'DEMO1', 'DEMO1', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (7, NULL, 'CONVERGENCE', '融合环境', '', b'1', 1, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (8, NULL, 'OMS2.0-TEST', '订单2.0测试环境', NULL, b'1', 1, 'songwei', NOW(), 'songwei', NOW(), 1, b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (9, NULL, 'OMS2.0-PROD', '订单2.0生产环境', NULL, b'1', 1, 'songwei', NOW(), 'songwei', NOW(), 3, b'0');
-
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (7, NULL, 'CONVERGENCE', '融合环境', '', b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (8, NULL, 'OMS2.0-TEST', '订单2.0测试环境', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (9, NULL, 'OMS2.0-PROD', '订单2.0生产环境', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 3, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (10, NULL, 'OMS2.0-HP', '订单2.0豪鹏环境', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (11, NULL, 'OMS2.0-HP-DEV', '订单2.0郝鹏dev环境', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_environment` (`id`, `tenant_code`, `env_code`, `env_name`, `env_desc`, `enabled`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`) VALUES (12, NULL, 'OMS2.0-HP-UPDATE', '订单2.0郝鹏开发环境', NULL, b'1', 1, 'admin', NOW(), 'admin', NOW(), 1, b'0');
INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (3, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'DP_SCP', '需求计划', '', 1, '超级管理员', b'1', 0, 'STANDARD', b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (4, 'admin', NOW(), 'admin', NOW(), 2, b'0', 'DL_SCP_LONGI', '隆基项目', '', 1, '超级管理员', b'1', 0, 'SYNC_MODE', b'1');
-INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (5, 'admin', NOW(), 'admin', NOW(), 3, b'0', 'LOCALIZATION', '国产化改造', '', 1, '超级管理员', b'1', 0, 'STANDARD', b'0');
-INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (7, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 'OMS-ORDER', '订单', '', 1, '超级管理员', b'1', 0, 'STANDARD', b'0');
-
+INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (4, 'admin', NOW(), 'admin', NOW(), 3, b'0', 'DL_SCP_LONGI', '隆基项目', '', 6, '盛泽强', b'1', 0, 'SYNC_MODE', b'1');
+INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (5, 'admin', NOW(), 'admin', NOW(), 4, b'0', 'LOCALIZATION', '国产化改造', '', 11, '邓骐辰', b'1', 0, 'STANDARD', b'0');
+INSERT INTO `deploy-ease-platform`.`deploy_team` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_code`, `team_name`, `description`, `owner_id`, `owner_name`, `enabled`, `sort`, `development_mode`, `enable_git_sync_check`) VALUES (7, 'admin', NOW(), 'admin', NOW(), 1, b'0', 'OMS-ORDER', '订单', '', 1, '超级管理员', b'1', 0, 'STANDARD', b'0');
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (25, 'admin', NOW(), 'admin', NOW(), 1, b'0', 5, 5, '汤峰岷', '', NOW());
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (26, 'admin', NOW(), 'admin', NOW(), 1, b'0', 5, 11, '邓骐辰', '', NOW());
@@ -733,15 +769,16 @@ INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `cre
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (34, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 5, '汤峰岷', '', NOW());
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (35, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 5, '汤峰岷', '', NOW());
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (36, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 11, '邓骐辰', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (37, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 3, 14, '宋伟', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (38, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 4, 14, '宋伟', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (37, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 14, '宋伟', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (38, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 14, '宋伟', '', NOW());
INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (39, 'admin', NOW(), 'admin', NOW(), 1, b'0', 5, 15, '路宽', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (40, 'dengqichen', NOW(), 'dengqichen', NOW(), 1, b'0', 7, 11, '邓骐辰', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (41, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 7, 14, '宋伟', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (42, 'yangfan', NOW(), 'yangfan', NOW(), 1, b'0', 5, 16, '杨帆', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (43, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 3, 16, '杨帆', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (44, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 3, 10, '马也', '', NOW());
-INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (45, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 3, 12, '王栋柱', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (40, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 11, '邓骐辰', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (41, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 14, '宋伟', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (42, 'admin', NOW(), 'admin', NOW(), 1, b'0', 5, 16, '杨帆', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (43, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 16, '杨帆', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (44, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 10, '马也', '', NOW());
+INSERT INTO `deploy-ease-platform`.`deploy_team_member` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `user_id`, `user_name`, `role_in_team`, `join_time`) VALUES (45, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 12, '王栋柱', '', NOW());
+
INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (2, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 2, 2, 'JENKINS', 2, 497, 'release/1.4.0', 4, 401, 'release/1.4.1', 3, 'ibp-uat-scp-longi-module', 1, 'K8S', 8, 'ibp-uat', 'backend-longi-scp-longi-module-group-1-v1', NULL, NULL, NULL, NULL);
INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (9, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 1, 2, 'JENKINS', 4, 413, 'release/1.4.0', NULL, NULL, NULL, 3, 'ibp-uat-scp-meta', 1, 'K8S', 8, 'ibp-uat', 'backend-longi-scp-meta-group-1-v4', NULL, NULL, NULL, NULL);
@@ -815,20 +852,24 @@ INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`,
INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (97, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 32, 9, 'JENKINS', 2, 703, 'prod', NULL, NULL, NULL, 1, 'prod-lianyu-oms-job', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (98, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 31, 9, 'JENKINS', 2, 691, 'prod', NULL, NULL, NULL, 1, 'prod-lianyu-oms-gateway', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (99, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 30, 9, 'JENKINS', 2, 704, 'prod', NULL, NULL, NULL, 1, 'prod-lianyu-oms-admin', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `deploy-ease-platform`.`deploy_team_application` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `application_id`, `environment_id`, `build_type`, `source_git_system_id`, `source_git_project_id`, `source_branch`, `target_git_system_id`, `target_git_project_id`, `target_branch`, `deploy_system_id`, `deploy_job`, `workflow_definition_id`, `runtime_type`, `k8s_system_id`, `k8s_namespace_name`, `k8s_deployment_name`, `docker_server_id`, `docker_container_name`, `server_id`, `log_query_command`) VALUES (100, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 56, 10, 'JENKINS', NULL, NULL, '', NULL, NULL, NULL, 1, 'lianyu-oms-nacos', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (8, 'admin', NOW(), 'admin', NOW(), 1, b'0', 5, 5, b'0', NULL, b'0', '');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (9, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 1, b'0', NULL, b'0', '');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (10, 'admin', NOW(), 'admin', NOW(), 1, b'0', 4, 2, b'1', '[6]', b'0', '');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (11, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 6, b'0', NULL, b'0', '');
-INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (12, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 3, 7, b'0', NULL, b'0', '');
-INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (13, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 7, 8, b'0', NULL, b'0', '');
-INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (14, 'songwei', NOW(), 'songwei', NOW(), 1, b'0', 7, 9, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (12, 'admin', NOW(), 'admin', NOW(), 1, b'0', 3, 7, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (13, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 8, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (14, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 9, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (15, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 12, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (16, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 11, b'0', NULL, b'0', '');
+INSERT INTO `deploy-ease-platform`.`deploy_team_environment_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `approval_required`, `approver_user_ids`, `require_code_review`, `remark`) VALUES (17, 'admin', NOW(), 'admin', NOW(), 1, b'0', 7, 10, b'0', NULL, b'0', '');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_notification_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `notification_channel_id`, `pre_approval_notification_enabled`, `pre_approval_notification_template_id`, `build_notification_enabled`, `build_notification_template_id`, `build_failure_file_enabled`) VALUES (7, 'admin', NOW(), 'admin', NOW(), 2, b'0', 5, 5, 3, b'0', NULL, b'1', 9, b'1');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_notification_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `notification_channel_id`, `pre_approval_notification_enabled`, `pre_approval_notification_template_id`, `build_notification_enabled`, `build_notification_template_id`, `build_failure_file_enabled`) VALUES (8, 'admin', NOW(), 'admin', NOW(), 2, b'0', 4, 2, 4, b'0', NULL, b'1', 8, b'1');
INSERT INTO `deploy-ease-platform`.`deploy_team_environment_notification_config` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `version`, `deleted`, `team_id`, `environment_id`, `notification_channel_id`, `pre_approval_notification_enabled`, `pre_approval_notification_template_id`, `build_notification_enabled`, `build_notification_template_id`, `build_failure_file_enabled`) VALUES (9, 'admin', NOW(), 'admin', NOW(), 2, b'0', 4, 1, 4, b'0', NULL, b'1', 8, b'1');
-
-- --------------------------------------------------------------------------------------
-- 初始化通知渠道数据
-- --------------------------------------------------------------------------------------
diff --git a/backend/src/main/resources/db/changelog/sql/20251209141300-01.sql b/backend/src/main/resources/db/changelog/sql/20251209141300-01.sql
index 3cb7a84b..3202f287 100644
--- a/backend/src/main/resources/db/changelog/sql/20251209141300-01.sql
+++ b/backend/src/main/resources/db/changelog/sql/20251209141300-01.sql
@@ -12,15 +12,9 @@ INSERT INTO system_release (
)
VALUES (
'system', NOW(), 'system', NOW(), 1, 0,
- 1.43, 'ALL', NOW(),
+ 1.45, 'ALL', NOW(),
'【后端】
-- 优化cleanupSession()方法,先关闭Shell输入输出流强制中断阻塞的read操作
-- 增强readSSHOutput()和readSSHError()的异常处理和线程中断检查
- 【前端】
-- 修改类型定义(types.ts),将k8sNamespaceId: number和k8sDeploymentId: number改为k8sNamespaceName: string和k8sDeploymentName: string
-- 更新K8sRuntimeConfig组件,改为基于name进行选择和匹配,通过namespaceName查找对应的namespace ID来加载Deployment列表
-- 调整RuntimeConfigSection和TeamApplicationDialog组件的props传递和表单数据结构,确保使用name字段进行数据绑定和提交
-- 同步更新TeamApplicationManageDialog的保存逻辑,向后端提交name字段而非ID
+- 应用分页接口新增 enabledCount 和 disabledCount 统计字段,与 totalElements 同级返回。前端可在响应的 data 对象中直接获取这两个字段,用于展示已启用和已禁用应用的总数统计。
',
0, NULL, NULL, 0
);