diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java index 2b55d246..d3c15f5f 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java @@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.product.ProductAddReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; import cn.axzo.tyr.client.model.product.ProductSearchListReq; import cn.axzo.tyr.client.model.product.ProductSearchPageReq; @@ -18,7 +19,6 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; -import java.util.Map; /** * 产品相关 API @@ -92,4 +92,11 @@ public interface ProductApi { @PostMapping("api/auth/product/feature/relation/list") ApiResult> featureList(@Validated @RequestBody ProductFeatureRelationSearchReq req); + /** + * 更新产品与权限点的关联关系 + * + * @param req {@link ProductFeatureRelationUpdateReq} + * @return + */ + ApiResult updateFeatureRelation(List req); } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java new file mode 100644 index 00000000..d1e0b95e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java @@ -0,0 +1,40 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +/** + * 产品与权限点关系修改入参模型 + * + * @author wangli + * @since 2023/9/7 18:53 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ProductFeatureRelationUpdateReq { + + /** + * 产品 ID + */ + @NotNull(message = "产品 ID 不能为空") + private Long productModuleId; + + /** + * 字典第三级 Code ID(OuType) + */ + @NotNull(message = "字典 ouType ID 不能为空") + private Long dictCodeId; + + /** + * 权限点 ID + */ + private List featureIds = new ArrayList<>(); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java index f6f7495a..a0302790 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java @@ -5,6 +5,7 @@ import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.ProductApi; import cn.axzo.tyr.client.model.product.ProductAddReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; import cn.axzo.tyr.client.model.product.ProductSearchListReq; import cn.axzo.tyr.client.model.product.ProductSearchPageReq; @@ -14,6 +15,7 @@ import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.ProductService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -107,4 +109,18 @@ public class ProductController implements ProductApi { public ApiResult> featureList(ProductFeatureRelationSearchReq req) { return productFeatureRelationService.featureList(req); } + + /** + * 更新产品与权限点的关联关系 + * + * @param req {@link ProductFeatureRelationUpdateReq} + * @return + */ + @Override + public ApiResult updateFeatureRelation(List req) { + if(CollectionUtils.isEmpty(req)) { + return ApiResult.ok(false); + } + return productFeatureRelationService.updateFeatureRelation(req); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java index 0113c675..df2c25ce 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.service; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; import java.util.List; @@ -14,4 +15,6 @@ import java.util.List; */ public interface ProductFeatureRelationService { ApiResult> featureList(ProductFeatureRelationSearchReq req); + + ApiResult updateFeatureRelation(List req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java index e145c817..6a1ef569 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; import cn.axzo.tyr.server.repository.service.SaasProductModuleFeatureRelationDao; @@ -10,9 +11,13 @@ import cn.axzo.tyr.server.service.ProductFeatureRelationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * 产品与权限点的 Service 接口实现 @@ -34,4 +39,21 @@ public class ProductFeatureRelationServiceImpl implements ProductFeatureRelation .list(); return ApiResult.ok(BeanMapper.copyList(list, ProductFeatureRelationVO.class)); } + + @Override + @Transactional(rollbackFor = Exception.class) + public ApiResult updateFeatureRelation(List req) { + List productIds = req.stream().map(ProductFeatureRelationUpdateReq::getProductModuleId).distinct().collect(Collectors.toList()); + saasProductModuleFeatureRelationDao.removeByIds(productIds); + List saveList = new ArrayList<>(); + req.forEach(i -> i.getFeatureIds().forEach(featureId -> { + SaasProductModuleFeatureRelation relation = new SaasProductModuleFeatureRelation(); + relation.setProductModuleId(i.getProductModuleId()); + relation.setDictCodeId(i.getDictCodeId()); + relation.setFeatureId(featureId); + saveList.add(relation); + })); + saasProductModuleFeatureRelationDao.saveBatch(saveList); + return ApiResult.ok(true); + } }