add - 添加产品相关接口的实现

This commit is contained in:
wangli 2023-09-07 18:45:59 +08:00
parent 182c815d9d
commit 5473f434d6
9 changed files with 341 additions and 5 deletions

View File

@ -10,6 +10,7 @@ import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import org.springframework.cloud.openfeign.FeignClient;
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.PostMapping;
@ -28,26 +29,67 @@ import java.util.Map;
@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}")
public interface ProductApi {
/**
* 获取产品基础信息的列表
*
* @param req {@link ProductSearchListReq}
* @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductVO}
*/
@PostMapping("api/auth/product/list")
ApiResult<List<ProductVO>> list(@RequestBody ProductSearchListReq req);
/**
* 获取产品基础信息的分页列表
*
* @param req {@link ProductSearchPageReq}
* @return 如果没有查询, 返回 ApiPageResult.empty(), 携带分页信息,集合内类型: {@link ProductVO}
*/
@PostMapping("api/auth/product/page")
ApiPageResult<ProductVO> page(@RequestBody ProductSearchPageReq req);
/**
* 获取指定 ID 的产品基础信息
*
* @param id 产品 ID
* @return {@link ProductVO}
*/
@GetMapping("api/auth/product/get/id")
ApiResult<ProductVO> getById(Long id);
/**
* 新增产品基础信息
*
* @param req {@link ProductAddReq}
* @return 返回当前新增产品基础信息
*/
@PostMapping("api/auth/product/add")
ApiResult<ProductVO> add(@RequestBody ProductAddReq req);
ApiResult<ProductVO> add(@Validated @RequestBody ProductAddReq req);
/**
* 修改产品基础信息
*
* @param req {@link ProductUpdateReq}
* @return 返回修改后的产品基础信息
*/
@PutMapping("api/auth/product/update")
ApiResult<ProductVO> update(@RequestBody ProductUpdateReq req);
ApiResult<ProductVO> update(@Validated @RequestBody ProductUpdateReq req);
/**
* 删除指定 ID 的产品
*
* @param id 产品 ID
* @return 返回被删除的产品信息
*/
@DeleteMapping("api/auth/product/delete/id")
ApiResult<ProductVO> delete(Long id);
/**
* 返回指定产品和单位类型下所有已有权限点集合
*
* @param req {@link ProductFeatureRelationSearchReq}
* @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductFeatureRelationVO}
*/
@PostMapping("api/auth/product/feature/relation/list")
ApiResult<List<ProductFeatureRelationVO>> featureList(@RequestBody ProductFeatureRelationSearchReq req);
ApiResult<List<ProductFeatureRelationVO>> featureList(@Validated @RequestBody ProductFeatureRelationSearchReq req);
@PostMapping("api/auth/products/feature/relation/map")
ApiResult<Map<String, List<ProductFeatureRelationVO>>> featureMap(@RequestBody List<ProductFeatureRelationVO> req);
}

View File

@ -5,6 +5,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 产品与权限点搜索入参模型
*
@ -20,6 +22,7 @@ public class ProductFeatureRelationSearchReq {
/**
* 产品 ID
*/
@NotNull(message = "产品 ID 不能为空")
private Long productModuleId;
/**

View File

@ -4,7 +4,9 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**

View File

@ -39,6 +39,11 @@ public class ProductVO {
*/
private Long dictWorkspaceTypeId;
/**
* 产品所属工作类型名称
*/
private String dictWorkspaceTypeDesc;
/**
* 上下架状态 1:上架, 0:下架
*/

View File

@ -0,0 +1,110 @@
package cn.axzo.tyr.server.controller.product;
import cn.axzo.framework.domain.web.result.ApiPageResult;
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.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.product.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
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.web.bind.annotation.RestController;
import java.util.List;
/**
* 产品相关 API 实现
*
* @author wangli
* @since 2023/9/7 14:05
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class ProductController implements ProductApi {
private final ProductService productService;
private final ProductFeatureRelationService productFeatureRelationService;
/**
* 获取产品基础信息的列表
*
* @param req {@link ProductSearchListReq}
* @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductVO}
*/
@Override
public ApiResult<List<ProductVO>> list(ProductSearchListReq req) {
return productService.list(req);
}
/**
* 获取产品基础信息的分页列表
*
* @param req {@link ProductSearchPageReq}
* @return 如果没有查询, 返回 ApiPageResult.empty(), 携带分页信息,集合内类型: {@link ProductVO}
*/
@Override
public ApiPageResult<ProductVO> page(ProductSearchPageReq req) {
return productService.page(req);
}
/**
* 获取指定 ID 的产品基础信息
*
* @param id 产品 ID
* @return {@link ProductVO}
*/
@Override
public ApiResult<ProductVO> getById(Long id) {
return productService.getById(id);
}
/**
* 新增产品基础信息
*
* @param req {@link ProductAddReq}
* @return 返回当前新增产品基础信息
*/
@Override
public ApiResult<ProductVO> add(ProductAddReq req) {
return productService.add(req);
}
/**
* 修改产品基础信息
*
* @param req {@link ProductUpdateReq}
* @return 返回修改后的产品基础信息
*/
@Override
public ApiResult<ProductVO> update(ProductUpdateReq req) {
return productService.update(req);
}
/**
* 删除指定 ID 的产品
*
* @param id 产品 ID
* @return 返回被删除的产品信息
*/
@Override
public ApiResult<ProductVO> delete(Long id) {
return productService.delete(id);
}
/**
* 返回指定产品和单位类型下所有已有权限点集合
*
* @param req {@link ProductFeatureRelationSearchReq}
* @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductFeatureRelationVO}
*/
@Override
public ApiResult<List<ProductFeatureRelationVO>> featureList(ProductFeatureRelationSearchReq req) {
return productFeatureRelationService.featureList(req);
}
}

