From d0783aa8936c2c279b579bf66c7b21a85e830c06 Mon Sep 17 00:00:00 2001 From: huangping Date: Mon, 25 May 2026 01:15:56 +0800 Subject: [PATCH] feat(m6): add CRUD dialogs for environments and product lines --- .../IntegrationCatalogController.java | 39 +++++ .../service/IntegrationCatalogService.java | 68 +++++++++ .../dto/IntegrationEnvironmentRequest.java | 54 +++++++ .../api/web/dto/ProductLineRequest.java | 52 +++++++ web/delivery-platform-ui/src/api/platform.js | 24 +++ .../src/views/IntegrationEnvironmentsView.vue | 141 +++++++++++++++++- .../src/views/IntegrationProductLinesView.vue | 136 ++++++++++++++++- 7 files changed, 506 insertions(+), 8 deletions(-) create mode 100644 services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/IntegrationEnvironmentRequest.java create mode 100644 services/delivery-platform-api/src/main/java/cn/craftlabs/platform/api/web/dto/ProductLineRequest.java 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 @@ + + +
@@ -31,23 +40,68 @@ @size-change="onSizeChange" />
+ + + + + + + + + + + + + + + + + + + + + +