From 3bfb50eb7a505c634f0d76ec12ffa68d3f281e85 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 04 Aug 2025 14:03:48 +0800 Subject: [PATCH] feat(ai): 添加 AI 产品相关接口和功能 --- src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java | 48 +++ src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java | 54 ++++ src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java | 68 +++++ src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java | 5 src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java | 44 +++ src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java | 20 + src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java | 9 src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java | 5 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java | 61 ++++ src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java | 4 src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java | 28 ++ src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java | 4 src/main/java/cc/mrbird/febs/ai/service/AiProductService.java | 15 + src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java | 20 + src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java | 22 + src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java | 45 +++ src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java | 15 + src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java | 29 ++ src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java | 2 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java | 9 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java | 15 + src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java | 62 ++++ src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java | 35 ++ src/main/resources/mapper/modules/AiProductCategoryMapper.xml | 12 src/main/resources/mapper/modules/AiProductMapper.xml | 22 + src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java | 64 ++++ src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java | 6 src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java | 27 ++ 28 files changed, 742 insertions(+), 8 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java index 888ae6d..079a0de 100644 --- a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java +++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ApiMemberRoleController.java @@ -29,8 +29,8 @@ @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMemberRoleVo.class) }) - @GetMapping(value = "/memberRoleList") - public FebsResponse memberRoleList() { + @GetMapping(value = "/list") + public FebsResponse list() { return aiMemberRoleService.memberRoleList(); } } diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java new file mode 100644 index 0000000..0fface7 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java @@ -0,0 +1,54 @@ +package cc.mrbird.febs.ai.controller.product; + +import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; +import cc.mrbird.febs.ai.req.product.ApiProductPageDto; +import cc.mrbird.febs.ai.res.product.ApiProductInfoVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.common.entity.FebsResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/api/ai/product") +@Api(value = "ApiProductController", tags = "AI-产品") +public class ApiProductController { + + private final AiProductService aiProductService; + + @ApiOperation(value = "产品列表", notes = "产品列表") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiProductVo.class) + }) + @PostMapping(value = "/list") + public FebsResponse list(@RequestBody @Validated ApiProductPageDto dto) { + + return aiProductService.productList(dto); + } + + @ApiOperation(value = "产品详情", notes = "产品详情") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiProductInfoVo.class) + }) + @PostMapping(value = "/info") + public FebsResponse info(@RequestBody @Validated ApiProductInfoDto dto) { + + return aiProductService.productInfo(dto); + } + +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java new file mode 100644 index 0000000..3b82b0d --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java @@ -0,0 +1,48 @@ +package cc.mrbird.febs.ai.controller.productCategory; + +import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto; +import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo; +import cc.mrbird.febs.ai.service.AiProductCategoryService; +import cc.mrbird.febs.common.entity.FebsResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/api/ai/productCategory") +@Api(value = "ApiProductCategoryController", tags = "AI-产品分类") +public class ApiProductCategoryController { + + private final AiProductCategoryService aiProductCategoryService; + + @ApiOperation(value = "首页推荐", notes = "首页推荐") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiProductCategoryVo.class) + }) + @GetMapping(value = "/hot") + public FebsResponse hot() { + return aiProductCategoryService.hot(); + } + + + @ApiOperation(value = "分类列表", notes = "分类列表") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiProductCategoryVo.class) + }) + @PostMapping(value = "/list") + public FebsResponse list(@RequestBody @Validated ApiProductCategoryPageDto dto) { + + return aiProductCategoryService.categoryList(dto); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java new file mode 100644 index 0000000..88ab37e --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/productPoint/ApiProductPointController.java @@ -0,0 +1,44 @@ +package cc.mrbird.febs.ai.controller.productPoint; + +import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; +import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto; +import cc.mrbird.febs.ai.res.product.ApiProductInfoVo; +import cc.mrbird.febs.ai.res.productPoint.ApiProductPointInfoVo; +import cc.mrbird.febs.ai.service.AiProductPointService; +import cc.mrbird.febs.common.entity.FebsResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/api/ai/productPoint") +@Api(value = "ApiProductPointController", tags = "AI-产品知识点") +public class ApiProductPointController { + + private final AiProductPointService aiProductPointService; + + @ApiOperation(value = "知识点详情", notes = "知识点详情") + @ApiResponses({ + @ApiResponse(code = 200, message = "success", response = ApiProductPointInfoVo.class) + }) + @PostMapping(value = "/info") + public FebsResponse info(@RequestBody @Validated ApiProductPointInfoDto dto) { + + return aiProductPointService.productPointInfo(dto); + } + +} diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java index 516ec6c..9fba1b1 100644 --- a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java +++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductCategoryMapper.java @@ -1,7 +1,11 @@ package cc.mrbird.febs.ai.mapper; import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto; +import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; /** * AI产品类别 Mapper接口 @@ -11,4 +15,5 @@ */ public interface AiProductCategoryMapper extends BaseMapper<AiProductCategory> { + Page<ApiProductCategoryVo> selectPageListByQuery(Page<ApiProductCategoryVo> page, @Param("record")ApiProductCategoryPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java index 4f20d91..15c7eae 100644 --- a/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java +++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiProductMapper.java @@ -1,7 +1,11 @@ package cc.mrbird.febs.ai.mapper; import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.req.product.ApiProductPageDto; +import cc.mrbird.febs.ai.res.product.ApiProductVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; /** * AI产品表 Mapper接口 @@ -11,4 +15,5 @@ */ public interface AiProductMapper extends BaseMapper<AiProduct> { + Page<ApiProductVo> selectPageListByQuery(Page<ApiProductVo> page, @Param("record") ApiProductPageDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java new file mode 100644 index 0000000..66940cc --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductInfoDto.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.ai.req.product; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductInfoDto", description = "参数") +public class ApiProductInfoDto { + + @NotBlank(message = "ID不能为空") + @ApiModelProperty(value = "产品ID", example = "10") + private String id; +} diff --git a/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java new file mode 100644 index 0000000..ef63b7c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/product/ApiProductPageDto.java @@ -0,0 +1,29 @@ +package cc.mrbird.febs.ai.req.product; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductPageDto", description = "参数") +public class ApiProductPageDto { + + @NotNull(message = "页码不能为空") + @ApiModelProperty(value = "页码", example = "1") + private Integer pageNow; + + @NotNull(message = "每页数量不能为空") + @ApiModelProperty(value = "每页数量", example = "10") + private Integer pageSize; + + @ApiModelProperty(value = "分类ID", example = "123") + private String categoryId; + + @ApiModelProperty(value = "角色ID", example = "123") + private String memberRoleId; +} diff --git a/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java new file mode 100644 index 0000000..5e413ea --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java @@ -0,0 +1,27 @@ +package cc.mrbird.febs.ai.req.productCategory; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductCategoryPageDto", description = "参数") +public class ApiProductCategoryPageDto { + + @NotNull(message = "页码不能为空") + @ApiModelProperty(value = "页码", example = "1") + private Integer pageNow; + + @NotNull(message = "每页数量不能为空") + @ApiModelProperty(value = "每页数量", example = "10") + private Integer pageSize; + + @ApiModelProperty(value = "查询名称", example = "123") + private String query; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java new file mode 100644 index 0000000..0d2f805 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/productPoint/ApiProductPointInfoDto.java @@ -0,0 +1,20 @@ +package cc.mrbird.febs.ai.req.productPoint; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductPointInfoDto", description = "参数") +public class ApiProductPointInfoDto { + + + @NotBlank(message = "ID不能为空") + @ApiModelProperty(value = "产品知识点ID", example = "10") + private String id; +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java new file mode 100644 index 0000000..e2728c7 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductInfoVo.java @@ -0,0 +1,68 @@ +package cc.mrbird.febs.ai.res.product; + +import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductInfoVo", description = "参数") +public class ApiProductInfoVo { + + @ApiModelProperty(value = "ID") + private String id; + + @ApiModelProperty(value = "分类ID") + private String productCategoryId; + + /** + * 名称 + */ + @ApiModelProperty(value = "ID") + private String name; + /** + * 场景(可以根据场景生成prompt提示词) + */ + + @ApiModelProperty(value = "场景") + private String scene; + + /** + * 目标 + */ + @ApiModelProperty(value = "目标") + private String target; + + /** + * 背景图片 + */ + @ApiModelProperty(value = "背景图片") + private String backImg; + + /** + * 小图标 + */ + @ApiModelProperty(value = "小图标") + private String iconImg; + + /** + * 描述 + */ + @ApiModelProperty(value = "描述") + private String description; + + /** + * 每次出题数量 + */ + @ApiModelProperty(value = "每次出题数量") + private Integer questionCount; + + @ApiModelProperty(value = "知识点") + private List<ApiProductPointVo> productPointList; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java new file mode 100644 index 0000000..bcb8aa1 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/product/ApiProductVo.java @@ -0,0 +1,28 @@ +package cc.mrbird.febs.ai.res.product; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductVo", description = "参数") +public class ApiProductVo { + + @ApiModelProperty(value = "ID") + private String id; + /** + * 名称 + */ + @ApiModelProperty(value = "ID") + private String name; + + /** + * 目标 + */ + @ApiModelProperty(value = "ID") + private String target; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java b/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java new file mode 100644 index 0000000..c20e2c2 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/productCategory/ApiProductCategoryVo.java @@ -0,0 +1,35 @@ +package cc.mrbird.febs.ai.res.productCategory; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductCategoryVo", description = "参数") +public class ApiProductCategoryVo { + + @ApiModelProperty(value = "ID") + private String id; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称") + private String name; + + /** + * 背景图片 + */ + @ApiModelProperty(value = "背景图片") + private String backImg; + + /** + * 小图标 + */ + @ApiModelProperty(value = "小图标") + private String iconImg; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java new file mode 100644 index 0000000..008ca2f --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointInfoVo.java @@ -0,0 +1,45 @@ +package cc.mrbird.febs.ai.res.productPoint; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductPointInfoVo", description = "参数") +public class ApiProductPointInfoVo { + + + /** + * 类型1:普通内容 2:视频号内容 + */ + @ApiModelProperty(value = "类型1:普通内容 2:视频号内容") + private Integer isNormal; + + /** + * 视频号 id,以"sph"开头的id,可在视频号助手获取 + */ + @ApiModelProperty(value = "视频号 id") + private String finderUserName; + + /** + * 视频 feedId + */ + @ApiModelProperty(value = "视频 feedId") + private String feedId; + + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + private String title; + + /** + * 描述 + */ + @ApiModelProperty(value = "描述") + private String description; + +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java new file mode 100644 index 0000000..f2552eb --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/productPoint/ApiProductPointVo.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.ai.res.productPoint; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +@ApiModel(value = "ApiProductPointVo", description = "参数") +public class ApiProductPointVo { + + @ApiModelProperty(value = "知识点ID") + private String id; + + /** + * 名称 + */ + @ApiModelProperty(value = "名称") + private String title; +} diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java index db6d335..5ca434d 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java @@ -18,4 +18,6 @@ List<AiMemberRole> getListByQuery(LambdaQueryWrapper<AiMemberRole> query); FebsResponse memberRoleList(); + + String getDefaultMemberRoleId(); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java index 50e1cf8..58742f4 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java @@ -1,6 +1,12 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto; +import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.vo.ApiActivityInfoVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -13,4 +19,13 @@ public interface AiProductCategoryService extends IService<AiProductCategory> { + List<AiProductCategory> getListByQuery(LambdaQueryWrapper<AiProductCategory> query); + + Page<ApiProductCategoryVo> getPageListByQuery(Page<ApiProductCategoryVo> page , ApiProductCategoryPageDto dto); + + FebsResponse hot(); + + FebsResponse categoryList(ApiProductCategoryPageDto dto); + + String getDefaultProductCategoryId(); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java index c312695..495d002 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointLinkService.java @@ -1,10 +1,16 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProductPointLink; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; /** * @author Administrator */ public interface AiProductPointLinkService extends IService<AiProductPointLink> { + + + List<AiProductPointLink> getListByProductId(LambdaQueryWrapper<AiProductPointLink> pointLinkQUery); } \ No newline at end of file diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java index 9517605..04eb5e2 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java @@ -1,8 +1,12 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProductPoint; +import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto; +import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo; +import cc.mrbird.febs.common.entity.FebsResponse; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Set; /** * AI产品知识点 Service接口 @@ -11,6 +15,11 @@ * @date 2025-07-29 */ public interface AiProductPointService extends IService<AiProductPoint> { + AiProductPoint getById(String id); + List<AiProductPoint> getListByPointIds(Set<String> collect); + List<ApiProductPointVo> listByProductId(String productId); + + FebsResponse productPointInfo(ApiProductPointInfoDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java index 0da0708..1d4a9fa 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductService.java @@ -1,6 +1,13 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; +import cc.mrbird.febs.ai.req.product.ApiProductPageDto; +import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto; +import cc.mrbird.febs.ai.res.product.ApiProductVo; +import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo; +import cc.mrbird.febs.common.entity.FebsResponse; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -11,4 +18,12 @@ * @date 2025-07-29 */ public interface AiProductService extends IService<AiProduct> { + + AiProduct getById(String id); + + Page<ApiProductVo> getPageListByQuery(Page<ApiProductVo> page , ApiProductPageDto dto); + + FebsResponse productList(ApiProductPageDto dto); + + FebsResponse productInfo(ApiProductInfoDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java index 2b8dda6..e4aad6e 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java @@ -55,4 +55,19 @@ } return new FebsResponse().success().data(list); } + + @Override + public String getDefaultMemberRoleId() { + LambdaQueryWrapper<AiMemberRole> queryWrapper = Wrappers.lambdaQuery(AiMemberRole.class); + queryWrapper.eq(AiMemberRole::getState, 1); + queryWrapper.orderByAsc(AiMemberRole::getCreatedTime); + queryWrapper.last("limit 1"); + List<AiMemberRole> listByQuery = this.getListByQuery(queryWrapper); + if (CollUtil.isNotEmpty(listByQuery)){ + for (AiMemberRole aiMemberRole : listByQuery){ + return aiMemberRole.getId(); + } + } + return null; + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java index f669736..fda81b3 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java @@ -2,14 +2,22 @@ import cc.mrbird.febs.ai.entity.AiProductCategory; import cc.mrbird.febs.ai.mapper.AiProductCategoryMapper; +import cc.mrbird.febs.ai.req.productCategory.ApiProductCategoryPageDto; +import cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo; import cc.mrbird.febs.ai.service.AiProductCategoryService; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.vo.ApiActivityInfoVo; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; /** @@ -26,4 +34,58 @@ private final AiProductCategoryMapper aiProductCategoryMapper; + @Override + public List<AiProductCategory> getListByQuery(LambdaQueryWrapper<AiProductCategory> query) { + return aiProductCategoryMapper.selectList(query); + } + + @Override + public Page<ApiProductCategoryVo> getPageListByQuery(Page<ApiProductCategoryVo> page , ApiProductCategoryPageDto dto) { + return aiProductCategoryMapper.selectPageListByQuery(page,dto); + } + + @Override + public FebsResponse hot() { + + List<ApiProductCategoryVo> list = new ArrayList<>(); + + LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + query.eq(AiProductCategory::getState, 1); + query.eq(AiProductCategory::getHotState, 1); + query.orderByAsc(AiProductCategory::getSort); + List<AiProductCategory> listByQuery = this.getListByQuery(query); + if (CollUtil.isNotEmpty(listByQuery)){ + for (AiProductCategory aiProductCategory : listByQuery){ + ApiProductCategoryVo apiProductCategoryVo = new ApiProductCategoryVo(); + apiProductCategoryVo.setId(aiProductCategory.getId()); + apiProductCategoryVo.setName(aiProductCategory.getName()); + apiProductCategoryVo.setBackImg(aiProductCategory.getBackImg()); + apiProductCategoryVo.setIconImg(aiProductCategory.getIconImg()); + list.add(apiProductCategoryVo); + } + } + return new FebsResponse().success().data(list); + } + + @Override + public FebsResponse categoryList(ApiProductCategoryPageDto dto) { + // 创建分页对象,传入当前页和每页大小 + Page<ApiProductCategoryVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); + Page<ApiProductCategoryVo> pageListByQuery = this.getPageListByQuery(page, dto); + return new FebsResponse().success().data(pageListByQuery); + } + + @Override + public String getDefaultProductCategoryId() { + LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + query.eq(AiProductCategory::getState, 1); + query.eq(AiProductCategory::getHotState, 1); + query.orderByAsc(AiProductCategory::getSort); + query.last("limit 1"); + List<AiProductCategory> listByQuery = this.getListByQuery(query); + if (CollUtil.isNotEmpty(listByQuery)){ + return listByQuery.get(0).getId(); + } + return null; + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java index 9818302..f90a251 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointLinkServiceImpl.java @@ -3,10 +3,13 @@ import cc.mrbird.febs.ai.entity.AiProductPointLink; import cc.mrbird.febs.ai.mapper.AiProductPointLinkMapper; import cc.mrbird.febs.ai.service.AiProductPointLinkService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** * @author Administrator @@ -16,4 +19,10 @@ @Transactional public class AiProductPointLinkServiceImpl extends ServiceImpl<AiProductPointLinkMapper, AiProductPointLink> implements AiProductPointLinkService { + private final AiProductPointLinkMapper aiProductPointLinkMapper; + + @Override + public List<AiProductPointLink> getListByProductId(LambdaQueryWrapper<AiProductPointLink> pointLinkQUery) { + return aiProductPointLinkMapper.selectList(pointLinkQUery); + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java index f9115c9..5bf24cf 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java @@ -1,16 +1,28 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiProductPoint; +import cc.mrbird.febs.ai.entity.AiProductPointLink; import cc.mrbird.febs.ai.mapper.AiProductPointMapper; +import cc.mrbird.febs.ai.req.productPoint.ApiProductPointInfoDto; +import cc.mrbird.febs.ai.res.productPoint.ApiProductPointInfoVo; +import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo; +import cc.mrbird.febs.ai.service.AiProductPointLinkService; import cc.mrbird.febs.ai.service.AiProductPointService; +import cc.mrbird.febs.common.entity.FebsResponse; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * AI产品知识点 Service实现类 @@ -24,6 +36,55 @@ public class AiProductPointServiceImpl extends ServiceImpl<AiProductPointMapper, AiProductPoint> implements AiProductPointService { private final AiProductPointMapper aiProductPointMapper; + private final AiProductPointLinkService aiProductPointLinkService; + @Override + public AiProductPoint getById(String id) { + return aiProductPointMapper.selectById( id); + } + @Override + public List<AiProductPoint> getListByPointIds(Set<String> collect) { + return aiProductPointMapper.selectBatchIds( collect); + } + @Override + public List<ApiProductPointVo> listByProductId(String productId) { + List<ApiProductPointVo> vos = new ArrayList<>(); + + LambdaQueryWrapper<AiProductPointLink> pointLinkQUery = Wrappers.lambdaQuery(AiProductPointLink.class); + pointLinkQUery.eq(AiProductPointLink::getProductId, productId); + List<AiProductPointLink> linkList = aiProductPointLinkService.getListByProductId(pointLinkQUery); + if (CollUtil.isEmpty(linkList)){ + return vos; + } + + Set<String> collect = linkList.stream().map(AiProductPointLink::getProductPointId).collect(Collectors.toSet()); + List<AiProductPoint> list = this.getListByPointIds(collect); + if (CollUtil.isEmpty(list)){ + return vos; + } + + for (AiProductPoint point : list){ + ApiProductPointVo vo = new ApiProductPointVo(); + vo.setId(point.getId()); + vo.setTitle(point.getTitle()); + vos.add(vo); + } + return vos; + } + + @Override + public FebsResponse productPointInfo(ApiProductPointInfoDto dto) { + ApiProductPointInfoVo apiProductPointInfoVo = new ApiProductPointInfoVo(); + String id = dto.getId(); + AiProductPoint entity = this.getById(id); + if (ObjectUtil.isNotNull( entity)){ + apiProductPointInfoVo.setIsNormal(entity.getIsNormal()); + apiProductPointInfoVo.setFinderUserName(entity.getFinderUserName()); + apiProductPointInfoVo.setFeedId(entity.getFeedId()); + apiProductPointInfoVo.setTitle(entity.getTitle()); + apiProductPointInfoVo.setDescription(entity.getDescription()); + } + return new FebsResponse().success().data(apiProductPointInfoVo); + } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java index b946cf7..566e82f 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java @@ -1,16 +1,20 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.entity.AiProductPoint; import cc.mrbird.febs.ai.mapper.AiProductMapper; -import cc.mrbird.febs.ai.service.AiProductService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; +import cc.mrbird.febs.ai.req.product.ApiProductPageDto; +import cc.mrbird.febs.ai.res.product.ApiProductInfoVo; +import cc.mrbird.febs.ai.res.product.ApiProductVo; +import cc.mrbird.febs.ai.service.*; +import cc.mrbird.febs.common.entity.FebsResponse; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; /** * AI产品表 Service实现类 @@ -24,6 +28,56 @@ public class AiProductServiceImpl extends ServiceImpl<AiProductMapper, AiProduct> implements AiProductService { private final AiProductMapper aiProductMapper; + private final AiMemberRoleService aiMemberRoleService; + private final AiProductCategoryService aiProductCategoryService; + private final AiProductPointService aiProductPointService; + @Override + public AiProduct getById(String id) { + return aiProductMapper.selectById( id); + } + + @Override + public Page<ApiProductVo> getPageListByQuery(Page<ApiProductVo> page, ApiProductPageDto dto) { + return aiProductMapper.selectPageListByQuery(page, dto); + } + + @Override + public FebsResponse productList(ApiProductPageDto dto) { + + if(StrUtil.isEmpty(dto.getMemberRoleId())){ + String memberRoleId = aiMemberRoleService.getDefaultMemberRoleId(); + dto.setMemberRoleId(memberRoleId); + } + + if(StrUtil.isEmpty(dto.getCategoryId())){ + String categoryId = aiProductCategoryService.getDefaultProductCategoryId(); + dto.setCategoryId(categoryId); + } + // 创建分页对象,传入当前页和每页大小 + Page<ApiProductVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); + Page<ApiProductVo> pageListByQuery = this.getPageListByQuery(page, dto); + return new FebsResponse().success().data(pageListByQuery); + } + + @Override + public FebsResponse productInfo(ApiProductInfoDto dto) { + + String id = dto.getId(); + AiProduct entity = this.getById(id); + ApiProductInfoVo vo = new ApiProductInfoVo(); + vo.setId(entity.getId()); + vo.setProductCategoryId(entity.getProductCategoryId()); + vo.setName(entity.getName()); + vo.setScene(entity.getScene()); + vo.setTarget(entity.getTarget()); + vo.setBackImg(entity.getBackImg()); + vo.setIconImg(entity.getIconImg()); + vo.setDescription(entity.getDescription()); + vo.setQuestionCount(entity.getQuestionCount()); + + vo.setProductPointList(aiProductPointService.listByProductId(id)); + return new FebsResponse().success().data(vo); + } } diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java index 863af31..6539b77 100644 --- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java +++ b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java @@ -47,6 +47,8 @@ registration.excludePathPatterns("/api/clothes/social/allComment"); registration.excludePathPatterns("/api/clothes/social/socialInfo"); registration.excludePathPatterns("/api/clothes/clothesType"); - registration.excludePathPatterns("/api/ai/**"); + registration.excludePathPatterns("/api/ai/memberRole/**"); + registration.excludePathPatterns("/api/ai/productCategory/**"); + registration.excludePathPatterns("/api/ai/product/**"); } } diff --git a/src/main/resources/mapper/modules/AiProductCategoryMapper.xml b/src/main/resources/mapper/modules/AiProductCategoryMapper.xml index cb5c925..d1ae984 100644 --- a/src/main/resources/mapper/modules/AiProductCategoryMapper.xml +++ b/src/main/resources/mapper/modules/AiProductCategoryMapper.xml @@ -1,4 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cc.mrbird.febs.ai.mapper.AiProductCategoryMapper"> + + <select id="selectPageListByQuery" resultType="cc.mrbird.febs.ai.res.productCategory.ApiProductCategoryVo"> + select + a.id as id, + a.name as name, + a.back_img as backImg, + a.icon_img as iconImg + from ai_product_category a + where + a.state = 1 + order by a.sort asc + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/AiProductMapper.xml b/src/main/resources/mapper/modules/AiProductMapper.xml index a4c1c21..a5a099c 100644 --- a/src/main/resources/mapper/modules/AiProductMapper.xml +++ b/src/main/resources/mapper/modules/AiProductMapper.xml @@ -1,4 +1,26 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cc.mrbird.febs.ai.mapper.AiProductMapper"> + + <select id="selectPageListByQuery" resultType="cc.mrbird.febs.ai.res.product.ApiProductVo"> + select + a.id as id, + a.name as name, + a.target as target + from ai_product a + <where> + a.state = 1 + <if test="record != null"> + <if test="record.categoryId != null and record.categoryId != ''"> + and a.product_category_id=#{record.categoryId} + </if> + <if test="record.memberRoleId != null and record.memberRoleId != ''"> + and a.id in ( + select product_id from ai_member_role_product where role_id = #{record.memberRoleId} + ) + </if> + </if> + </where> + order by a.sort asc + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.1