View File

@ -0,0 +1,17 @@
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.ProductFeatureRelationVO;
import java.util.List;
/**
* 产品与权限点的 Service 接口定义
*
* @author wangli
* @since 2023/9/7 14:26
*/
public interface ProductFeatureRelationService {
ApiResult<List<ProductFeatureRelationVO>> featureList(ProductFeatureRelationSearchReq req);
}

View File

@ -0,0 +1,32 @@
package cn.axzo.tyr.server.service;
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.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import java.util.List;
/**
* 产品相关 Service 接口定义
*
* @author wangli
* @since 2023/9/7 14:21
*/
public interface ProductService {
ApiResult<List<ProductVO>> list(ProductSearchListReq req);
ApiPageResult<ProductVO> page(ProductSearchPageReq req);
ApiResult<ProductVO> getById(Long id);
ApiResult<ProductVO> add(ProductAddReq req);
ApiResult<ProductVO> update(ProductUpdateReq req);
ApiResult<ProductVO> delete(Long id);
}

View File

@ -0,0 +1,37 @@
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.ProductFeatureRelationVO;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.repository.service.SaasProductModuleFeatureRelationDao;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
* 产品与权限点的 Service 接口实现
*
* @author wangli
* @since 2023/9/7 14:27
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ProductFeatureRelationServiceImpl implements ProductFeatureRelationService {
private final SaasProductModuleFeatureRelationDao saasProductModuleFeatureRelationDao;
@Override
public ApiResult<List<ProductFeatureRelationVO>> featureList(ProductFeatureRelationSearchReq req) {
List<SaasProductModuleFeatureRelation> list = saasProductModuleFeatureRelationDao.lambdaQuery()
.eq(SaasProductModuleFeatureRelation::getProductModuleId, req.getProductModuleId())
.eq(Objects.nonNull(req.getDictCodeId()), SaasProductModuleFeatureRelation::getDictCodeId, req.getDictCodeId())
.list();
return ApiResult.ok(BeanMapper.copyList(list, ProductFeatureRelationVO.class));
}
}

View File

@ -0,0 +1,88 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.framework.domain.page.PageResp;
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.ProductSearchListReq;
import cn.axzo.tyr.client.model.product.ProductSearchPageReq;
import cn.axzo.tyr.client.model.product.ProductUpdateReq;
import cn.axzo.tyr.client.model.product.ProductVO;
import cn.axzo.tyr.server.repository.entity.ProductModule;
import cn.axzo.tyr.server.repository.service.ProductModuleDao;
import cn.axzo.tyr.server.service.ProductService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanMap;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Objects;
/**
* 产品相关 Service 接口实现
*
* @author wangli
* @since 2023/9/7 14:22
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ProductServiceImpl implements ProductService {
private final ProductModuleDao productModuleDao;
@Override
public ApiResult<List<ProductVO>> list(ProductSearchListReq req) {
List<ProductModule> list = productModuleDao.lambdaQuery()
.like(StringUtils.hasLength(req.getName()), ProductModule::getProductName, req.getName())
.eq(Objects.nonNull(req.getDictWorkspaceTypeId()), ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId())
.eq(Objects.nonNull(req.getStatus()), ProductModule::getStatus, req.getStatus())
.list();
return ApiResult.ok(BeanMapper.copyList(list, ProductVO.class));
}
@Override
public ApiPageResult<ProductVO> page(ProductSearchPageReq req) {
IPage<ProductModule> page = productModuleDao.lambdaQuery()
.like(StringUtils.hasLength(req.getName()), ProductModule::getProductName, req.getName())
.eq(Objects.nonNull(req.getDictWorkspaceTypeId()), ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId())
.eq(Objects.nonNull(req.getStatus()), ProductModule::getStatus, req.getStatus())
.page(req.toPage());
List<ProductVO> list = BeanMapper.copyList(page.getRecords(), ProductVO.class);
PageResp<ProductVO> data = PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list);
return ApiPageResult.ok(data);
}
@Override
public ApiResult<ProductVO> getById(Long id) {
return ApiResult.ok(BeanMapper.copyBean(productModuleDao.getById(id), ProductVO.class));
}
@Override
public ApiResult<ProductVO> add(ProductAddReq req) {
ProductModule productModule = BeanMapper.copyBean(req, ProductModule.class);
productModuleDao.save(productModule);
return ApiResult.ok(BeanMapper.copyBean(productModule, ProductVO.class));
}
@Override
public ApiResult<ProductVO> update(ProductUpdateReq req) {
ProductModule productModule = productModuleDao.getById(req.getId());
BeanMapper.copyBeanIgnoreNull(req, ()-> productModule);
productModuleDao.updateById(productModule);
return ApiResult.ok();
}
@Override
public ApiResult<ProductVO> delete(Long id) {
ProductModule productModule = productModuleDao.getById(id);
AssertUtil.isTrue(Objects.nonNull(productModule), "产品不存在");
productModule.setIsDelete(id);
productModuleDao.updateById(productModule);
return ApiResult.ok(BeanMapper.copyBean(productModule, ProductVO.class));
}
}