From 2bfe033e2fd8f3d8ee9e99f43df977e661fcbda8 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Thu, 31 Jul 2025 18:07:42 +0800 Subject: [PATCH] feat(ai): 添加会员角色、产品和产品分类的新增页面 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java | 103 - src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java | 2 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java | 90 src/main/resources/templates/febs/views/modules/ai/productCategory/list.html | 287 ++ src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java | 80 src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java | 83 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductPointServiceImpl.java | 121 - src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java | 47 src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java | 11 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java | 114 - src/main/resources/templates/febs/views/modules/ai/productCategory/info.html | 213 ++ src/main/resources/templates/febs/views/modules/ai/productCategory/add.html | 179 + src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java | 70 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java | 54 src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java | 106 - src/main/java/cc/mrbird/febs/ai/service/AiProductService.java | 97 src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java | 78 src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java | 98 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java | 149 - src/main/resources/application-test.yml | 4 src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java | 4 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleServiceImpl.java | 167 src/main/resources/templates/febs/views/modules/ai/memberRole/list.html | 246 ++ src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java | 223 +- src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java | 76 src/main/resources/templates/febs/views/modules/ai/product/info.html | 328 +++ src/main/java/cc/mrbird/febs/ai/util/UUID.java | 495 ++++ src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java | 114 - src/main/resources/templates/febs/views/modules/ai/memberRole/add.html | 139 + src/main/resources/templates/febs/views/modules/ai/product/add.html | 283 ++ src/main/resources/templates/febs/views/modules/ai/product/list.html | 329 +++ src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java | 117 - src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java | 100 src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java | 13 src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html | 128 + src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java | 2 src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java | 47 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java | 85 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java | 61 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java | 145 - src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java | 123 - src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java | 102 + src/main/resources/templates/febs/views/modules/ai/memberRole/info.html | 167 + src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java | 70 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java | 75 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java | 82 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java | 214 +- src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java | 90 src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java | 78 src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java | 5 50 files changed, 3,612 insertions(+), 2,482 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java new file mode 100644 index 0000000..e03c29a --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/AiMemberRoleController.java @@ -0,0 +1,78 @@ +package cc.mrbird.febs.ai.controller.memberRole; + +import cc.mrbird.febs.ai.entity.AiMemberRole; +import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto; +import cc.mrbird.febs.ai.service.AiMemberRoleService; +import cc.mrbird.febs.common.annotation.ControllerEndpoint; +import cc.mrbird.febs.common.controller.BaseController; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.dto.clothes.AdminClothesTypeInfoDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/admin/memberRole") +public class AiMemberRoleController extends BaseController { + + private final AiMemberRoleService aiMemberRoleService; + + @GetMapping("list") + public FebsResponse list(AiMemberRole dto, QueryRequest request) { + + Map<String, Object> data = getDataTable(aiMemberRoleService.listInPage(dto, request)); + return new FebsResponse().success().data(data); + } + + @GetMapping("changeState/{id}/{state}") + @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败") + public FebsResponse changeState( + @NotNull(message = "{required}") @PathVariable String id, + @NotNull(message = "{required}") @PathVariable Integer state + ) { + + return aiMemberRoleService.changeState(id,state); + } + + @PostMapping("add") + @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败") + public FebsResponse add(@RequestBody @Valid AiMemberRole dto) { + + return aiMemberRoleService.memberRoleAdd(dto); + } + + @PostMapping("update") + @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败") + public FebsResponse update(@RequestBody @Valid AiMemberRole dto) { + + return aiMemberRoleService.updateMemberRole(dto); + } + + @GetMapping("delete/{id}") + @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败") + public FebsResponse delete( + @NotNull(message = "{required}") @PathVariable String id + ) { + + return aiMemberRoleService.delete(id); + } + + @PostMapping("productSet") + @ControllerEndpoint(operation = "产品配置", exceptionMessage = "操作失败") + public FebsResponse productSet(@RequestBody @Valid AdminMoveChooseInfoDto dto) { + + return aiMemberRoleService.productSet(dto); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java new file mode 100644 index 0000000..9e673bf --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/memberRole/ViewController.java @@ -0,0 +1,102 @@ +package cc.mrbird.febs.ai.controller.memberRole; + +import cc.mrbird.febs.ai.entity.AiMemberRole; +import cc.mrbird.febs.ai.entity.AiMemberRoleProduct; +import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.res.AdminMoveChooseInfoVo; +import cc.mrbird.febs.ai.service.AiMemberRoleProductService; +import cc.mrbird.febs.ai.service.AiMemberRoleService; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.common.entity.FebsConstant; +import cc.mrbird.febs.common.utils.FebsUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Administrator + */ +@Controller("AiMemberRoleView") +@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/memberRole") +@RequiredArgsConstructor +public class ViewController { + + private final AiMemberRoleService aiMemberRoleService; + private final AiMemberRoleProductService aiMemberRoleProductService; + private final AiProductService aiProductService; + + @GetMapping("list") + @RequiresPermissions("memberRoleList:view") + public String memberRoleList() { + + return FebsUtil.view("modules/ai/memberRole/list"); + } + + @GetMapping(value = "/add") + @RequiresPermissions("memberRoleList:add") + public String artAdd() { + + return FebsUtil.view("modules/ai/memberRole/add"); + } + + @GetMapping("info/{id}") + @RequiresPermissions("memberRoleList:info") + public String artInfo(@PathVariable String id, Model model) { + AiMemberRole entity = aiMemberRoleService.getById(id); + model.addAttribute("aiMemberRole", entity); + return FebsUtil.view("modules/ai/memberRole/info"); + } + + @GetMapping("productSet/{id}") + @RequiresPermissions("memberRoleList:productSet") + public String productSet(@PathVariable String id, Model model) { + List<AdminMoveChooseInfoVo> vos = new ArrayList<>(); + Set<String> productIds = new HashSet<>(); + + AiMemberRole entity = aiMemberRoleService.getById(id); + if(ObjectUtil.isNotNull(entity)){ + //右侧数据 + LambdaQueryWrapper<AiMemberRoleProduct> query = Wrappers.lambdaQuery(AiMemberRoleProduct.class); + if(StrUtil.isNotEmpty(id)){ + query.eq(AiMemberRoleProduct::getRoleId, id); + } + List<AiMemberRoleProduct> selectedList = aiMemberRoleProductService.selectListByQuery(query); + if(CollUtil.isNotEmpty(selectedList)){ + //stream流操作happyMemberLabelRecords,获取memberId的set集合 + productIds = selectedList.stream().map(AiMemberRoleProduct::getProductId).collect(Collectors.toSet()); + } + + //左侧数据 + List<AiProduct> allList = aiProductService.selectList(); + if(CollUtil.isNotEmpty(allList)){ + //stream流操作mallMembers,生成一个新的List<MallMemberVo> + vos = allList.stream().map(AiProduct -> { + AdminMoveChooseInfoVo vo = new AdminMoveChooseInfoVo(); + vo.setId(AiProduct.getId()); + vo.setName(AiProduct.getName()); + return vo; + }).collect(Collectors.toList()); + } + } + + model.addAttribute("productAll", vos); + model.addAttribute("productSelected", productIds); + model.addAttribute("roleId", id); + return FebsUtil.view("modules/ai/memberRole/productSet"); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java new file mode 100644 index 0000000..692baed --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/product/AiProductController.java @@ -0,0 +1,70 @@ +package cc.mrbird.febs.ai.controller.product; + +import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.common.annotation.ControllerEndpoint; +import cc.mrbird.febs.common.controller.BaseController; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/admin/product") +public class AiProductController extends BaseController { + + private final AiProductService service; + + @GetMapping("list") + public FebsResponse list(AiProduct dto, QueryRequest request) { + + Map<String, Object> data = getDataTable(service.listInPage(dto, request)); + return new FebsResponse().success().data(data); + } + + @GetMapping("changeState/{id}/{type}/{state}") + @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败") + public FebsResponse changeState( + @NotNull(message = "{required}") @PathVariable String id, + @NotNull(message = "{required}") @PathVariable Integer type, + @NotNull(message = "{required}") @PathVariable Integer state + ) { + + return service.changeState(id,type,state); + } + + @PostMapping("add") + @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败") + public FebsResponse add(@RequestBody @Valid AiProduct dto) { + + return service.add(dto); + } + + @PostMapping("update") + @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败") + public FebsResponse update(@RequestBody @Valid AiProduct dto) { + + return service.update(dto); + } + + @GetMapping("delete/{id}") + @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败") + public FebsResponse delete( + @NotNull(message = "{required}") @PathVariable String id + ) { + + return service.delete(id); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java new file mode 100644 index 0000000..65e03e8 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/product/ViewController.java @@ -0,0 +1,47 @@ +package cc.mrbird.febs.ai.controller.product; + +import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.common.entity.FebsConstant; +import cc.mrbird.febs.common.utils.FebsUtil; +import lombok.RequiredArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author Administrator + */ +@Controller("AiProductView") +@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/product") +@RequiredArgsConstructor +public class ViewController { + + + private final AiProductService service; + + @GetMapping("list") + @RequiresPermissions("productList:view") + public String memberRoleList() { + + return FebsUtil.view("modules/ai/product/list"); + } + + @GetMapping(value = "/add") + @RequiresPermissions("productList:add") + public String artAdd() { + + return FebsUtil.view("modules/ai/product/add"); + } + + @GetMapping("info/{id}") + @RequiresPermissions("productList:info") + public String artInfo(@PathVariable String id, Model model) { + AiProduct entity = service.getById(id); + model.addAttribute("aiProduct", entity); + return FebsUtil.view("modules/ai/product/info"); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java new file mode 100644 index 0000000..79e93bb --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/AiProductCategoryController.java @@ -0,0 +1,76 @@ +package cc.mrbird.febs.ai.controller.productCategory; + +import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.ai.service.AiProductCategoryService; +import cc.mrbird.febs.common.annotation.ControllerEndpoint; +import cc.mrbird.febs.common.controller.BaseController; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/admin/productCategory") +public class AiProductCategoryController extends BaseController { + + private final AiProductCategoryService service; + + @GetMapping("list") + public FebsResponse list(AiProductCategory dto, QueryRequest request) { + + Map<String, Object> data = getDataTable(service.listInPage(dto, request)); + return new FebsResponse().success().data(data); + } + + @GetMapping("changeState/{id}/{type}/{state}") + @ControllerEndpoint(operation = "状态操作", exceptionMessage = "操作失败") + public FebsResponse changeState( + @NotNull(message = "{required}") @PathVariable String id, + @NotNull(message = "{required}") @PathVariable Integer type, + @NotNull(message = "{required}") @PathVariable Integer state + ) { + + return service.changeState(id,type,state); + } + + @PostMapping("add") + @ControllerEndpoint(operation = "新增", exceptionMessage = "操作失败") + public FebsResponse add(@RequestBody @Valid AiProductCategory dto) { + + return service.add(dto); + } + + @PostMapping("update") + @ControllerEndpoint(operation = "分类-更新", exceptionMessage = "操作失败") + public FebsResponse update(@RequestBody @Valid AiProductCategory dto) { + + return service.update(dto); + } + + @GetMapping("delete/{id}") + @ControllerEndpoint(operation = "删除", exceptionMessage = "操作失败") + public FebsResponse delete( + @NotNull(message = "{required}") @PathVariable String id + ) { + + return service.delete(id); + } + + @GetMapping(value = "/categoryTree") + public FebsResponse categoryTree() { + + return new FebsResponse().success().data(service.categoryTree()); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java new file mode 100644 index 0000000..64fe4ed --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ViewController.java @@ -0,0 +1,47 @@ +package cc.mrbird.febs.ai.controller.productCategory; + +import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.ai.service.AiProductCategoryService; +import cc.mrbird.febs.common.entity.FebsConstant; +import cc.mrbird.febs.common.utils.FebsUtil; +import lombok.RequiredArgsConstructor; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author Administrator + */ +@Controller("AiProductCategoryView") +@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/ai/productCategory") +@RequiredArgsConstructor +public class ViewController { + + + private final AiProductCategoryService service; + + @GetMapping("list") + @RequiresPermissions("categoryList:view") + public String memberRoleList() { + + return FebsUtil.view("modules/ai/productCategory/list"); + } + + @GetMapping(value = "/add") + @RequiresPermissions("categoryList:add") + public String artAdd() { + + return FebsUtil.view("modules/ai/productCategory/add"); + } + + @GetMapping("info/{id}") + @RequiresPermissions("categoryList:info") + public String artInfo(@PathVariable String id, Model model) { + AiProductCategory entity = service.getById(id); + model.addAttribute("aiProductCategory", entity); + return FebsUtil.view("modules/ai/productCategory/info"); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java index c169494..c7f9459 100644 --- a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java +++ b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberRole.java @@ -38,4 +38,9 @@ * 状态 0-禁用 1-启用 2-已删除 */ private Integer state; + + /** + * 排序 + */ + private Integer sort; } diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java b/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java index e60a2be..bdc2e75 100644 --- a/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java +++ b/src/main/java/cc/mrbird/febs/ai/entity/AiProduct.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.ai.entity; import cc.mrbird.febs.common.entity.AiBaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -58,6 +59,9 @@ */ private String productCategoryId; + @TableField(exist = false) + private String productCategoryName; + /** * 场景(可以根据场景生成prompt提示词) */ diff --git a/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java new file mode 100644 index 0000000..a1171f2 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/req/AdminMoveChooseInfoDto.java @@ -0,0 +1,13 @@ +package cc.mrbird.febs.ai.req; + +import lombok.Data; + +import java.util.List; + +@Data +public class AdminMoveChooseInfoDto { + + private String roleId; + + private List<String> chooseIds; +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java new file mode 100644 index 0000000..550794c --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/res/AdminMoveChooseInfoVo.java @@ -0,0 +1,11 @@ +package cc.mrbird.febs.ai.res; + +import lombok.Data; + +@Data +public class AdminMoveChooseInfoVo { + + private String id; + + private String name; +} diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java index b449215..b9d5570 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java @@ -19,95 +19,5 @@ */ AiMemberAnswerItem getById(String id); - /** - * 根据答题记录ID查询答题记录项列表 - * @param answerId 答题记录ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByAnswerId(String answerId); - /** - * 根据用户ID查询答题记录项列表 - * @param memberId 用户ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByMemberId(String memberId); - - /** - * 根据产品ID查询答题记录项列表 - * @param productId 产品ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByProductId(String productId); - - /** - * 根据题目父ID查询答题记录项列表 - * @param productQuestionParentId 题目父ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByProductQuestionParentId(String productQuestionParentId); - - /** - * 根据题目ID查询答题记录项列表 - * @param productQuestionId 题目ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByProductQuestionId(String productQuestionId); - - /** - * 根据用户回答状态查询答题记录项列表 - * @param memberAnswerState 用户回答状态 0-未回答 1-答对了 2-答错了 - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByMemberAnswerState(Integer memberAnswerState); - - /** - * 根据是否加入错题集查询答题记录项列表 - * @param isCollected 是否加入错题集:0-否,1-是 - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByIsCollected(Integer isCollected); - - /** - * 根据公司ID和用户ID查询答题记录项列表 - * @param companyId 公司ID - * @param memberId 用户ID - * @return 答题记录项列表 - */ - List<AiMemberAnswerItem> getByCompanyIdAndMemberId(String companyId, String memberId); - - /** - * 保存答题记录项 - * @param aiMemberAnswerItem 答题记录项实体 - * @return 是否保存成功 - */ - boolean saveAnswerItem(AiMemberAnswerItem aiMemberAnswerItem); - - /** - * 批量保存答题记录项 - * @param answerItems 答题记录项列表 - * @return 是否保存成功 - */ - boolean saveBatchAnswerItems(List<AiMemberAnswerItem> answerItems); - - /** - * 更新答题记录项 - * @param aiMemberAnswerItem 答题记录项实体 - * @return 是否更新成功 - */ - boolean updateAnswerItem(AiMemberAnswerItem aiMemberAnswerItem); - - /** - * 根据ID删除答题记录项 - * @param id 答题记录项ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据答题记录ID删除答题记录项 - * @param answerId 答题记录ID - * @return 是否删除成功 - */ - boolean deleteByAnswerId(String answerId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java index 0b58d28..82a409b 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java @@ -19,90 +19,5 @@ */ AiMemberAnswer getById(String id); - /** - * 根据用户ID查询答题记录列表 - * @param memberId 用户ID - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByMemberId(String memberId); - /** - * 根据产品ID查询答题记录列表 - * @param productId 产品ID - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByProductId(String productId); - - /** - * 根据公司ID查询答题记录列表 - * @param companyId 公司ID - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByCompanyId(String companyId); - - /** - * 根据状态查询答题记录列表 - * @param state 状态 0-进行中 1-已结束 - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByState(Integer state); - - /** - * 根据用户ID和状态查询答题记录列表 - * @param memberId 用户ID - * @param state 状态 0-进行中 1-已结束 - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByMemberIdAndState(String memberId, Integer state); - - /** - * 根据公司ID和用户ID查询答题记录列表 - * @param companyId 公司ID - * @param memberId 用户ID - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByCompanyIdAndMemberId(String companyId, String memberId); - - /** - * 根据评分范围查询答题记录列表 - * @param minScore 最低分 - * @param maxScore 最高分 - * @return 答题记录列表 - */ - List<AiMemberAnswer> getByScoreRange(Integer minScore, Integer maxScore); - - /** - * 保存答题记录 - * @param aiMemberAnswer 答题记录实体 - * @return 是否保存成功 - */ - boolean saveAnswer(AiMemberAnswer aiMemberAnswer); - - /** - * 批量保存答题记录 - * @param answers 答题记录列表 - * @return 是否保存成功 - */ - boolean saveBatchAnswers(List<AiMemberAnswer> answers); - - /** - * 更新答题记录 - * @param aiMemberAnswer 答题记录实体 - * @return 是否更新成功 - */ - boolean updateAnswer(AiMemberAnswer aiMemberAnswer); - - /** - * 根据ID删除答题记录 - * @param id 答题记录ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据用户ID删除答题记录 - * @param memberId 用户ID - * @return 是否删除成功 - */ - boolean deleteByMemberId(String memberId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java index 728603a..807e3bd 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleCategoryService.java @@ -19,82 +19,4 @@ */ AiMemberRoleCategory getById(String id); - /** - * 根据角色ID查询关联记录 - * @param roleId 角色ID - * @return 关联记录列表 - */ - List<AiMemberRoleCategory> getByRoleId(String roleId); - - /** - * 根据产品分类ID查询关联记录 - * @param productCategoryId 产品分类ID - * @return 关联记录列表 - */ - List<AiMemberRoleCategory> getByProductCategoryId(String productCategoryId); - - /** - * 根据公司ID查询关联记录 - * @param companyId 公司ID - * @return 关联记录列表 - */ - List<AiMemberRoleCategory> getByCompanyId(String companyId); - - /** - * 根据角色ID和产品分类ID查询关联记录 - * @param roleId 角色ID - * @param productCategoryId 产品分类ID - * @return 关联记录列表 - */ - List<AiMemberRoleCategory> getByRoleIdAndProductCategoryId(String roleId, String productCategoryId); - - /** - * 保存关联记录 - * @param aiMemberRoleCategory 关联记录实体 - * @return 是否保存成功 - */ - boolean saveRoleCategory(AiMemberRoleCategory aiMemberRoleCategory); - - /** - * 批量保存关联记录 - * @param roleCategories 关联记录列表 - * @return 是否保存成功 - */ - boolean saveBatchRoleCategories(List<AiMemberRoleCategory> roleCategories); - - /** - * 更新关联记录 - * @param aiMemberRoleCategory 关联记录实体 - * @return 是否更新成功 - */ - boolean updateRoleCategory(AiMemberRoleCategory aiMemberRoleCategory); - - /** - * 根据ID删除关联记录 - * @param id 关联记录ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据角色ID删除关联记录 - * @param roleId 角色ID - * @return 是否删除成功 - */ - boolean deleteByRoleId(String roleId); - - /** - * 根据产品分类ID删除关联记录 - * @param productCategoryId 产品分类ID - * @return 是否删除成功 - */ - boolean deleteByProductCategoryId(String productCategoryId); - - /** - * 根据角色ID和产品分类ID删除关联记录 - * @param roleId 角色ID - * @param productCategoryId 产品分类ID - * @return 是否删除成功 - */ - boolean deleteByRoleIdAndProductCategoryId(String roleId, String productCategoryId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java index 8dd64b0..83c38ab 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleProductService.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiMemberRoleProduct; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -19,82 +20,7 @@ */ AiMemberRoleProduct getById(String id); - /** - * 根据角色ID查询关联记录 - * @param roleId 角色ID - * @return 关联记录列表 - */ - List<AiMemberRoleProduct> getByRoleId(String roleId); + List<AiMemberRoleProduct> selectListByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query); - /** - * 根据产品ID查询关联记录 - * @param productId 产品ID - * @return 关联记录列表 - */ - List<AiMemberRoleProduct> getByProductId(String productId); - - /** - * 根据公司ID查询关联记录 - * @param companyId 公司ID - * @return 关联记录列表 - */ - List<AiMemberRoleProduct> getByCompanyId(String companyId); - - /** - * 根据角色ID和产品ID查询关联记录 - * @param roleId 角色ID - * @param productId 产品ID - * @return 关联记录列表 - */ - List<AiMemberRoleProduct> getByRoleIdAndProductId(String roleId, String productId); - - /** - * 保存关联记录 - * @param aiMemberRoleProduct 关联记录实体 - * @return 是否保存成功 - */ - boolean saveRoleProduct(AiMemberRoleProduct aiMemberRoleProduct); - - /** - * 批量保存关联记录 - * @param roleProducts 关联记录列表 - * @return 是否保存成功 - */ - boolean saveBatchRoleProducts(List<AiMemberRoleProduct> roleProducts); - - /** - * 更新关联记录 - * @param aiMemberRoleProduct 关联记录实体 - * @return 是否更新成功 - */ - boolean updateRoleProduct(AiMemberRoleProduct aiMemberRoleProduct); - - /** - * 根据ID删除关联记录 - * @param id 关联记录ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据角色ID删除关联记录 - * @param roleId 角色ID - * @return 是否删除成功 - */ - boolean deleteByRoleId(String roleId); - - /** - * 根据产品ID删除关联记录 - * @param productId 产品ID - * @return 是否删除成功 - */ - boolean deleteByProductId(String productId); - - /** - * 根据角色ID和产品ID删除关联记录 - * @param roleId 角色ID - * @param productId 产品ID - * @return 是否删除成功 - */ - boolean deleteByRoleIdAndProductId(String roleId, String productId); + void deleteByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query); } 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 efbb525..e7c15f3 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberRoleService.java @@ -1,6 +1,10 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiMemberRole; +import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -19,74 +23,15 @@ */ AiMemberRole getById(String id); - /** - * 根据公司ID查询角色列表 - * @param companyId 公司ID - * @return 角色列表 - */ - List<AiMemberRole> getByCompanyId(String companyId); + IPage<AiMemberRole> listInPage(AiMemberRole dto, QueryRequest request); - /** - * 根据编码查询角色 - * @param code 角色编码 - * @return 角色信息 - */ - AiMemberRole getByCode(String code); + FebsResponse changeState(String id, Integer state); - /** - * 根据名称查询角色列表 - * @param name 角色名称 - * @return 角色列表 - */ - List<AiMemberRole> getByName(String name); + FebsResponse memberRoleAdd(AiMemberRole dto); - /** - * 根据状态查询角色列表 - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return 角色列表 - */ - List<AiMemberRole> getByState(Integer state); + FebsResponse updateMemberRole(AiMemberRole dto); - /** - * 根据公司ID和状态查询角色列表 - * @param companyId 公司ID - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return 角色列表 - */ - List<AiMemberRole> getByCompanyIdAndState(String companyId, Integer state); + FebsResponse delete(String id); - /** - * 保存角色 - * @param aiMemberRole 角色实体 - * @return 是否保存成功 - */ - boolean saveRole(AiMemberRole aiMemberRole); - - /** - * 批量保存角色 - * @param roles 角色列表 - * @return 是否保存成功 - */ - boolean saveBatchRoles(List<AiMemberRole> roles); - - /** - * 更新角色 - * @param aiMemberRole 角色实体 - * @return 是否更新成功 - */ - boolean updateRole(AiMemberRole aiMemberRole); - - /** - * 根据ID删除角色 - * @param id 角色ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据公司ID删除角色 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); + FebsResponse productSet(AdminMoveChooseInfoDto dto); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java index 4f29e78..9374f9c 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java @@ -19,59 +19,5 @@ */ AiMemberTalkItem getById(String id); - /** - * 根据对话ID查询所有对话项 - * @param memberTalkId 对话ID - * @return 对话项列表 - */ - List<AiMemberTalkItem> getByMemberTalkId(String memberTalkId); - /** - * 根据用户ID查询对话项 - * @param memberId 用户ID - * @return 对话项列表 - */ - List<AiMemberTalkItem> getByMemberId(String memberId); - - /** - * 根据类型查询对话项 - * @param type 类型 1-AI提问 2-用户回答 3-AI分析结果 - * @return 对话项列表 - */ - List<AiMemberTalkItem> getByType(Integer type); - - /** - * 保存对话项 - * @param aiMemberTalkItem 对话项实体 - * @return 是否保存成功 - */ - boolean saveTalkItem(AiMemberTalkItem aiMemberTalkItem); - - /** - * 批量保存对话项 - * @param talkItems 对话项列表 - * @return 是否保存成功 - */ - boolean saveBatchTalkItems(List<AiMemberTalkItem> talkItems); - - /** - * 更新对话项 - * @param aiMemberTalkItem 对话项实体 - * @return 是否更新成功 - */ - boolean updateTalkItem(AiMemberTalkItem aiMemberTalkItem); - - /** - * 根据ID删除对话项 - * @param id 对话项ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据对话ID删除对话项 - * @param memberTalkId 对话ID - * @return 是否删除成功 - */ - boolean deleteByMemberTalkId(String memberTalkId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java index d9d063e..f3cd28b 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java @@ -19,66 +19,5 @@ */ AiMemberTalk getById(String id); - /** - * 根据用户ID查询对话记录 - * @param memberId 用户ID - * @return 对话记录列表 - */ - List<AiMemberTalk> getByMemberId(String memberId); - /** - * 根据产品ID查询对话记录 - * @param productId 产品ID - * @return 对话记录列表 - */ - List<AiMemberTalk> getByProductId(String productId); - - /** - * 根据角色ID查询对话记录 - * @param productRoleId 角色ID - * @return 对话记录列表 - */ - List<AiMemberTalk> getByProductRoleId(String productRoleId); - - /** - * 根据公司ID查询对话记录 - * @param companyId 公司ID - * @return 对话记录列表 - */ - List<AiMemberTalk> getByCompanyId(String companyId); - - /** - * 保存对话记录 - * @param aiMemberTalk 对话记录实体 - * @return 是否保存成功 - */ - boolean saveTalk(AiMemberTalk aiMemberTalk); - - /** - * 批量保存对话记录 - * @param talks 对话记录列表 - * @return 是否保存成功 - */ - boolean saveBatchTalks(List<AiMemberTalk> talks); - - /** - * 更新对话记录 - * @param aiMemberTalk 对话记录实体 - * @return 是否更新成功 - */ - boolean updateTalk(AiMemberTalk aiMemberTalk); - - /** - * 根据ID删除对话记录 - * @param id 对话记录ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据用户ID删除对话记录 - * @param memberId 用户ID - * @return 是否删除成功 - */ - boolean deleteByMemberId(String memberId); } 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 d9081cb..1e2ce17 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java @@ -1,8 +1,14 @@ package cc.mrbird.febs.ai.service; +import cc.mrbird.febs.ai.entity.AiMemberRole; import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; +import java.util.Set; /** * AI产品类别 Service接口 @@ -19,95 +25,19 @@ */ AiProductCategory getById(String id); - /** - * 根据公司ID查询AI产品类别列表 - * @param companyId 公司ID - * @return AI产品类别列表 - */ - List<AiProductCategory> getByCompanyId(String companyId); + List<AiProductCategory> getList(); - /** - * 根据编码查询AI产品类别 - * @param code 类别编码 - * @return AI产品类别信息 - */ - AiProductCategory getByCode(String code); + Map<String, AiProductCategory> selectMapByIds(Set<String> collect); - /** - * 根据名称查询AI产品类别列表 - * @param name 类别名称 - * @return AI产品类别列表 - */ - List<AiProductCategory> getByName(String name); + IPage<AiProductCategory> listInPage(AiProductCategory dto, QueryRequest request); - /** - * 根据状态查询AI产品类别列表 - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品类别列表 - */ - List<AiProductCategory> getByState(Integer state); + FebsResponse changeState(String id, Integer type, Integer state); - /** - * 根据是否推荐查询AI产品类别列表 - * @param hotState 是否推荐到首页 1-推荐 0-不推荐 - * @return AI产品类别列表 - */ - List<AiProductCategory> getByHotState(Integer hotState); + FebsResponse add(AiProductCategory dto); - /** - * 根据公司ID和状态查询AI产品类别列表 - * @param companyId 公司ID - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品类别列表 - */ - List<AiProductCategory> getByCompanyIdAndState(String companyId, Integer state); + FebsResponse update(AiProductCategory dto); - /** - * 根据公司ID和推荐状态查询AI产品类别列表 - * @param companyId 公司ID - * @param hotState 是否推荐到首页 1-推荐 0-不推荐 - * @return AI产品类别列表 - */ - List<AiProductCategory> getByCompanyIdAndHotState(String companyId, Integer hotState); + FebsResponse delete(String id); - /** - * 获取启用状态下的所有AI产品类别,按排序字段升序排列 - * @return 启用的AI产品类别列表 - */ - List<AiProductCategory> getEnabledCategories(); - - /** - * 保存AI产品类别 - * @param aiProductCategory AI产品类别实体 - * @return 是否保存成功 - */ - boolean saveProductCategory(AiProductCategory aiProductCategory); - - /** - * 批量保存AI产品类别 - * @param productCategories AI产品类别列表 - * @return 是否保存成功 - */ - boolean saveBatchProductCategories(List<AiProductCategory> productCategories); - - /** - * 更新AI产品类别 - * @param aiProductCategory AI产品类别实体 - * @return 是否更新成功 - */ - boolean updateProductCategory(AiProductCategory aiProductCategory); - - /** - * 根据ID删除AI产品类别 - * @param id 类别ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据公司ID删除AI产品类别 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); + List<AiProductCategory> categoryTree(); } 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 b71c7d2..54d38b1 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductPointService.java @@ -19,88 +19,5 @@ */ AiProductPoint getById(String id); - /** - * 根据公司ID查询AI产品知识点列表 - * @param companyId 公司ID - * @return AI产品知识点列表 - */ - List<AiProductPoint> getByCompanyId(String companyId); - /** - * 根据类型查询AI产品知识点列表 - * @param isNormal 类型1:普通内容 2:视频号内容 - * @return AI产品知识点列表 - */ - List<AiProductPoint> getByIsNormal(Integer isNormal); - - /** - * 根据视频号用户名查询AI产品知识点列表 - * @param finderUserName 视频号用户名 - * @return AI产品知识点列表 - */ - List<AiProductPoint> getByFinderUserName(String finderUserName); - - /** - * 根据标题查询AI产品知识点列表 - * @param title 标题 - * @return AI产品知识点列表 - */ - List<AiProductPoint> getByTitle(String title); - - /** - * 根据公司ID和类型查询AI产品知识点列表 - * @param companyId 公司ID - * @param isNormal 类型1:普通内容 2:视频号内容 - * @return AI产品知识点列表 - */ - List<AiProductPoint> getByCompanyIdAndIsNormal(String companyId, Integer isNormal); - - /** - * 模糊查询标题或描述包含关键字的AI产品知识点列表 - * @param keyword 关键字 - * @return AI产品知识点列表 - */ - List<AiProductPoint> searchByKeyword(String keyword); - - /** - * 保存AI产品知识点 - * @param aiProductPoint AI产品知识点实体 - * @return 是否保存成功 - */ - boolean saveProductPoint(AiProductPoint aiProductPoint); - - /** - * 批量保存AI产品知识点 - * @param productPoints AI产品知识点列表 - * @return 是否保存成功 - */ - boolean saveBatchProductPoints(List<AiProductPoint> productPoints); - - /** - * 更新AI产品知识点 - * @param aiProductPoint AI产品知识点实体 - * @return 是否更新成功 - */ - boolean updateProductPoint(AiProductPoint aiProductPoint); - - /** - * 根据ID删除AI产品知识点 - * @param id 知识点ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据公司ID删除AI产品知识点 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); - - /** - * 根据视频号FeedID删除AI产品知识点 - * @param feedId 视频号FeedID - * @return 是否删除成功 - */ - boolean deleteByFeedId(String feedId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java index 78853bd..8a7ea6d 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionLinkService.java @@ -19,105 +19,5 @@ */ AiProductQuestionLink getById(String id); - /** - * 根据公司ID查询产品题目关系列表 - * @param companyId 公司ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByCompanyId(String companyId); - /** - * 根据产品题目ID查询产品题目关系列表 - * @param productQuestionId 产品题目ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByProductQuestionId(String productQuestionId); - - /** - * 根据产品ID查询产品题目关系列表 - * @param productId 产品ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByProductId(String productId); - - /** - * 根据公司ID和产品ID查询产品题目关系列表 - * @param companyId 公司ID - * @param productId 产品ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByCompanyIdAndProductId(String companyId, String productId); - - /** - * 根据公司ID和产品题目ID查询产品题目关系列表 - * @param companyId 公司ID - * @param productQuestionId 产品题目ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByCompanyIdAndProductQuestionId(String companyId, String productQuestionId); - - /** - * 根据产品ID和产品题目ID查询产品题目关系列表 - * @param productId 产品ID - * @param productQuestionId 产品题目ID - * @return 产品题目关系列表 - */ - List<AiProductQuestionLink> getByProductIdAndProductQuestionId(String productId, String productQuestionId); - - /** - * 保存产品题目关系 - * @param aiProductQuestionLink 产品题目关系实体 - * @return 是否保存成功 - */ - boolean saveProductQuestionLink(AiProductQuestionLink aiProductQuestionLink); - - /** - * 批量保存产品题目关系 - * @param productQuestionLinks 产品题目关系列表 - * @return 是否保存成功 - */ - boolean saveBatchProductQuestionLinks(List<AiProductQuestionLink> productQuestionLinks); - - /** - * 更新产品题目关系 - * @param aiProductQuestionLink 产品题目关系实体 - * @return 是否更新成功 - */ - boolean updateProductQuestionLink(AiProductQuestionLink aiProductQuestionLink); - - /** - * 根据ID删除产品题目关系 - * @param id 关系ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据产品ID删除产品题目关系 - * @param productId 产品ID - * @return 是否删除成功 - */ - boolean deleteByProductId(String productId); - - /** - * 根据产品题目ID删除产品题目关系 - * @param productQuestionId 产品题目ID - * @return 是否删除成功 - */ - boolean deleteByProductQuestionId(String productQuestionId); - - /** - * 根据公司ID删除产品题目关系 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); - - /** - * 根据产品ID和产品题目ID删除产品题目关系 - * @param productId 产品ID - * @param productQuestionId 产品题目ID - * @return 是否删除成功 - */ - boolean deleteByProductIdAndProductQuestionId(String productId, String productQuestionId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java index 1b31504..1bdf6f1 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductQuestionService.java @@ -19,110 +19,4 @@ */ AiProductQuestion getById(String id); - /** - * 根据公司ID查询AI产品题目列表 - * @param companyId 公司ID - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByCompanyId(String companyId); - - /** - * 根据AI产品类别ID查询AI产品题目列表 - * @param productCategoryId AI产品类别ID - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByProductCategoryId(String productCategoryId); - - /** - * 根据题目查询AI产品题目列表 - * @param title 题目 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByTitle(String title); - - /** - * 根据父ID查询AI产品题目列表 - * @param parentId 父ID - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByParentId(String parentId); - - /** - * 根据难度查询AI产品题目列表 - * @param difficulty 难度:1-简单,2-中等,3-困难 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByDifficulty(Integer difficulty); - - /** - * 根据状态查询AI产品题目列表 - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByState(Integer state); - - /** - * 根据是否正确答案查询AI产品题目列表 - * @param correctAnswer 是否是正确答案 0-否 1-是 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByCorrectAnswer(Integer correctAnswer); - - /** - * 根据公司ID和状态查询AI产品题目列表 - * @param companyId 公司ID - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByCompanyIdAndState(String companyId, Integer state); - - /** - * 根据父ID和状态查询AI产品题目列表(获取同一题目的所有选项) - * @param parentId 父ID - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品题目列表 - */ - List<AiProductQuestion> getByParentIdAndState(String parentId, Integer state); - - /** - * 保存AI产品题目 - * @param aiProductQuestion AI产品题目实体 - * @return 是否保存成功 - */ - boolean saveProductQuestion(AiProductQuestion aiProductQuestion); - - /** - * 批量保存AI产品题目 - * @param productQuestions AI产品题目列表 - * @return 是否保存成功 - */ - boolean saveBatchProductQuestions(List<AiProductQuestion> productQuestions); - - /** - * 更新AI产品题目 - * @param aiProductQuestion AI产品题目实体 - * @return 是否更新成功 - */ - boolean updateProductQuestion(AiProductQuestion aiProductQuestion); - - /** - * 根据ID删除AI产品题目 - * @param id 题目ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据父ID删除AI产品题目(删除整个题目及其选项) - * @param parentId 父ID - * @return 是否删除成功 - */ - boolean deleteByParentId(String parentId); - - /** - * 根据公司ID删除AI产品题目 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java index 384af47..47d2231 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java +++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductRoleService.java @@ -19,74 +19,4 @@ */ AiProductRole getById(String id); - /** - * 根据公司ID查询AI产品角色列表 - * @param companyId 公司ID - * @return AI产品角色列表 - */ - List<AiProductRole> getByCompanyId(String companyId); - - /** - * 根据AI产品ID查询AI产品角色列表 - * @param productId AI产品ID - * @return AI产品角色列表 - */ - List<AiProductRole> getByProductId(String productId); - - /** - * 根据名称查询AI产品角色列表 - * @param name 角色名称 - * @return AI产品角色列表 - */ - List<AiProductRole> getByName(String name); - - /** - * 根据公司ID和产品ID查询AI产品角色列表 - * @param companyId 公司ID - * @param productId AI产品ID - * @return AI产品角色列表 - */ - List<AiProductRole> getByCompanyIdAndProductId(String companyId, String productId); - - /** - * 保存AI产品角色 - * @param aiProductRole AI产品角色实体 - * @return 是否保存成功 - */ - boolean saveProductRole(AiProductRole aiProductRole); - - /** - * 批量保存AI产品角色 - * @param productRoles AI产品角色列表 - * @return 是否保存成功 - */ - boolean saveBatchProductRoles(List<AiProductRole> productRoles); - - /** - * 更新AI产品角色 - * @param aiProductRole AI产品角色实体 - * @return 是否更新成功 - */ - boolean updateProductRole(AiProductRole aiProductRole); - - /** - * 根据ID删除AI产品角色 - * @param id 角色ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据AI产品ID删除AI产品角色 - * @param productId AI产品ID - * @return 是否删除成功 - */ - boolean deleteByProductId(String productId); - - /** - * 根据公司ID删除AI产品角色 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); } 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 7e5b27a..45bf65b 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,10 @@ package cc.mrbird.febs.ai.service; import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.entity.ClothesArt; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -19,96 +23,15 @@ */ AiProduct getById(String id); - /** - * 根据公司ID查询AI产品列表 - * @param companyId 公司ID - * @return AI产品列表 - */ - List<AiProduct> getByCompanyId(String companyId); + IPage<AiProduct> listInPage(AiProduct dto, QueryRequest request); - /** - * 根据编码查询AI产品 - * @param code 产品编码 - * @return AI产品信息 - */ - AiProduct getByCode(String code); + FebsResponse changeState(String id, Integer type, Integer state); - /** - * 根据名称查询AI产品列表 - * @param name 产品名称 - * @return AI产品列表 - */ - List<AiProduct> getByName(String name); + FebsResponse add(AiProduct dto); - /** - * 根据产品类别ID查询AI产品列表 - * @param productCategoryId 产品类别ID - * @return AI产品列表 - */ - List<AiProduct> getByProductCategoryId(String productCategoryId); + FebsResponse update(AiProduct dto); - /** - * 根据状态查询AI产品列表 - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品列表 - */ - List<AiProduct> getByState(Integer state); + FebsResponse delete(String id); - /** - * 根据是否推荐查询AI产品列表 - * @param hotState 是否推荐到首页 1-推荐 0-不推荐 - * @return AI产品列表 - */ - List<AiProduct> getByHotState(Integer hotState); - - /** - * 根据公司ID和状态查询AI产品列表 - * @param companyId 公司ID - * @param state 状态 0-禁用 1-启用 2-已删除 - * @return AI产品列表 - */ - List<AiProduct> getByCompanyIdAndState(String companyId, Integer state); - - /** - * 根据公司ID和推荐状态查询AI产品列表 - * @param companyId 公司ID - * @param hotState 是否推荐到首页 1-推荐 0-不推荐 - * @return AI产品列表 - */ - List<AiProduct> getByCompanyIdAndHotState(String companyId, Integer hotState); - - /** - * 保存AI产品 - * @param aiProduct AI产品实体 - * @return 是否保存成功 - */ - boolean saveProduct(AiProduct aiProduct); - - /** - * 批量保存AI产品 - * @param products AI产品列表 - * @return 是否保存成功 - */ - boolean saveBatchProducts(List<AiProduct> products); - - /** - * 更新AI产品 - * @param aiProduct AI产品实体 - * @return 是否更新成功 - */ - boolean updateProduct(AiProduct aiProduct); - - /** - * 根据ID删除AI产品 - * @param id 产品ID - * @return 是否删除成功 - */ - boolean deleteById(String id); - - /** - * 根据公司ID删除AI产品 - * @param companyId 公司ID - * @return 是否删除成功 - */ - boolean deleteByCompanyId(String companyId); + List<AiProduct> selectList(); } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java index 22bc4e1..a7510ab 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java @@ -27,128 +27,7 @@ @Override public AiMemberAnswerItem getById(String id) { - return this.getById(id); + return aiMemberAnswerItemMapper.selectById(id); } - @Override - public List<AiMemberAnswerItem> getByAnswerId(String answerId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getAnswerId, answerId); - queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByMemberId(String memberId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByProductId(String productId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getProductId, productId); - queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByProductQuestionParentId(String productQuestionParentId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getProductQuestionParentId, productQuestionParentId); - queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByProductQuestionId(String productQuestionId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getProductQuestionId, productQuestionId); - queryWrapper.orderByAsc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByMemberAnswerState(Integer memberAnswerState) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getMemberAnswerState, memberAnswerState); - queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByIsCollected(Integer isCollected) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getIsCollected, isCollected); - queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswerItem> getByCompanyIdAndMemberId(String companyId, String memberId) { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getCompanyId, companyId); - queryWrapper.eq(AiMemberAnswerItem::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswerItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveAnswerItem(AiMemberAnswerItem aiMemberAnswerItem) { - try { - return this.save(aiMemberAnswerItem); - } catch (Exception e) { - log.error("保存答题记录项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchAnswerItems(List<AiMemberAnswerItem> answerItems) { - try { - return this.saveBatch(answerItems); - } catch (Exception e) { - log.error("批量保存答题记录项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateAnswerItem(AiMemberAnswerItem aiMemberAnswerItem) { - try { - return this.updateById(aiMemberAnswerItem); - } catch (Exception e) { - log.error("更新答题记录项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除答题记录项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByAnswerId(String answerId) { - try { - LambdaQueryWrapper<AiMemberAnswerItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswerItem::getAnswerId, answerId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据答题记录ID删除答题记录项失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java index 9a4d288..cc1d109 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java @@ -27,122 +27,7 @@ @Override public AiMemberAnswer getById(String id) { - return this.getById(id); + return aiMemberAnswerMapper.selectById(id); } - @Override - public List<AiMemberAnswer> getByMemberId(String memberId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByProductId(String productId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getProductId, productId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByState(Integer state) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getState, state); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByMemberIdAndState(String memberId, Integer state) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.eq(AiMemberAnswer::getState, state); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByCompanyIdAndMemberId(String companyId, String memberId) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getCompanyId, companyId); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberAnswer> getByScoreRange(Integer minScore, Integer maxScore) { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.ge(AiMemberAnswer::getScore, minScore); - queryWrapper.le(AiMemberAnswer::getScore, maxScore); - queryWrapper.orderByDesc(AiMemberAnswer::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveAnswer(AiMemberAnswer aiMemberAnswer) { - try { - return this.save(aiMemberAnswer); - } catch (Exception e) { - log.error("保存答题记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchAnswers(List<AiMemberAnswer> answers) { - try { - return this.saveBatch(answers); - } catch (Exception e) { - log.error("批量保存答题记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateAnswer(AiMemberAnswer aiMemberAnswer) { - try { - return this.updateById(aiMemberAnswer); - } catch (Exception e) { - log.error("更新答题记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除答题记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByMemberId(String memberId) { - try { - LambdaQueryWrapper<AiMemberAnswer> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberAnswer::getMemberId, memberId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据用户ID删除答题记录失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java index e5969dc..abb33fc 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleCategoryServiceImpl.java @@ -27,119 +27,7 @@ @Override public AiMemberRoleCategory getById(String id) { - return this.getById(id); + return aiMemberRoleCategoryMapper.selectById(id); } - @Override - public List<AiMemberRoleCategory> getByRoleId(String roleId) { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberRoleCategory> getByProductCategoryId(String productCategoryId) { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberRoleCategory> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getCompanyId, companyId); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberRoleCategory> getByRoleIdAndProductCategoryId(String roleId, String productCategoryId) { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId); - queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveRoleCategory(AiMemberRoleCategory aiMemberRoleCategory) { - try { - return this.save(aiMemberRoleCategory); - } catch (Exception e) { - log.error("保存角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchRoleCategories(List<AiMemberRoleCategory> roleCategories) { - try { - return this.saveBatch(roleCategories); - } catch (Exception e) { - log.error("批量保存角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateRoleCategory(AiMemberRoleCategory aiMemberRoleCategory) { - try { - return this.updateById(aiMemberRoleCategory); - } catch (Exception e) { - log.error("更新角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByRoleId(String roleId) { - try { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据角色ID删除角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductCategoryId(String productCategoryId) { - try { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据产品分类ID删除角色产品分类关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByRoleIdAndProductCategoryId(String roleId, String productCategoryId) { - try { - LambdaQueryWrapper<AiMemberRoleCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleCategory::getRoleId, roleId); - queryWrapper.eq(AiMemberRoleCategory::getProductCategoryId, productCategoryId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据角色ID和产品分类ID删除角色产品分类关联记录失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java index 8ba2b70..6bbaf47 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberRoleProductServiceImpl.java @@ -3,7 +3,9 @@ import cc.mrbird.febs.ai.entity.AiMemberRoleProduct; import cc.mrbird.febs.ai.mapper.AiMemberRoleProductMapper; import cc.mrbird.febs.ai.service.AiMemberRoleProductService; +import cn.hutool.core.util.StrUtil; 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; @@ -27,119 +29,19 @@ @Override public AiMemberRoleProduct getById(String id) { - return this.getById(id); + + return aiMemberRoleProductMapper.selectById(id); } @Override - public List<AiMemberRoleProduct> getByRoleId(String roleId) { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId); - return this.list(queryWrapper); + public List<AiMemberRoleProduct> selectListByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query) { + return aiMemberRoleProductMapper.selectList( query); } @Override - public List<AiMemberRoleProduct> getByProductId(String productId) { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getProductId, productId); - return this.list(queryWrapper); + public void deleteByQuery(LambdaQueryWrapper<AiMemberRoleProduct> query) { + aiMemberRoleProductMapper.delete( query); } - @Override - public List<AiMemberRoleProduct> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getCompanyId, companyId); - return this.list(queryWrapper); - } - @Override - public List<AiMemberRoleProduct> getByRoleIdAndProductId(String roleId, String productId) { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId); - queryWrapper.eq(AiMemberRoleProduct::getProductId, productId); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveRoleProduct(AiMemberRoleProduct aiMemberRoleProduct) { - try { - return this.save(aiMemberRoleProduct); - } catch (Exception e) { - log.error("保存角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchRoleProducts(List<AiMemberRoleProduct> roleProducts) { - try { - return this.saveBatch(roleProducts); - } catch (Exception e) { - log.error("批量保存角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateRoleProduct(AiMemberRoleProduct aiMemberRoleProduct) { - try { - return this.updateById(aiMemberRoleProduct); - } catch (Exception e) { - log.error("更新角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByRoleId(String roleId) { - try { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据角色ID删除角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductId(String productId) { - try { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getProductId, productId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据产品ID删除角色产品关联记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByRoleIdAndProductId(String roleId, String productId) { - try { - LambdaQueryWrapper<AiMemberRoleProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRoleProduct::getRoleId, roleId); - queryWrapper.eq(AiMemberRoleProduct::getProductId, productId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据角色ID和产品ID删除角色产品关联记录失败: ", e); - return false; - } - } } 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 c0e8f0a..97ea8dc 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 @@ -1,15 +1,28 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiMemberRole; +import cc.mrbird.febs.ai.entity.AiMemberRoleProduct; import cc.mrbird.febs.ai.mapper.AiMemberRoleMapper; +import cc.mrbird.febs.ai.req.AdminMoveChooseInfoDto; +import cc.mrbird.febs.ai.service.AiMemberRoleProductService; import cc.mrbird.febs.ai.service.AiMemberRoleService; +import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.ai.util.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.entity.ClothesTypeArt; +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.metadata.IPage; +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.Date; import java.util.List; /** @@ -24,106 +37,106 @@ public class AiMemberRoleServiceImpl extends ServiceImpl<AiMemberRoleMapper, AiMemberRole> implements AiMemberRoleService { private final AiMemberRoleMapper aiMemberRoleMapper; + private final AiProductService aiProductService; + private final AiMemberRoleProductService aiMemberRoleProductService; @Override public AiMemberRole getById(String id) { - return this.getById(id); + return aiMemberRoleMapper.selectById(id); } @Override - public List<AiMemberRole> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getCompanyId, companyId); - queryWrapper.orderByDesc(AiMemberRole::getCreatedTime); - return this.list(queryWrapper); + public IPage<AiMemberRole> listInPage(AiMemberRole dto, QueryRequest request) { + + Page<AiMemberRole> page = new Page<>(request.getPageNum(), request.getPageSize()); + LambdaQueryWrapper<AiMemberRole> query = Wrappers.lambdaQuery(AiMemberRole.class); + query.ne(AiMemberRole::getState, 2); + query.orderByAsc(AiMemberRole::getSort); + Page<AiMemberRole> pages = aiMemberRoleMapper.selectPage(page, query); + return pages; } @Override - public AiMemberRole getByCode(String code) { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getCode, code); - return this.getOne(queryWrapper); - } - - @Override - public List<AiMemberRole> getByName(String name) { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getName, name); - queryWrapper.orderByDesc(AiMemberRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberRole> getByState(Integer state) { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getState, state); - queryWrapper.orderByDesc(AiMemberRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberRole> getByCompanyIdAndState(String companyId, Integer state) { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getCompanyId, companyId); - queryWrapper.eq(AiMemberRole::getState, state); - queryWrapper.orderByDesc(AiMemberRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveRole(AiMemberRole aiMemberRole) { - try { - return this.save(aiMemberRole); - } catch (Exception e) { - log.error("保存角色失败: ", e); - return false; + public FebsResponse changeState(String id, Integer state) { + AiMemberRole entity = this.getById(id); + if(ObjectUtil.isNotEmpty(entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiMemberRole.class) + .set(AiMemberRole::getState, state) + .set(AiMemberRole::getUpdatedTime, new Date()) + .eq(AiMemberRole::getId, id)); } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchRoles(List<AiMemberRole> roles) { - try { - return this.saveBatch(roles); - } catch (Exception e) { - log.error("批量保存角色失败: ", e); - return false; - } + public FebsResponse memberRoleAdd(AiMemberRole dto) { + AiMemberRole entity = new AiMemberRole(); + entity.setId(UUID.getSimpleUUIDString()); + entity.setName(dto.getName()); + entity.setCode(dto.getCode()); + entity.setIconImg(dto.getIconImg()); + entity.setSort(dto.getSort()); + entity.setState(dto.getState()); + entity.setCreatedTime(new Date()); + this.save( entity); + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateRole(AiMemberRole aiMemberRole) { - try { - return this.updateById(aiMemberRole); - } catch (Exception e) { - log.error("更新角色失败: ", e); - return false; + public FebsResponse updateMemberRole(AiMemberRole dto) { + + String id = dto.getId(); + AiMemberRole entity = this.getById(id); + if(ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiMemberRole.class) + .set(AiMemberRole::getCode, dto.getCode()) + .set(AiMemberRole::getName, dto.getName()) + .set(AiMemberRole::getIconImg, dto.getIconImg()) + .set(AiMemberRole::getSort, dto.getSort()) + .set(AiMemberRole::getUpdatedTime, new Date()) + .eq(AiMemberRole::getId, id)); + } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除角色失败: ", e); - return false; + public FebsResponse delete(String id) { + AiMemberRole entity = this.getById(id); + if(ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiMemberRole.class) + .set(AiMemberRole::getState, 2) + .set(AiMemberRole::getUpdatedTime, new Date()) + .eq(AiMemberRole::getId, id)); + } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiMemberRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberRole::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除角色失败: ", e); - return false; + public FebsResponse productSet(AdminMoveChooseInfoDto dto) { + String roleId = dto.getRoleId(); + List<String> chooseIds = dto.getChooseIds(); + AiMemberRole aiMemberRole = this.getById(roleId); + if (ObjectUtil.isNotNull(aiMemberRole)) { + aiMemberRoleProductService.deleteByQuery( + Wrappers.lambdaQuery(AiMemberRoleProduct.class) + .eq(AiMemberRoleProduct::getRoleId,roleId) + ); + if(CollUtil.isNotEmpty(chooseIds)){ + Date createdTime = new Date(); + for (String chooseId : chooseIds){ + AiMemberRoleProduct entity = new AiMemberRoleProduct(); + entity.setRoleId(roleId); + entity.setProductId(chooseId); + entity.setCreatedTime(createdTime); + aiMemberRoleProductService.getBaseMapper().insert(entity); + } + } } + return new FebsResponse().success().message("操作成功"); } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java index 4810016..9f239ca 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java @@ -27,87 +27,7 @@ @Override public AiMemberTalkItem getById(String id) { - return this.getById(id); + return aiMemberTalkItemMapper.selectById(id); } - @Override - public List<AiMemberTalkItem> getByMemberTalkId(String memberTalkId) { - LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalkItem::getMemberTalkId, memberTalkId); - queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberTalkItem> getByMemberId(String memberId) { - LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalkItem::getMemberId, memberId); - queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberTalkItem> getByType(Integer type) { - LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalkItem::getType, type); - queryWrapper.orderByAsc(AiMemberTalkItem::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveTalkItem(AiMemberTalkItem aiMemberTalkItem) { - try { - return this.save(aiMemberTalkItem); - } catch (Exception e) { - log.error("保存对话项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchTalkItems(List<AiMemberTalkItem> talkItems) { - try { - return this.saveBatch(talkItems); - } catch (Exception e) { - log.error("批量保存对话项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateTalkItem(AiMemberTalkItem aiMemberTalkItem) { - try { - return this.updateById(aiMemberTalkItem); - } catch (Exception e) { - log.error("更新对话项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除对话项失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByMemberTalkId(String memberTalkId) { - try { - LambdaQueryWrapper<AiMemberTalkItem> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalkItem::getMemberTalkId, memberTalkId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据对话ID删除对话项失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java index 8aaa3f9..ffb78fa 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java @@ -27,95 +27,7 @@ @Override public AiMemberTalk getById(String id) { - return this.getById(id); + return aiMemberTalkMapper.selectById(id); } - @Override - public List<AiMemberTalk> getByMemberId(String memberId) { - LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalk::getMemberId, memberId); - queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberTalk> getByProductId(String productId) { - LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalk::getProductId, productId); - queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberTalk> getByProductRoleId(String productRoleId) { - LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalk::getProductRoleId, productRoleId); - queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiMemberTalk> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalk::getCompanyId, companyId); - queryWrapper.orderByDesc(AiMemberTalk::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveTalk(AiMemberTalk aiMemberTalk) { - try { - return this.save(aiMemberTalk); - } catch (Exception e) { - log.error("保存对话记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchTalks(List<AiMemberTalk> talks) { - try { - return this.saveBatch(talks); - } catch (Exception e) { - log.error("批量保存对话记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateTalk(AiMemberTalk aiMemberTalk) { - try { - return this.updateById(aiMemberTalk); - } catch (Exception e) { - log.error("更新对话记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除对话记录失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByMemberId(String memberId) { - try { - LambdaQueryWrapper<AiMemberTalk> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiMemberTalk::getMemberId, memberId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据用户ID删除对话记录失败: ", e); - return false; - } - } } 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 ca52aa9..a64f47e 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 @@ -1,16 +1,25 @@ package cc.mrbird.febs.ai.service.impl; +import cc.mrbird.febs.ai.entity.AiMemberRole; import cc.mrbird.febs.ai.entity.AiProductCategory; import cc.mrbird.febs.ai.mapper.AiProductCategoryMapper; import cc.mrbird.febs.ai.service.AiProductCategoryService; +import cc.mrbird.febs.ai.util.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +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.metadata.IPage; +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.List; +import java.util.*; /** * AI产品类别 Service实现类 @@ -27,135 +36,120 @@ @Override public AiProductCategory getById(String id) { - return this.getById(id); + return aiProductCategoryMapper.selectById(id); } @Override - public List<AiProductCategory> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getCompanyId, companyId); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); + public List<AiProductCategory> getList() { + LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + query.ne(AiProductCategory::getState, 2); + query.orderByDesc(AiProductCategory::getHotState); + query.orderByAsc(AiProductCategory::getSort); + List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList(query); + return aiProductCategories; } @Override - public AiProductCategory getByCode(String code) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getCode, code); - return this.getOne(queryWrapper); - } - - @Override - public List<AiProductCategory> getByName(String name) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(AiProductCategory::getName, name); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductCategory> getByState(Integer state) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getState, state); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductCategory> getByHotState(Integer hotState) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getHotState, hotState); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductCategory> getByCompanyIdAndState(String companyId, Integer state) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getCompanyId, companyId); - queryWrapper.eq(AiProductCategory::getState, state); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductCategory> getByCompanyIdAndHotState(String companyId, Integer hotState) { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getCompanyId, companyId); - queryWrapper.eq(AiProductCategory::getHotState, hotState); - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductCategory> getEnabledCategories() { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getState, 1); // 1-启用 - queryWrapper.orderByAsc(AiProductCategory::getSort); - queryWrapper.orderByDesc(AiProductCategory::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProductCategory(AiProductCategory aiProductCategory) { - try { - return this.save(aiProductCategory); - } catch (Exception e) { - log.error("保存AI产品类别失败: ", e); - return false; + public Map<String, AiProductCategory> selectMapByIds(Set<String> collect) { + Map<String,AiProductCategory> map = new HashMap<>(); + if(CollUtil.isNotEmpty( collect)){ + List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList( + Wrappers.lambdaQuery(AiProductCategory.class) + .in(AiProductCategory::getId,collect) + ); + if(CollUtil.isNotEmpty(aiProductCategories)){ + aiProductCategories.forEach(aiProductCategory -> map.put(aiProductCategory.getId(),aiProductCategory)); + } } + return map; } @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProductCategories(List<AiProductCategory> productCategories) { - try { - return this.saveBatch(productCategories); - } catch (Exception e) { - log.error("批量保存AI产品类别失败: ", e); - return false; - } + public IPage<AiProductCategory> listInPage(AiProductCategory dto, QueryRequest request) { + + + Page<AiProductCategory> page = new Page<>(request.getPageNum(), request.getPageSize()); + LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + query.ne(AiProductCategory::getState, 2); + query.orderByDesc(AiProductCategory::getHotState); + query.orderByAsc(AiProductCategory::getSort); + Page<AiProductCategory> pages = aiProductCategoryMapper.selectPage(page, query); + return pages; } @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProductCategory(AiProductCategory aiProductCategory) { - try { - return this.updateById(aiProductCategory); - } catch (Exception e) { - log.error("更新AI产品类别失败: ", e); - return false; + public FebsResponse changeState(String id, Integer type, Integer state) { + AiProductCategory entity = this.getById(id); + if(ObjectUtil.isNotNull(entity)){ + if(1 == type){ + aiProductCategoryMapper.update(null, + Wrappers.lambdaUpdate(AiProductCategory.class) + .set(AiProductCategory::getState, state) + .eq(AiProductCategory::getId, id) + ); + } + if(2 == type){ + aiProductCategoryMapper.update(null, + Wrappers.lambdaUpdate(AiProductCategory.class) + .set(AiProductCategory::getHotState, state) + .eq(AiProductCategory::getId, id) + ); + } } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除AI产品类别失败: ", e); - return false; - } + public FebsResponse add(AiProductCategory dto) { + AiProductCategory entity = new AiProductCategory(); + entity.setId(UUID.getSimpleUUIDString()); + entity.setCompanyId(dto.getCompanyId()); + entity.setCode(dto.getCode()); + entity.setName(dto.getName()); + entity.setBackImg(dto.getBackImg()); + entity.setIconImg(dto.getIconImg()); + entity.setSort(dto.getSort()); + entity.setCreatedTime(new Date()); + this.save(entity); + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProductCategory> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductCategory::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除AI产品类别失败: ", e); - return false; + public FebsResponse update(AiProductCategory dto) { + String id = dto.getId(); + AiProductCategory entity = this.getById(id); + if (ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiProductCategory.class) + .set(AiProductCategory::getCode, dto.getCode()) + .set(AiProductCategory::getName, dto.getName()) + .set(AiProductCategory::getBackImg, dto.getBackImg()) + .set(AiProductCategory::getIconImg, dto.getIconImg()) + .set(AiProductCategory::getSort, dto.getSort()) + .set(AiProductCategory::getUpdatedTime, new Date()) + .eq(AiProductCategory::getId, id) + ); } + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse delete(String id) { + + AiProductCategory entity = this.getById(id); + if(ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiProductCategory.class) + .set(AiProductCategory::getState, 2) + .set(AiProductCategory::getUpdatedTime, new Date()) + .eq(AiProductCategory::getId, id)); + + } + return new FebsResponse().success().message("操作成功"); + } + + @Override + public List<AiProductCategory> categoryTree() { + return this.getList() ; } } 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 0aae32b..f76b1d3 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 @@ -27,127 +27,8 @@ @Override public AiProductPoint getById(String id) { - return this.getById(id); + return aiProductPointMapper.selectById(id); } - @Override - public List<AiProductPoint> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getCompanyId, companyId); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - @Override - public List<AiProductPoint> getByIsNormal(Integer isNormal) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getIsNormal, isNormal); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductPoint> getByFinderUserName(String finderUserName) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getFinderUserName, finderUserName); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductPoint> getByTitle(String title) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(AiProductPoint::getTitle, title); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductPoint> getByCompanyIdAndIsNormal(String companyId, Integer isNormal) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getCompanyId, companyId); - queryWrapper.eq(AiProductPoint::getIsNormal, isNormal); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductPoint> searchByKeyword(String keyword) { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.and(wrapper -> wrapper.like(AiProductPoint::getTitle, keyword) - .or() - .like(AiProductPoint::getDescription, keyword)); - queryWrapper.orderByDesc(AiProductPoint::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProductPoint(AiProductPoint aiProductPoint) { - try { - return this.save(aiProductPoint); - } catch (Exception e) { - log.error("保存AI产品知识点失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProductPoints(List<AiProductPoint> productPoints) { - try { - return this.saveBatch(productPoints); - } catch (Exception e) { - log.error("批量保存AI产品知识点失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProductPoint(AiProductPoint aiProductPoint) { - try { - return this.updateById(aiProductPoint); - } catch (Exception e) { - log.error("更新AI产品知识点失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除AI产品知识点失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除AI产品知识点失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByFeedId(String feedId) { - try { - LambdaQueryWrapper<AiProductPoint> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductPoint::getFeedId, feedId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据视频号FeedID删除AI产品知识点失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java index 49cc62c..1bc9905 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionLinkServiceImpl.java @@ -27,154 +27,7 @@ @Override public AiProductQuestionLink getById(String id) { - return this.getById(id); + return aiProductQuestionLinkMapper.selectById(id); } - @Override - public List<AiProductQuestionLink> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestionLink> getByProductQuestionId(String productQuestionId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestionLink> getByProductId(String productId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductId, productId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestionLink> getByCompanyIdAndProductId(String companyId, String productId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId); - queryWrapper.eq(AiProductQuestionLink::getProductId, productId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestionLink> getByCompanyIdAndProductQuestionId(String companyId, String productQuestionId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId); - queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestionLink> getByProductIdAndProductQuestionId(String productId, String productQuestionId) { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductId, productId); - queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId); - queryWrapper.orderByDesc(AiProductQuestionLink::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProductQuestionLink(AiProductQuestionLink aiProductQuestionLink) { - try { - return this.save(aiProductQuestionLink); - } catch (Exception e) { - log.error("保存产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProductQuestionLinks(List<AiProductQuestionLink> productQuestionLinks) { - try { - return this.saveBatch(productQuestionLinks); - } catch (Exception e) { - log.error("批量保存产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProductQuestionLink(AiProductQuestionLink aiProductQuestionLink) { - try { - return this.updateById(aiProductQuestionLink); - } catch (Exception e) { - log.error("更新产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductId(String productId) { - try { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductId, productId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据产品ID删除产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductQuestionId(String productQuestionId) { - try { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据产品题目ID删除产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除产品题目关系失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductIdAndProductQuestionId(String productId, String productQuestionId) { - try { - LambdaQueryWrapper<AiProductQuestionLink> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestionLink::getProductId, productId); - queryWrapper.eq(AiProductQuestionLink::getProductQuestionId, productQuestionId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据产品ID和产品题目ID删除产品题目关系失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java index 90d990b..4084e1c 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductQuestionServiceImpl.java @@ -27,150 +27,7 @@ @Override public AiProductQuestion getById(String id) { - return this.getById(id); + return aiProductQuestionMapper.selectById(id); } - @Override - public List<AiProductQuestion> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getCompanyId, companyId); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByProductCategoryId(String productCategoryId) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getProductCategoryId, productCategoryId); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByTitle(String title) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(AiProductQuestion::getTitle, title); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByParentId(String parentId) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getParentId, parentId); - queryWrapper.orderByAsc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByDifficulty(Integer difficulty) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getDifficulty, difficulty); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByState(Integer state) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getState, state); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByCorrectAnswer(Integer correctAnswer) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getCorrectAnswer, correctAnswer); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByCompanyIdAndState(String companyId, Integer state) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getCompanyId, companyId); - queryWrapper.eq(AiProductQuestion::getState, state); - queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductQuestion> getByParentIdAndState(String parentId, Integer state) { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getParentId, parentId); - queryWrapper.eq(AiProductQuestion::getState, state); - queryWrapper.orderByAsc(AiProductQuestion::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProductQuestion(AiProductQuestion aiProductQuestion) { - try { - return this.save(aiProductQuestion); - } catch (Exception e) { - log.error("保存AI产品题目失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProductQuestions(List<AiProductQuestion> productQuestions) { - try { - return this.saveBatch(productQuestions); - } catch (Exception e) { - log.error("批量保存AI产品题目失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProductQuestion(AiProductQuestion aiProductQuestion) { - try { - return this.updateById(aiProductQuestion); - } catch (Exception e) { - log.error("更新AI产品题目失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除AI产品题目失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByParentId(String parentId) { - try { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getParentId, parentId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据父ID删除AI产品题目失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProductQuestion> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductQuestion::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除AI产品题目失败: ", e); - return false; - } - } } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java index 8086d0b..dbe2908 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductRoleServiceImpl.java @@ -27,109 +27,8 @@ @Override public AiProductRole getById(String id) { - return this.getById(id); + return aiProductRoleMapper.selectById(id); } - @Override - public List<AiProductRole> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductRole::getCompanyId, companyId); - queryWrapper.orderByDesc(AiProductRole::getCreatedTime); - return this.list(queryWrapper); - } - @Override - public List<AiProductRole> getByProductId(String productId) { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductRole::getProductId, productId); - queryWrapper.orderByDesc(AiProductRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductRole> getByName(String name) { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(AiProductRole::getName, name); - queryWrapper.orderByDesc(AiProductRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProductRole> getByCompanyIdAndProductId(String companyId, String productId) { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductRole::getCompanyId, companyId); - queryWrapper.eq(AiProductRole::getProductId, productId); - queryWrapper.orderByDesc(AiProductRole::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProductRole(AiProductRole aiProductRole) { - try { - return this.save(aiProductRole); - } catch (Exception e) { - log.error("保存AI产品角色失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProductRoles(List<AiProductRole> productRoles) { - try { - return this.saveBatch(productRoles); - } catch (Exception e) { - log.error("批量保存AI产品角色失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProductRole(AiProductRole aiProductRole) { - try { - return this.updateById(aiProductRole); - } catch (Exception e) { - log.error("更新AI产品角色失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除AI产品角色失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByProductId(String productId) { - try { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductRole::getProductId, productId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据AI产品ID删除AI产品角色失败: ", e); - return false; - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProductRole> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProductRole::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除AI产品角色失败: ", e); - return false; - } - } } 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 17566dc..a1f0f5f 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,30 @@ package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiProduct; +import cc.mrbird.febs.ai.entity.AiProductCategory; import cc.mrbird.febs.ai.mapper.AiProductMapper; +import cc.mrbird.febs.ai.service.AiProductCategoryService; import cc.mrbird.febs.ai.service.AiProductService; +import cc.mrbird.febs.ai.util.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.mall.entity.ClothesArt; +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.metadata.IPage; +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.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * AI产品表 Service实现类 @@ -24,138 +38,125 @@ public class AiProductServiceImpl extends ServiceImpl<AiProductMapper, AiProduct> implements AiProductService { private final AiProductMapper aiProductMapper; + private final AiProductCategoryService aiProductCategoryService; @Override public AiProduct getById(String id) { - return this.getById(id); + return aiProductMapper.selectById(id); } @Override - public List<AiProduct> getByCompanyId(String companyId) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getCompanyId, companyId); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } + public IPage<AiProduct> listInPage(AiProduct dto, QueryRequest request) { - @Override - public AiProduct getByCode(String code) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getCode, code); - return this.getOne(queryWrapper); - } - - @Override - public List<AiProduct> getByName(String name) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.like(AiProduct::getName, name); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProduct> getByProductCategoryId(String productCategoryId) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getProductCategoryId, productCategoryId); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProduct> getByState(Integer state) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getState, state); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProduct> getByHotState(Integer hotState) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getHotState, hotState); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProduct> getByCompanyIdAndState(String companyId, Integer state) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getCompanyId, companyId); - queryWrapper.eq(AiProduct::getState, state); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - public List<AiProduct> getByCompanyIdAndHotState(String companyId, Integer hotState) { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getCompanyId, companyId); - queryWrapper.eq(AiProduct::getHotState, hotState); - queryWrapper.orderByDesc(AiProduct::getSort); - queryWrapper.orderByDesc(AiProduct::getCreatedTime); - return this.list(queryWrapper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveProduct(AiProduct aiProduct) { - try { - return this.save(aiProduct); - } catch (Exception e) { - log.error("保存AI产品失败: ", e); - return false; + Page<AiProduct> page = new Page<>(request.getPageNum(), request.getPageSize()); + LambdaQueryWrapper<AiProduct> query = Wrappers.lambdaQuery(AiProduct.class); + if (ObjectUtil.isNotNull(dto.getProductCategoryId())){ + query.eq(AiProduct::getProductCategoryId, dto.getProductCategoryId()); } + query.ne(AiProduct::getState, 2); + query.orderByDesc(AiProduct::getHotState); + query.orderByAsc(AiProduct::getSort); + Page<AiProduct> pages = aiProductMapper.selectPage(page, query); + List<AiProduct> records = pages.getRecords(); + if (CollUtil.isNotEmpty( records)){ + Set<String> collect = records.stream().map(AiProduct::getProductCategoryId).collect(Collectors.toSet()); + if(CollUtil.isNotEmpty( collect)){ + Map<String,AiProductCategory> map = aiProductCategoryService.selectMapByIds(collect); + for (AiProduct record : records){ + AiProductCategory orDefault = map.getOrDefault(record.getProductCategoryId(), null); + if(ObjectUtil.isNotNull(orDefault)){ + record.setProductCategoryName(orDefault.getName()); + } + } + } + } + return pages; } @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveBatchProducts(List<AiProduct> products) { - try { - return this.saveBatch(products); - } catch (Exception e) { - log.error("批量保存AI产品失败: ", e); - return false; + public FebsResponse changeState(String id, Integer type, Integer state) { + + AiProduct entity = this.getById(id); + if(ObjectUtil.isNotNull(entity)){ + if(1 == type){ + aiProductMapper.update(null, + Wrappers.lambdaUpdate(AiProduct.class) + .set(AiProduct::getState, state) + .eq(AiProduct::getId, id) + ); + } + if(2 == type){ + aiProductMapper.update(null, + Wrappers.lambdaUpdate(AiProduct.class) + .set(AiProduct::getHotState, state) + .eq(AiProduct::getId, id) + ); + } } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateProduct(AiProduct aiProduct) { - try { - return this.updateById(aiProduct); - } catch (Exception e) { - log.error("更新AI产品失败: ", e); - return false; - } + public FebsResponse add(AiProduct dto) { + AiProduct entity = new AiProduct(); + entity.setId(UUID.getSimpleUUIDString()); + entity.setCompanyId(dto.getCompanyId()); + entity.setCode(dto.getCode()); + entity.setName(dto.getName()); + entity.setBackImg(dto.getBackImg()); + entity.setIconImg(dto.getIconImg()); + entity.setSort(dto.getSort()); + entity.setProductCategoryId(dto.getProductCategoryId()); + entity.setScene(dto.getScene()); + entity.setTarget(dto.getTarget()); + entity.setDescription(dto.getDescription()); + entity.setQuestionCount(dto.getQuestionCount()); + entity.setCreatedTime(new Date()); + this.save(entity); + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteById(String id) { - try { - return this.removeById(id); - } catch (Exception e) { - log.error("删除AI产品失败: ", e); - return false; + public FebsResponse update(AiProduct dto) { + String id = dto.getId(); + AiProduct entity = this.getById(id); + if (ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiProduct.class) + .set(AiProduct::getCode, dto.getCode()) + .set(AiProduct::getName, dto.getName()) + .set(AiProduct::getBackImg, dto.getBackImg()) + .set(AiProduct::getIconImg, dto.getIconImg()) + .set(AiProduct::getSort, dto.getSort()) + .set(AiProduct::getProductCategoryId, dto.getProductCategoryId()) + .set(AiProduct::getScene, dto.getScene()) + .set(AiProduct::getTarget, dto.getTarget()) + .set(AiProduct::getDescription, dto.getDescription()) + .set(AiProduct::getQuestionCount, dto.getQuestionCount()) + .set(AiProduct::getUpdatedTime, new Date()) + .eq(AiProduct::getId, id) + ); } + return new FebsResponse().success().message("操作成功"); } @Override - @Transactional(rollbackFor = Exception.class) - public boolean deleteByCompanyId(String companyId) { - try { - LambdaQueryWrapper<AiProduct> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AiProduct::getCompanyId, companyId); - return this.remove(queryWrapper); - } catch (Exception e) { - log.error("根据公司ID删除AI产品失败: ", e); - return false; + public FebsResponse delete(String id) { + + AiProduct entity = this.getById(id); + if(ObjectUtil.isNotNull( entity)){ + this.update(null, + Wrappers.lambdaUpdate(AiProduct.class) + .set(AiProduct::getState, 2) + .set(AiProduct::getUpdatedTime, new Date()) + .eq(AiProduct::getId, id)); + } + return new FebsResponse().success().message("操作成功"); + } + + @Override + public List<AiProduct> selectList() { + return aiProductMapper.selectList( null); } } diff --git a/src/main/java/cc/mrbird/febs/ai/util/UUID.java b/src/main/java/cc/mrbird/febs/ai/util/UUID.java new file mode 100644 index 0000000..848afb4 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/util/UUID.java @@ -0,0 +1,495 @@ +package cc.mrbird.febs.ai.util; + +import com.sun.xml.internal.ws.util.UtilException; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable<UUID> +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static String getSimpleUUIDString() + { + return randomUUID(true).toString(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + * <p> + * 版本号具有以下含意: + * <ul> + * <li>1 基于时间的 UUID + * <li>2 DCE 安全 UUID + * <li>3 基于名称的 UUID + * <li>4 随机生成的 UUID + * </ul> + * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + * <p> + * 变体号具有以下含意: + * <ul> + * <li>0 为 NCS 向后兼容保留 + * <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF RFC 4122</a>(Leach-Salz), 用于此类 + * <li>6 保留,微软向后兼容 + * <li>7 保留供以后定义使用 + * </ul> + * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + * <p> + * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。<br> + * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + * <p> + * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br> + * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + * <p> + * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + * <p> + * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + * <p> + * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + * <p> + * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。<br> + * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + * <p> + * UUID 的字符串表示形式由此 BNF 描述: + * + * <pre> + * {@code + * UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node> + * time_low = 4*<hexOctet> + * time_mid = 2*<hexOctet> + * time_high_and_version = 2*<hexOctet> + * variant_and_sequence = 2*<hexOctet> + * node = 6*<hexOctet> + * hexOctet = <hexDigit><hexDigit> + * hexDigit = [0-9a-fA-F] + * } + * </pre> + * + * </blockquote> + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + * <p> + * UUID 的字符串表示形式由此 BNF 描述: + * + * <pre> + * {@code + * UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node> + * time_low = 4*<hexOctet> + * time_mid = 2*<hexOctet> + * time_high_and_version = 2*<hexOctet> + * variant_and_sequence = 2*<hexOctet> + * node = 6*<hexOctet> + * hexOctet = <hexDigit><hexDigit> + * hexDigit = [0-9a-fA-F] + * } + * </pre> + * + * </blockquote> + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + * <p> + * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + * <p> + * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new RuntimeException("UUID生成异常"); + } + } + + /** + * 获取随机数生成器对象<br> + * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java b/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java index bb438ba..75b2452 100644 --- a/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java +++ b/src/main/java/cc/mrbird/febs/common/entity/AiBaseEntity.java @@ -31,5 +31,5 @@ * 主键 (UUID) */ @TableId(value = "id",type = IdType.ASSIGN_UUID) - private Long id; + private String id; } diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java index bc97182..bb898ce 100644 --- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java +++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java @@ -9,6 +9,7 @@ import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import java.util.Date; @@ -19,6 +20,7 @@ **/ @Slf4j @Component +@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true") public class AgentConsumer { @Autowired diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 96eb464..0d6fbb2 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -18,7 +18,7 @@ username: ct_test password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://120.27.238.55:3406/clothes_test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 + url: jdbc:mysql://120.27.238.55:3406/ai_one?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 redis: # Redis数据库索引(默认为 0) @@ -89,4 +89,4 @@ path: /mnt/sdc/webresource/file/ system: - job: true \ No newline at end of file + job: false \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html new file mode 100644 index 0000000..31c34f2 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/add.html @@ -0,0 +1,139 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole-add" lay-title="新增"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="memberRole-add"> + <form class="layui-form" action="" lay-filter="memberRole-add-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <div class="layui-tab-item layui-show"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="memberRoleImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="memberRoleImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + </div> + </div> + </div> + + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="memberRole-add-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + $view = $('#memberRole-add'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + element = layui.element; + + form.render(); + + //图片上传 + upload.render({ + elem: '#memberRoleImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#memberRoleImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + form.on('submit(memberRole-add-form-submit)', function (data) { + $.ajax({ + 'url':ctx + 'admin/memberRole/add', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-memberRole').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html new file mode 100644 index 0000000..8f9ce63 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/info.html @@ -0,0 +1,167 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole-Info" lay-title="编辑"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="memberRole-info"> + <form class="layui-form" action="" lay-filter="memberRole-info-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <input type="text" name="id" + placeholder="" autoComplete="off" class="layui-input febs-hide"> + <div class="layui-tab-item layui-show"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="memberRoleImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="memberRoleImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="memberRole-info-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + .layui-table-cell { + height:auto; + } + .layui-upload-list { + margin: 0 !important; + } + .multi-images { + margin: 0 5px !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + form = layui.form, + $view = $('#memberRole-info'), + aiMemberRole = [[${aiMemberRole}]], + upload = layui.upload, + validate = layui.validate; + + form.render(); + + //图片上传 + upload.render({ + elem: '#memberRoleImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#memberRoleImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + setTimeout(() => { + initMemberRoleInfo(); + }, 500); + function initMemberRoleInfo() { + form.val("memberRole-info-form", { + "id": aiMemberRole.id, + "name": aiMemberRole.name, + "code": aiMemberRole.code, + "iconImg": aiMemberRole.iconImg, + "sort": aiMemberRole.sort, + }); + + + $('#memberRoleImageUpload').append('<img src="' + aiMemberRole.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">'); + $("#iconImg").val(aiMemberRole.iconImg); + + } + + form.on('submit(memberRole-info-form-submit)', function (data) { + $.ajax({ + 'url':ctx + 'admin/memberRole/update', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-memberRole').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html new file mode 100644 index 0000000..fb030b9 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/list.html @@ -0,0 +1,246 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-memberRole" lay-title="角色类型"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="memberRole-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-form-item"> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="memberRoleTable" lay-data="{id: 'memberRoleTable'}"></table> + + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + ::-webkit-scrollbar { + height: 20px !important; + background-color: #f4f4f4; + } + </style> + </div> + </div> + </div> + </div> +</div> + +<script type="text/html" id="memberRoleToolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="memberRoleList:add" lay-event="memberRoleAdd">新增</button> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="memberRoleList:productSet" lay-event="productSet">产品配置</button> + </div> +</script> + +<script type="text/html" id="memberRoleOption"> + <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="memberRoleList:info" lay-event="memberRoleInfoEvent">编辑</button> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="memberRoleList:info" lay-event="memberRoleDeleteEvent">删除</button> +</script> + + +<script type="text/html" id="memberRoleStateSwitch"> + {{# if(d.state === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="memberRoleStateSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="memberRoleStateSwitch"> + {{# } }} +</script> + +<style> + .layui-form-onswitch { + background-color: #5FB878 !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-memberRole'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'orderNum', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initMemberRoleTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(memberRoleTable)', function (obj) { + console.log("触发事件:", obj.event); // 调试信息 + var data = obj.data, + layEvent = obj.event; + + if (layEvent === 'seeImage') { + var t = $view.find('#seeImage'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "小图标", + skin: 'layui-layer-rim', //加上边框 + area: ['100%', '100%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + + if (layEvent === 'memberRoleInfoEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.open('编辑','modules/ai/memberRole/info/' + data.id, { + btn: ['提交', '取消'], + area: ['100%', '100%'], + yes: function (index, layero) { + $('#febs-memberRole-Info').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'memberRoleDeleteEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.confirm('删除', '确认删除?', function () { + memberRoleDeleteEvent(data.id); + }); + } + }); + + form.on('switch(memberRoleStateSwitch)', function (data) { + if (data.elem.checked) { + memberRoleStateSwitch(data.value,1); + } else { + memberRoleStateSwitch(data.value,0); + } + }) + function memberRoleStateSwitch(id,state) { + febs.get(ctx + 'admin/memberRole/changeState/' + id+'/' + state, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + function memberRoleDeleteEvent(id) { + febs.get(ctx + 'admin/memberRole/delete/' + id, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + + // 初始化表格操作栏各个按钮功能 + table.on('toolbar(memberRoleTable)', function (obj) { + let data = obj.data, + layEvent = obj.event; + if(layEvent === 'memberRoleAdd'){ + febs.modal.open('新增', 'modules/ai/memberRole/add/', { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-memberRole-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'productSet') { + var checkData = table.checkStatus('memberRoleTable').data; + if (checkData.length > 1 || checkData.length === 0) { + febs.alert.warn('每次操作只能操作一行数据'); + return; + } + febs.modal.open('产品配置', 'modules/ai/memberRole/productSet/' + checkData[0].id, { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#product-set').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + }); + + function initMemberRoleTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'memberRoleTable', + url: ctx + 'admin/memberRole/list', + toolbar:"#memberRoleToolbar", + defaultToolbar:[], + cols: [[ + {type: 'checkbox'}, + {type: 'numbers', title: '', width: 80}, + {title: '操作', toolbar: '#memberRoleOption', minWidth: 200, align: 'center'}, + {field: 'state', title: '状态', templet: '#memberRoleStateSwitch', minWidth: 130,align:'center'}, + {field: 'sort', title: '排序', minWidth: 100,align:'center'}, + {field: 'code', title: '编码', minWidth: 100,align:'center'}, + {field: 'name', title: '名称', minWidth: 100,align:'center'}, + {field: 'image',title: '小图标', + templet: function (d) { + return '<a lay-event="seeImage">' + + '<img id="seeImage' + d.id + '" src="' + d.iconImg + + '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' + + '</a>'; + }, + minWidth: 150,align: 'center'}, + {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'}, + ]] + }); + } + + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + // 获取查询参数 + function getQueryParams() { + return { + }; + } + + }) +</script> diff --git a/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html b/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html new file mode 100644 index 0000000..f9b3857 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/memberRole/productSet.html @@ -0,0 +1,128 @@ +<div class="layui-fluid layui-anim febs-anim" id="product-set" lay-title="产品配置"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="product-type-set"> + <form class="layui-form" action="" lay-filter="product-type-set-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">产品配置</li> + </ul> + <div class="layui-tab-content"> + <input type="text" name="roleId" + placeholder="" autoComplete="off" class="layui-input febs-hide"> + <div class="layui-tab-item layui-show"> + <div class="layui-form-item"> + <div id="productSetMove"></div> + </div> + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="product-type-set-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs','form', 'transfer'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + form = layui.form, + transfer = layui.transfer, + productTypeAll = [[${productAll}]], + productTypeChoose = [[${productSelected}]], + roleId = [[${roleId}]], + $view = $('#product-set'), + + $productSetMoveQuery = $view.find('#productSetMoveQuery') + ; + + // 查询按钮 + $productSetMoveQuery.on('click', function () { + console.log(transfer.getData('productSetMove-set')) + + let data1 = transfer.getData('productSetMove-set'); + //获取data1中的value,返回一个数组 + let productIdList = data1.map(function(item){ + return item.value; + }); + + console.log(productIdList) + }); + + + form.render(); + + initProductTypeSet(); + + function initProductTypeSet() { + console.log("productTypeAll:", productTypeAll); // 调试信息 + console.log("productTypeChoose:", productTypeChoose); // 调试信息 + console.log("roleId:", roleId); // 调试信息 + form.val("product-type-set-form", { + "roleId": roleId, + }); + // 转换数据格式(假设接口返回的数据结构需要处理) + var dataLeft = productTypeAll.map(function(item){ + return { + value: item.id, // 值字段 + title: item.name // 显示文本 + } + }); + var dataRight = productTypeChoose.map(function(item){ + return { + value: item, // 值字段 + } + }); + + // 渲染穿梭框 + transfer.render({ + elem: '#productSetMove', + data: dataLeft, + id: 'productSetMove-set', // 唯一标识 + title: ['待选择列表', '已选择列表'], + width: 300, + height: 400, + showSearch: true, + value: productTypeChoose, + }); + } + + form.on('submit(product-type-set-form-submit)', function (data) { + let data1 = transfer.getData('productSetMove-set'); + //获取data1中的value,返回一个数组 + let productIdList = data1.map(function(item){ + return item.value; + }); + data.field.chooseIds = productIdList; + data.field.roleId = roleId; + $.ajax({ + 'url':ctx + 'admin/memberRole/productSet', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-type').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/product/add.html b/src/main/resources/templates/febs/views/modules/ai/product/add.html new file mode 100644 index 0000000..abb0c34 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/product/add.html @@ -0,0 +1,283 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-product-add" lay-title="新增"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="product-add"> + <form class="layui-form" action="" lay-filter="product-add-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <div class="layui-tab-item layui-show"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品分类:</label> + <div class="layui-input-block"> + <div id="product-category"></div> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">背景图片:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productBackImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productBackImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">场景:</label> + <div class="layui-input-block"> + <input type="text" name="scene" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">目标:</label> + <div class="layui-input-block"> + <input type="text" name="target" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">出题数量:</label> + <div class="layui-input-block"> + <input type="number" name="questionCount" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">详情:</label> + <div class="layui-input-block"> + <div style="border: 1px solid #ccc;"> + <div id="product-toolbar-container" class="toolbar"></div> + <div id="product-text-container" class="text" style="height: 450px;"></div> + </div> + </div> + </div> + + </div> + </div> + </div> + + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="product-add-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + $view = $('#product-add'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + element = layui.element; + + form.render(); + + var category = xmSelect.render({ + el: '#product-category', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + tips: '请选择', + filterable: true, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) + + febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + }) + + const E = window.wangEditor; + const editor = new E('#product-toolbar-container', '#product-text-container'); // 传入两个元素 + editor.config.showLinkImg = false; + editor.config.uploadFileName = 'file'; + editor.config.customUploadImg = function (files, insertImgFn) { + // files 是 input 中选中的文件列表 + // insertImgFn 是获取图片 url 后,插入到编辑器的方法 + // 上传图片,返回结果,将图片插入到编辑器中 + for (let i = 0; i < files.length; i++){ + var form = new FormData(); + form.append("file", files[0]); + $.ajax({ + url:'/admin/goods/uploadFileBase64', + type: "post", + processData: false, + contentType: false, + data: form, + dataType: 'json', + success(res) { + // 上传代码返回结果之后,将图片插入到编辑器中 + insertImgFn(res.data.src, res.data.title, '') + } + }) + } + }; + editor.create(); + //图片上传 + upload.render({ + elem: '#productImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + //图片上传 + upload.render({ + elem: '#productBackImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#backImg").val(res.data.src); + } + }); + + form.on('submit(product-add-form-submit)', function (data) { + data.field.productCategoryId = category.getValue('valueStr'); + data.field.description = editor.txt.html(); + $.ajax({ + 'url':ctx + 'admin/product/add', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-product').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> diff --git a/src/main/resources/templates/febs/views/modules/ai/product/info.html b/src/main/resources/templates/febs/views/modules/ai/product/info.html new file mode 100644 index 0000000..6ec3669 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/product/info.html @@ -0,0 +1,328 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-product-Info" lay-title="编辑"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="product-info"> + <form class="layui-form" action="" lay-filter="product-info-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <input type="text" name="id" + placeholder="" autoComplete="off" class="layui-input febs-hide"> + <div class="layui-tab-item layui-show"> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">商品分类:</label> + <div class="layui-input-block"> + <div id="product-category"></div> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">背景图片:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productBackImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productBackImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">场景:</label> + <div class="layui-input-block"> + <input type="text" name="scene" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">目标:</label> + <div class="layui-input-block"> + <input type="text" name="target" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">出题数量:</label> + <div class="layui-input-block"> + <input type="number" name="questionCount" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">详情:</label> + <div class="layui-input-block"> + <div style="border: 1px solid #ccc;"> + <div id="product-toolbar-container" class="toolbar"></div> + <div id="product-text-container" class="text" style="height: 450px;"></div> + </div> + </div> + </div> + + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="product-info-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + .layui-table-cell { + height:auto; + } + .layui-upload-list { + margin: 0 !important; + } + .multi-images { + margin: 0 5px !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + form = layui.form, + $view = $('#product-info'), + aiProduct = [[${aiProduct}]], + upload = layui.upload, + validate = layui.validate; + + form.render(); + + var category = xmSelect.render({ + el: '#product-category', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + tips: '请选择', + filterable: true, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) + + febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + }) + + const E = window.wangEditor; + const editor = new E('#product-toolbar-container', '#product-text-container'); // 传入两个元素 + editor.config.showLinkImg = false; + editor.config.uploadFileName = 'file'; + editor.config.customUploadImg = function (files, insertImgFn) { + // files 是 input 中选中的文件列表 + // insertImgFn 是获取图片 url 后,插入到编辑器的方法 + // 上传图片,返回结果,将图片插入到编辑器中 + for (let i = 0; i < files.length; i++){ + var form = new FormData(); + form.append("file", files[0]); + $.ajax({ + url:'/admin/goods/uploadFileBase64', + type: "post", + processData: false, + contentType: false, + data: form, + dataType: 'json', + success(res) { + // 上传代码返回结果之后,将图片插入到编辑器中 + insertImgFn(res.data.src, res.data.title, '') + } + }) + } + }; + editor.create(); + + //图片上传 + upload.render({ + elem: '#productImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + //图片上传 + upload.render({ + elem: '#productBackImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#backImg").val(res.data.src); + } + }); + + + setTimeout(() => { + initProductInfo(); + }, 500); + function initProductInfo() { + form.val("product-info-form", { + "id": aiProduct.id, + "name": aiProduct.name, + "code": aiProduct.code, + "scene": aiProduct.scene, + "target": aiProduct.target, + "questionCount": aiProduct.questionCount, + "sort": aiProduct.sort, + }); + + + var categoryList = []; + categoryList.push(aiProduct.productCategoryId) + category.setValue(categoryList); + + $('#productImageUpload').append('<img src="' + aiProduct.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">'); + $("#iconImg").val(aiProduct.iconImg); + + + $('#productBackImageUpload').append('<img src="' + aiProduct.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">'); + $("#backImg").val(aiProduct.backImg); + + + editor.txt.html(aiProduct.description); + + } + + form.on('submit(product-info-form-submit)', function (data) { + data.field.productCategoryId = category.getValue('valueStr'); + data.field.description = editor.txt.html(); + $.ajax({ + 'url':ctx + 'admin/product/update', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-product').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/product/list.html b/src/main/resources/templates/febs/views/modules/ai/product/list.html new file mode 100644 index 0000000..581d9df --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/product/list.html @@ -0,0 +1,329 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-product" lay-title="产品"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="product-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-row layui-col-space6 layui-form-item"> + <div class="layui-col-lg3"> + <label class="layui-form-label">产品分类:</label> + <div class="layui-input-block"> + <div id="product-category-query"></div> + </div> + </div> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="productTable" lay-data="{id: 'productTable'}"></table> + + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + ::-webkit-scrollbar { + height: 20px !important; + background-color: #f4f4f4; + } + </style> + </div> + </div> + </div> + </div> +</div> + +<script type="text/html" id="productToolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" type="button" shiro:hasPermission="categoryList:add" lay-event="productAdd">新增</button> + </div> +</script> + +<script type="text/html" id="productOption"> + <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productInfoEvent">编辑</button> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productDeleteEvent">删除</button> +</script> + + +<script type="text/html" id="productStateSwitch"> + {{# if(d.state === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productStateSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productStateSwitch"> + {{# } }} +</script> + + +<script type="text/html" id="productHotStateSwitch"> + {{# if(d.hotState === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productHotStateSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productHotStateSwitch"> + {{# } }} +</script> + +<style> + .layui-form-onswitch { + background-color: #5FB878 !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-product'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'orderNum', type: null}, + tableIns; + + form.render(); + + var category = xmSelect.render({ + el: '#product-category-query', + language: 'zn', + prop : { + value : 'id', + children : 'child' + }, + iconfont: { + parent: 'hidden', + }, + tips: '请选择', + filterable: true, + radio: true, + clickClose: true, + tree: { + show: true, + //非严格模式 + strict: false, + }, + data: [] + }) + + febs.get(ctx + 'admin/productCategory/categoryTree', null, function(res) { + category.update({ + data : res.data, + autoRow: true, + }); + }) + + // 表格初始化 + setTimeout(() => { + initproductTable(); + }, 500); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(productTable)', function (obj) { + console.log("触发事件:", obj.event); // 调试信息 + var data = obj.data, + layEvent = obj.event; + + if (layEvent === 'seeImage') { + var t = $view.find('#seeImage'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "小图标", + skin: 'layui-layer-rim', //加上边框 + area: ['100%', '100%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + + if (layEvent === 'seeBackImage') { + var t = $view.find('#seeBackImage'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "背景图片", + skin: 'layui-layer-rim', //加上边框 + area: ['100%', '100%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + + if (layEvent === 'productInfoEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.open('编辑','modules/ai/product/info/' + data.id, { + btn: ['提交', '取消'], + area: ['100%', '100%'], + yes: function (index, layero) { + $('#febs-product-Info').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'productDeleteEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.confirm('删除', '确认删除?', function () { + productDeleteEvent(data.id); + }); + } + }); + + form.on('switch(productStateSwitch)', function (data) { + if (data.elem.checked) { + productSwitch(data.value,1,1); + } else { + productSwitch(data.value,1,0); + } + }) + form.on('switch(productHotStateSwitch)', function (data) { + if (data.elem.checked) { + productSwitch(data.value,2,1); + } else { + productSwitch(data.value,2,0); + } + }) + function productSwitch(id,type,state) { + febs.get(ctx + 'admin/product/changeState/' + id+'/'+ type+'/' + state, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + + function productDeleteEvent(id) { + febs.get(ctx + 'admin/product/delete/' + id, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + + // 初始化表格操作栏各个按钮功能 + table.on('toolbar(productTable)', function (obj) { + let data = obj.data, + layEvent = obj.event; + if(layEvent === 'productAdd'){ + febs.modal.open('新增', 'modules/ai/product/add/', { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-product-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'productSet') { + var checkData = table.checkStatus('productTable').data; + if (checkData.length > 1 || checkData.length === 0) { + febs.alert.warn('每次操作只能操作一行数据'); + return; + } + febs.modal.open('工艺配置', 'modules/clothesType/productSet/' + checkData[0].id, { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#art-set').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + }); + + function initproductTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'productTable', + url: ctx + 'admin/product/list', + toolbar:"#productToolbar", + defaultToolbar:[], + cols: [[ + {type: 'checkbox'}, + {type: 'numbers', title: '', width: 80}, + {title: '操作', toolbar: '#productOption', minWidth: 200, align: 'center'}, + {field: 'hotState', title: '推荐首页', templet: '#productHotStateSwitch', minWidth: 130,align:'center'}, + {field: 'state', title: '状态', templet: '#productStateSwitch', minWidth: 130,align:'center'}, + {field: 'productCategoryName', title: '产品分类', minWidth: 100,align:'center'}, + {field: 'sort', title: '排序', minWidth: 100,align:'center'}, + {field: 'code', title: '编码', minWidth: 100,align:'center'}, + {field: 'name', title: '名称', minWidth: 100,align:'center'}, + {field: 'iconImg',title: '小图标', + templet: function (d) { + return '<a lay-event="seeImage">' + + '<img id="seeImage' + d.id + '" src="' + d.iconImg + + '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' + + '</a>'; + }, + minWidth: 150,align: 'center'}, + {field: 'backImg',title: '背景图', + templet: function (d) { + return '<a lay-event="seeBackImage">' + + '<img id="seeBackImage' + d.id + '" src="' + d.backImg + + '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' + + '</a>'; + }, + minWidth: 150,align: 'center'}, + {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'}, + ]] + }); + } + + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + + var categoryList = []; + category.setValue(categoryList); + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + // 获取查询参数 + function getQueryParams() { + return { + productCategoryId: category.getValue('valueStr'), + }; + } + + }) +</script> diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html new file mode 100644 index 0000000..b25cda5 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/add.html @@ -0,0 +1,179 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory-add" lay-title="新增"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="productCategory-add"> + <form class="layui-form" action="" lay-filter="productCategory-add-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <div class="layui-tab-item layui-show"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productCategoryImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">背景图片:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryBackImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productCategoryBackImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + </div> + </div> + </div> + + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="productCategory-add-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> + +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect','jquery'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + laydate = layui.laydate, + eleTree = layui.eleTree, + $view = $('#productCategory-add'), + layedit = layui.layedit, + upload = layui.upload, + validate = layui.validate, + element = layui.element; + + form.render(); + + //图片上传 + upload.render({ + elem: '#productCategoryImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productCategoryImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + //图片上传 + upload.render({ + elem: '#productCategoryBackImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productCategoryBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#backImg").val(res.data.src); + } + }); + + form.on('submit(productCategory-add-form-submit)', function (data) { + $.ajax({ + 'url':ctx + 'admin/productCategory/add', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-productCategory').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html new file mode 100644 index 0000000..96bb4a2 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/info.html @@ -0,0 +1,213 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory-Info" lay-title="编辑"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-fluid" id="productCategory-info"> + <form class="layui-form" action="" lay-filter="productCategory-info-form"> + <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief"> + <ul class="layui-tab-title"> + <li class="layui-this">基础信息</li> + </ul> + <div class="layui-tab-content"> + <input type="text" name="id" + placeholder="" autoComplete="off" class="layui-input febs-hide"> + <div class="layui-tab-item layui-show"> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">名称:</label> + <div class="layui-input-block"> + <input type="text" name="name" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">编码:</label> + <div class="layui-input-block"> + <input type="text" name="code" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">排序:</label> + <div class="layui-input-block"> + <input type="number" name="sort" lay-verify="required" + placeholder="" autocomplete="off" class="layui-input"> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">小图标:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productCategoryImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="iconImg" lay-verify="required" name="iconImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item"> + <div class="layui-col-lg6"> + <label class="layui-form-label febs-form-item-require">背景图片:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn layui-btn-normal layui-btn" id="productCategoryBackImageUploadButton">上传</button> + <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;"> + <div class="layui-upload-list" id="productCategoryBackImageUpload"></div> + </blockquote> + </div> + </div> + </div> + </div> + + <div class="layui-row layui-col-space10 layui-form-item febs-hide"> + <div class="layui-col-lg6"> + <label class="layui-form-label">小图标链接:</label> + <div class="layui-input-block"> + <input type="text" id="backImg" lay-verify="required" name="backImg" autocomplete="off" class="layui-input" readonly> + </div> + </div> + </div> + + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="productCategory-info-form-submit" id="submit">保存</button> + </div> + </form> + </div> + </div> + </div> +</div> +<style> + .blue-border { + border-left-color: #2db7f5; + font-size: 18px; + } + .layui-table-cell { + height:auto; + } + .layui-upload-list { + margin: 0 !important; + } + .multi-images { + margin: 0 5px !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'validate','formSelects', 'table', 'upload'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + table = layui.table, + form = layui.form, + $view = $('#productCategory-info'), + aiProductCategory = [[${aiProductCategory}]], + upload = layui.upload, + validate = layui.validate; + + form.render(); + + //图片上传 + upload.render({ + elem: '#productCategoryImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productCategoryImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#iconImg").val(res.data.src); + } + }); + + //图片上传 + upload.render({ + elem: '#productCategoryBackImageUploadButton' + ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口 + ,accept: 'file' //普通文件 + ,size: 10240 //限制文件大小,单位 KB + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#productCategoryBackImageUpload').html('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img single-image" style="width: 130px">') + }); + } + ,done: function(res){ + $("#backImg").val(res.data.src); + } + }); + + + + setTimeout(() => { + initproductCategoryInfo(); + }, 500); + function initproductCategoryInfo() { + form.val("productCategory-info-form", { + "id": aiProductCategory.id, + "name": aiProductCategory.name, + "code": aiProductCategory.code, + "iconImg": aiProductCategory.iconImg, + "sort": aiProductCategory.sort, + }); + + + $('#productCategoryImageUpload').append('<img src="' + aiProductCategory.iconImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">'); + $("#iconImg").val(aiProductCategory.iconImg); + + + $('#productCategoryBackImageUpload').append('<img src="' + aiProductCategory.backImg + '" alt="" class="layui-upload-img single-image" style="width: 130px">'); + $("#backImg").val(aiProductCategory.backImg); + + } + + form.on('submit(productCategory-info-form-submit)', function (data) { + $.ajax({ + 'url':ctx + 'admin/productCategory/update', + 'type':'post', + 'dataType':'json', + 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 + 'traditional': true,//ajax传递数组必须添加属性 + 'data':JSON.stringify(data.field), + 'success':function (data) { + if(data.code==200){ + layer.closeAll(); + febs.alert.success(data.message); + $('#febs-productCategory').find('#query').click(); + }else{ + febs.alert.warn(data.message); + } + }, + 'error':function () { + febs.alert.warn('服务器繁忙'); + } + }) + return false; + }); + + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html b/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html new file mode 100644 index 0000000..e125bcb --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/ai/productCategory/list.html @@ -0,0 +1,287 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-productCategory" lay-title="产品类型"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="productCategory-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-form-item"> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="productCategoryTable" lay-data="{id: 'productCategoryTable'}"></table> + + <style type="text/css"> + .layui-table-cell{ + text-align:center; + height: auto; + white-space: nowrap; /*文本不会换行,在同一行显示*/ + overflow: hidden; /*超出隐藏*/ + text-overflow: ellipsis; /*省略号显示*/ + } + .layui-table img{ + max-width:100px + } + ::-webkit-scrollbar { + height: 20px !important; + background-color: #f4f4f4; + } + </style> + </div> + </div> + </div> + </div> +</div> + +<script type="text/html" id="productCategoryToolbar"> + <div class="layui-btn-container"> + <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain" shiro:hasPermission="categoryList:add" lay-event="productCategoryAdd">新增</button> + </div> +</script> + +<script type="text/html" id="productCategoryOption"> + <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productCategoryInfoEvent">编辑</button> + <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="categoryList:info" lay-event="productCategoryDeleteEvent">删除</button> +</script> + + +<script type="text/html" id="productCategoryStateSwitch"> + {{# if(d.state === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productCategoryStateSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productCategoryStateSwitch"> + {{# } }} +</script> + + +<script type="text/html" id="productCategoryHotStateSwitch"> + {{# if(d.hotState === 1) { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" checked lay-skin="switch" lay-filter="productCategoryHotStateSwitch"> + {{# } else { }} + <input type="checkbox" value={{d.id}} lay-text="启用|禁用" lay-skin="switch" lay-filter="productCategoryHotStateSwitch"> + {{# } }} +</script> + +<style> + .layui-form-onswitch { + background-color: #5FB878 !important; + } +</style> +<!-- 表格操作栏 end --> +<script data-th-inline="none" type="text/javascript"> + // 引入组件并初始化 + layui.use([ 'jquery', 'form', 'table', 'febs'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + table = layui.table, + $view = $('#febs-productCategory'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'orderNum', type: null}, + tableIns; + + form.render(); + + // 表格初始化 + initproductCategoryTable(); + + // 初始化表格操作栏各个按钮功能 + table.on('tool(productCategoryTable)', function (obj) { + console.log("触发事件:", obj.event); // 调试信息 + var data = obj.data, + layEvent = obj.event; + + if (layEvent === 'seeImage') { + var t = $view.find('#seeImage'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "小图标", + skin: 'layui-layer-rim', //加上边框 + area: ['100%', '100%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + + if (layEvent === 'seeBackImage') { + var t = $view.find('#seeBackImage'+data.id+''); + //页面层 + layer.open({ + type: 1, + title: "背景图片", + skin: 'layui-layer-rim', //加上边框 + area: ['100%', '100%'], //宽高 + shadeClose: true, //开启遮罩关闭 + end: function (index, layero) { + return false; + }, + content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>' + }); + } + + if (layEvent === 'productCategoryInfoEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.open('编辑','modules/ai/productCategory/info/' + data.id, { + btn: ['提交', '取消'], + area: ['100%', '100%'], + yes: function (index, layero) { + $('#febs-productCategory-Info').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'productCategoryDeleteEvent') { + if (data.state == 1){ + febs.alert.warn('请先禁用这行数据'); + return; + } + febs.modal.confirm('删除', '确认删除?', function () { + productCategoryDeleteEvent(data.id); + }); + } + }); + + form.on('switch(productCategoryStateSwitch)', function (data) { + if (data.elem.checked) { + productCategorySwitch(data.value,1,1); + } else { + productCategorySwitch(data.value,1,0); + } + }) + form.on('switch(productCategoryHotStateSwitch)', function (data) { + if (data.elem.checked) { + productCategorySwitch(data.value,2,1); + } else { + productCategorySwitch(data.value,2,0); + } + }) + function productCategorySwitch(id,type,state) { + febs.get(ctx + 'admin/productCategory/changeState/' + id+'/'+ type+'/' + state, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + + function productCategoryDeleteEvent(id) { + febs.get(ctx + 'admin/productCategory/delete/' + id, null, function (data) { + febs.alert.success(data.message); + $query.click(); + }); + } + + // 初始化表格操作栏各个按钮功能 + table.on('toolbar(productCategoryTable)', function (obj) { + let data = obj.data, + layEvent = obj.event; + if(layEvent === 'productCategoryAdd'){ + febs.modal.open('新增', 'modules/ai/productCategory/add/', { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#febs-productCategory-add').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'productSet') { + var checkData = table.checkStatus('productCategoryTable').data; + if (checkData.length > 1 || checkData.length === 0) { + febs.alert.warn('每次操作只能操作一行数据'); + return; + } + febs.modal.open('工艺配置', 'modules/clothesType/productSet/' + checkData[0].id, { + btn: ['提交', '取消'], + area:['100%','100%'], + yes: function (index, layero) { + $('#art-set').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + }); + + function initproductCategoryTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'productCategoryTable', + url: ctx + 'admin/productCategory/list', + toolbar:"#productCategoryToolbar", + defaultToolbar:[], + cols: [[ + {type: 'checkbox'}, + {type: 'numbers', title: '', width: 80}, + {title: '操作', toolbar: '#productCategoryOption', minWidth: 200, align: 'center'}, + {field: 'hotState', title: '推荐首页', templet: '#productCategoryHotStateSwitch', minWidth: 130,align:'center'}, + {field: 'state', title: '状态', templet: '#productCategoryStateSwitch', minWidth: 130,align:'center'}, + {field: 'sort', title: '排序', minWidth: 100,align:'center'}, + {field: 'code', title: '编码', minWidth: 100,align:'center'}, + {field: 'name', title: '名称', minWidth: 100,align:'center'}, + {field: 'iconImg',title: '小图标', + templet: function (d) { + return '<a lay-event="seeImage">' + + '<img id="seeImage' + d.id + '" src="' + d.iconImg + + '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' + + '</a>'; + }, + minWidth: 150,align: 'center'}, + {field: 'backImg',title: '背景图', + templet: function (d) { + return '<a lay-event="seeBackImage">' + + '<img id="seeBackImage' + d.id + '" src="' + d.backImg + + '" alt="小图标" style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px; cursor: pointer;">' + + '</a>'; + }, + minWidth: 150,align: 'center'}, + {field: 'companyId', title: '公司编码', minWidth: 150,align:'center'}, + ]] + }); + } + + + // 查询按钮 + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + // 刷新按钮 + $reset.on('click', function () { + $searchForm[0].reset(); + sortObject.type = 'null'; + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + // 获取查询参数 + function getQueryParams() { + return { + }; + } + + }) +</script> -- Gitblit v1.9.1