diff --git a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/integration/IntegrationCatalogController.java b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/integration/IntegrationCatalogController.java
index 40990e3..b597711 100644
--- a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/integration/IntegrationCatalogController.java
+++ b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/integration/IntegrationCatalogController.java
@@ -1,14 +1,21 @@
package cn.craftlabs.platform.api.integration;
import cn.craftlabs.platform.api.service.IntegrationCatalogService;
+import cn.craftlabs.platform.api.web.dto.IntegrationEnvironmentRequest;
import cn.craftlabs.platform.api.web.dto.IntegrationEnvironmentResponse;
import cn.craftlabs.platform.api.web.dto.PageResponse;
+import cn.craftlabs.platform.api.web.dto.ProductLineRequest;
import cn.craftlabs.platform.api.web.dto.ProductLineResponse;
+import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -49,4 +56,36 @@ public class IntegrationCatalogController {
public IntegrationEnvironmentResponse getEnvironment(@PathVariable("id") long id) {
return integrationCatalogService.getEnvironment(id);
}
+
+ @PostMapping("/environments")
+ public IntegrationEnvironmentResponse createEnvironment(@Valid @RequestBody IntegrationEnvironmentRequest body) {
+ return integrationCatalogService.createEnvironment(body);
+ }
+
+ @PutMapping("/environments/{id}")
+ public IntegrationEnvironmentResponse updateEnvironment(
+ @PathVariable("id") long id, @Valid @RequestBody IntegrationEnvironmentRequest body) {
+ return integrationCatalogService.updateEnvironment(id, body);
+ }
+
+ @DeleteMapping("/environments/{id}")
+ public void deleteEnvironment(@PathVariable("id") long id) {
+ integrationCatalogService.deleteEnvironment(id);
+ }
+
+ @PostMapping("/product-lines")
+ public ProductLineResponse createProductLine(@Valid @RequestBody ProductLineRequest body) {
+ return integrationCatalogService.createProductLine(body);
+ }
+
+ @PutMapping("/product-lines/{id}")
+ public ProductLineResponse updateProductLine(
+ @PathVariable("id") long id, @Valid @RequestBody ProductLineRequest body) {
+ return integrationCatalogService.updateProductLine(id, body);
+ }
+
+ @DeleteMapping("/product-lines/{id}")
+ public void deleteProductLine(@PathVariable("id") long id) {
+ integrationCatalogService.deleteProductLine(id);
+ }
}
diff --git a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/IntegrationCatalogService.java b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/IntegrationCatalogService.java
index 7e6b598..e8c773b 100644
--- a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/IntegrationCatalogService.java
+++ b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/service/IntegrationCatalogService.java
@@ -4,8 +4,10 @@ import cn.craftlabs.platform.api.persistence.integration.PlatformIntegrationEnvi
import cn.craftlabs.platform.api.persistence.integration.PlatformIntegrationEnvironmentMapper;
import cn.craftlabs.platform.api.persistence.integration.PlatformProductLine;
import cn.craftlabs.platform.api.persistence.integration.PlatformProductLineMapper;
+import cn.craftlabs.platform.api.web.dto.IntegrationEnvironmentRequest;
import cn.craftlabs.platform.api.web.dto.IntegrationEnvironmentResponse;
import cn.craftlabs.platform.api.web.dto.PageResponse;
+import cn.craftlabs.platform.api.web.dto.ProductLineRequest;
import cn.craftlabs.platform.api.web.dto.ProductLineResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -70,6 +72,72 @@ public class IntegrationCatalogService {
return toEnvironment(row);
}
+ @Transactional
+ public ProductLineResponse createProductLine(ProductLineRequest req) {
+ PlatformProductLine row = new PlatformProductLine();
+ row.setCode(req.getCode());
+ row.setName(req.getName());
+ row.setDescription(req.getDescription());
+ row.setEnabled(req.getEnabled() != null ? req.getEnabled() : Boolean.TRUE);
+ productLineMapper.insert(row);
+ return toProductLine(row);
+ }
+
+ @Transactional
+ public ProductLineResponse updateProductLine(long id, ProductLineRequest req) {
+ PlatformProductLine row = productLineMapper.selectById(id);
+ if (row == null) {
+ throw new ResponseStatusException(HttpStatus.NOT_FOUND, "product line not found");
+ }
+ row.setCode(req.getCode());
+ row.setName(req.getName());
+ row.setDescription(req.getDescription());
+ row.setEnabled(req.getEnabled() != null ? req.getEnabled() : Boolean.TRUE);
+ productLineMapper.updateById(row);
+ return toProductLine(row);
+ }
+
+ @Transactional
+ public void deleteProductLine(long id) {
+ if (productLineMapper.selectById(id) == null) {
+ throw new ResponseStatusException(HttpStatus.NOT_FOUND, "product line not found");
+ }
+ productLineMapper.deleteById(id);
+ }
+
+ @Transactional
+ public IntegrationEnvironmentResponse createEnvironment(IntegrationEnvironmentRequest req) {
+ PlatformIntegrationEnvironment row = new PlatformIntegrationEnvironment();
+ row.setCode(req.getCode());
+ row.setName(req.getName());
+ row.setBitanswerBaseUrl(req.getBitanswerBaseUrl());
+ row.setKind(req.getKind());
+ environmentMapper.insert(row);
+ return toEnvironment(row);
+ }
+
+ @Transactional
+ public IntegrationEnvironmentResponse updateEnvironment(long id, IntegrationEnvironmentRequest req) {
+ PlatformIntegrationEnvironment row = environmentMapper.selectById(id);
+ if (row == null) {
+ throw new ResponseStatusException(HttpStatus.NOT_FOUND, "integration environment not found");
+ }
+ row.setCode(req.getCode());
+ row.setName(req.getName());
+ row.setBitanswerBaseUrl(req.getBitanswerBaseUrl());
+ row.setKind(req.getKind());
+ environmentMapper.updateById(row);
+ return toEnvironment(row);
+ }
+
+ @Transactional
+ public void deleteEnvironment(long id) {
+ if (environmentMapper.selectById(id) == null) {
+ throw new ResponseStatusException(HttpStatus.NOT_FOUND, "integration environment not found");
+ }
+ environmentMapper.deleteById(id);
+ }
+
private ProductLineResponse toProductLine(PlatformProductLine row) {
ProductLineResponse r = new ProductLineResponse();
r.setId(row.getId());
diff --git a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/IntegrationEnvironmentRequest.java b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/IntegrationEnvironmentRequest.java
new file mode 100644
index 0000000..594283e
--- /dev/null
+++ b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/IntegrationEnvironmentRequest.java
@@ -0,0 +1,54 @@
+package cn.craftlabs.platform.api.web.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+
+public class IntegrationEnvironmentRequest {
+
+ @NotBlank
+ @Size(max = 64)
+ private String code;
+
+ @NotBlank
+ @Size(max = 256)
+ private String name;
+
+ @Size(max = 512)
+ private String bitanswerBaseUrl;
+
+ @NotBlank
+ @Size(max = 16)
+ private String kind;
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getBitanswerBaseUrl() {
+ return bitanswerBaseUrl;
+ }
+
+ public void setBitanswerBaseUrl(String bitanswerBaseUrl) {
+ this.bitanswerBaseUrl = bitanswerBaseUrl;
+ }
+
+ public String getKind() {
+ return kind;
+ }
+
+ public void setKind(String kind) {
+ this.kind = kind;
+ }
+}
diff --git a/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/ProductLineRequest.java b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/ProductLineRequest.java
new file mode 100644
index 0000000..8809a89
--- /dev/null
+++ b/services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/ProductLineRequest.java
@@ -0,0 +1,52 @@
+package cn.craftlabs.platform.api.web.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+
+public class ProductLineRequest {
+
+ @NotBlank
+ @Size(max = 64)
+ private String code;
+
+ @NotBlank
+ @Size(max = 256)
+ private String name;
+
+ @Size(max = 1024)
+ private String description;
+
+ private Boolean enabled;
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Boolean getEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(Boolean enabled) {
+ this.enabled = enabled;
+ }
+}
diff --git a/web/delivery-platform-ui/src/api/platform.js b/web/delivery-platform-ui/src/api/platform.js
index f5c2439..f26fb57 100644
--- a/web/delivery-platform-ui/src/api/platform.js
+++ b/web/delivery-platform-ui/src/api/platform.js
@@ -274,6 +274,18 @@ export function getIntegrationEnvironment(id) {
return axios.get(`/api/v1/integration/environments/${id}`);
}
+export function createIntegrationEnvironment(body) {
+ return axios.post("/api/v1/integration/environments", body);
+}
+
+export function updateIntegrationEnvironment(id, body) {
+ return axios.put(`/api/v1/integration/environments/${id}`, body);
+}
+
+export function deleteIntegrationEnvironment(id) {
+ return axios.delete(`/api/v1/integration/environments/${id}`);
+}
+
/**
* @param {{ page?: number, size?: number }} params
*/
@@ -288,6 +300,18 @@ export function getProductLine(id) {
return axios.get(`/api/v1/integration/product-lines/${id}`);
}
+export function createProductLine(body) {
+ return axios.post("/api/v1/integration/product-lines", body);
+}
+
+export function updateProductLine(id, body) {
+ return axios.put(`/api/v1/integration/product-lines/${id}`, body);
+}
+
+export function deleteProductLine(id) {
+ return axios.delete(`/api/v1/integration/product-lines/${id}`);
+}
+
// —— M7 设备管理 ————————————————————————————
export function listDevices(params) {
return axios.get('/api/v1/devices', { params });
diff --git a/web/delivery-platform-ui/src/views/IntegrationEnvironmentsView.vue b/web/delivery-platform-ui/src/views/IntegrationEnvironmentsView.vue
index cfc75b9..ca6bf0f 100644
--- a/web/delivery-platform-ui/src/views/IntegrationEnvironmentsView.vue
+++ b/web/delivery-platform-ui/src/views/IntegrationEnvironmentsView.vue
@@ -3,7 +3,10 @@
@@ -17,6 +20,12 @@