diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java index 31ab56d8..b19e3666 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java @@ -96,6 +96,9 @@ public class TicketController extends ControllerBase { @Resource private RedisTemplate redisTemplate; + @Resource + private ITicketFavoritesService ticketFavoritesService; + /** * 获取问题类型 * @return 问题类型列表 @@ -107,13 +110,58 @@ public class TicketController extends ControllerBase { } /** - * 关注或取消关注工单 + * 获取收藏夹 + * @param id 收藏夹id,0为根节点 + * @return 收藏夹信息 + */ + @GetMapping("getFavorites") + @ApiMark(moduleName = "工单管理", apiName = "获取收藏夹",isPublic = true) + public ApiResult getFavorites(@RequestParam(defaultValue ="0") Integer id){ + return ApiResult.success(ticketFavoritesService.getList(AdminUserUtil.getUserId(),id)); + } + + /** + * 添加收藏夹 + * @param request 请求信息 + * @return 无 + */ + @PostMapping("addFavorites") + @ApiMark(moduleName = "工单管理", apiName = "添加收藏夹",isPublic = true) + public ApiResult addFavorites(@Valid @RequestBody AdminFavoritesRequest request){ + ticketFavoritesService.addFavorites(request,AdminUserUtil.getUserId()); + return ApiResult.success(); + } + + /** + * 删除收藏夹 + * @param favoritesId 收藏夹id + * @return 无 + */ + @PostMapping("deleteFavorites") + @ApiMark(moduleName = "工单管理", apiName = "删除收藏夹",isPublic = true) + public ApiResult deleteFavorites(@Valid @RequestParam @NotNull Integer favoritesId){ + ticketFavoritesService.deleteFavorites(AdminUserUtil.getUserId(),favoritesId); + return ApiResult.success(); + } + + /** + * 关注工单 * @param request 请求信息 **/ @PostMapping("followTiket") - @ApiMark(moduleName = "工单管理", apiName = "关注或取消关注") - public ApiResult followTiket(@Valid @RequestBody FollowRequest request) { - ticketFollowService.handleAdmin(request, AdminUserUtil.getUserId()); + @ApiMark(moduleName = "工单管理", apiName = "关注工单") + public ApiResult followTiket(@Valid @RequestBody AdminFollowRequest request){ + ticketFollowService.follow(request, AdminUserUtil.getUserId()); + return ApiResult.success(); + } + + /** + * 取消关注工单 + * @param ticketId 工单id + **/ + @PostMapping("unfollowTicket") + public ApiResult unfollowTicket(@Valid @RequestParam @NotNull Integer ticketId){ + ticketFollowService.unfollow(AdminUserUtil.getUserId(),ticketId); return ApiResult.success(); } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFavoritesRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFavoritesRequest.java new file mode 100644 index 00000000..2b32e1af --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFavoritesRequest.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +public class AdminFavoritesRequest { + + //父级id + @NotNull + private Integer parentId; + + //名称 + @NotBlank + private String name; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFollowRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFollowRequest.java new file mode 100644 index 00000000..313d47f7 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AdminFollowRequest.java @@ -0,0 +1,17 @@ +package com.nflg.mobilebroken.common.pojo.request; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class AdminFollowRequest { + + //工单id + @NotNull(message = "工单id不能为空") + private Integer ticketId; + + //收藏夹id + @NotNull(message = "收藏夹id不能为空") + private Integer favoritesId; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/FavoritesVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/FavoritesVO.java new file mode 100644 index 00000000..a4ad8e96 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/FavoritesVO.java @@ -0,0 +1,23 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class FavoritesVO { + + //收藏夹id + private Integer id; + + //收藏夹名称 + private String name; + + //子收藏夹 + private List children; + + //工单 + private List tickets; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFavorites.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFavorites.java new file mode 100644 index 00000000..ae195cfe --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFavorites.java @@ -0,0 +1,51 @@ +package com.nflg.mobilebroken.repository.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("ticket_favorites") +public class TicketFavorites implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 上级id + */ + private Integer parentId; + + /** + * 名称 + */ + private String name; + + /** + * 创建人 + */ + private Integer createBy; + + /** + * 创建时间 + */ + private LocalDateTime createTime; +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFollow.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFollow.java index 1bcdec69..4937369e 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFollow.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketFollow.java @@ -40,6 +40,11 @@ public class TicketFollow implements Serializable { */ private Integer userId; + /** + * 收藏夹id + */ + private Integer favoritesId; + /** * 来源,0:用户端,1:管理端 */ diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketFavoritesMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketFavoritesMapper.java new file mode 100644 index 00000000..5f4b1d36 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketFavoritesMapper.java @@ -0,0 +1,16 @@ +package com.nflg.mobilebroken.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.mobilebroken.repository.entity.TicketFavorites; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface TicketFavoritesMapper extends BaseMapper { + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java index 6feb5575..71ad974d 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/mapper/TicketMapper.java @@ -35,4 +35,6 @@ public interface TicketMapper extends BaseMapper { IPage searchFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId, IPage page); List searchAllFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId); + + List getAdminFavorites(Integer favoritesId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFavoritesService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFavoritesService.java new file mode 100644 index 00000000..8e570881 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFavoritesService.java @@ -0,0 +1,23 @@ +package com.nflg.mobilebroken.repository.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.pojo.request.AdminFavoritesRequest; +import com.nflg.mobilebroken.common.pojo.vo.FavoritesVO; +import com.nflg.mobilebroken.repository.entity.TicketFavorites; + +/** + *

+ * 服务类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +public interface ITicketFavoritesService extends IService { + + FavoritesVO getList(Integer userId,Integer id); + + void addFavorites(AdminFavoritesRequest request, Integer userId); + + void deleteFavorites(Integer userId,Integer favoritesId); +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFollowService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFollowService.java index b21b714f..f9a9ed28 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFollowService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketFollowService.java @@ -1,11 +1,10 @@ package com.nflg.mobilebroken.repository.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.nflg.mobilebroken.common.pojo.request.AdminFollowRequest; import com.nflg.mobilebroken.common.pojo.request.FollowRequest; import com.nflg.mobilebroken.repository.entity.TicketFollow; -import java.util.List; - /** *

* 工单-关注 服务类 @@ -18,7 +17,9 @@ public interface ITicketFollowService extends IService { void handle(FollowRequest request, Integer userId); - List getUsers(Integer id); + void follow(AdminFollowRequest request, Integer userId); - void handleAdmin(FollowRequest request, Integer userId); + void unfollow(Integer userId, Integer ticketId); + + void deleteFavorites(Integer userId, Integer favoritesId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java index 1a9b564a..7d9c6bef 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketService.java @@ -50,4 +50,6 @@ public interface ITicketService extends IService { List getNonComment(int days); List getTicketHandle(Integer id); + + List getAdminFavorites(Integer favoritesId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFavoritesServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFavoritesServiceImpl.java new file mode 100644 index 00000000..6fcb2222 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFavoritesServiceImpl.java @@ -0,0 +1,65 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.pojo.request.AdminFavoritesRequest; +import com.nflg.mobilebroken.common.pojo.vo.FavoritesVO; +import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.repository.entity.TicketFavorites; +import com.nflg.mobilebroken.repository.mapper.TicketFavoritesMapper; +import com.nflg.mobilebroken.repository.service.ITicketFavoritesService; +import com.nflg.mobilebroken.repository.service.ITicketFollowService; +import com.nflg.mobilebroken.repository.service.ITicketService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author 代码生成器生成 + * @since 2025 + */ +@Service +public class TicketFavoritesServiceImpl extends ServiceImpl implements ITicketFavoritesService { + + @Resource + private ITicketService ticketService; + + @Resource + private ITicketFollowService ticketFollowService; + + @Override + public FavoritesVO getList(Integer userId,Integer id) { + TicketFavorites favorites= Objects.equals(id, 0)? new TicketFavorites().setId(0).setName("收藏夹") : lambdaQuery().eq(TicketFavorites::getId,id).one(); + FavoritesVO vo=new FavoritesVO().setId(favorites.getId()).setName(favorites.getName()); + vo.setChildren(lambdaQuery().eq(TicketFavorites::getParentId,id).eq(TicketFavorites::getCreateBy,userId).list() + .stream().map(f->new FavoritesVO().setId(f.getId()).setName(f.getName())).collect(Collectors.toList())); + vo.setTickets(ticketService.getAdminFavorites(id)); + return vo; + } + + @Override + public void addFavorites(AdminFavoritesRequest request, Integer userId) { + VUtils.trueThrowBusinessError(lambdaQuery().eq(TicketFavorites::getParentId,request.getParentId()).eq(TicketFavorites::getName,request.getName()).exists()) + .throwMessage("已存在该名称的收藏夹"); + save(new TicketFavorites().setParentId(request.getParentId()).setName(request.getName()).setCreateBy(userId).setCreateTime(LocalDateTime.now())); + } + + @Transactional + @Override + public void deleteFavorites(Integer userId, Integer favoritesId) { + TicketFavorites favorites = lambdaQuery().eq(TicketFavorites::getId, favoritesId).one(); + VUtils.trueThrowBusinessError(Objects.isNull(favorites)).throwMessage("该收藏夹不存在"); + VUtils.trueThrowBusinessError(!Objects.equals(favorites.getCreateBy(), userId)).throwMessage("无权限删除该收藏夹"); + ticketFollowService.deleteFavorites(userId, favoritesId); + if (!Objects.equals(favoritesId, 0)){ + lambdaUpdate().eq(TicketFavorites::getId,favoritesId).remove(); + } + } +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFollowServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFollowServiceImpl.java index 3bdb2f05..a3912767 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFollowServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketFollowServiceImpl.java @@ -2,14 +2,15 @@ package com.nflg.mobilebroken.repository.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.mobilebroken.common.pojo.request.AdminFollowRequest; import com.nflg.mobilebroken.common.pojo.request.FollowRequest; import com.nflg.mobilebroken.repository.entity.TicketFollow; import com.nflg.mobilebroken.repository.mapper.TicketFollowMapper; import com.nflg.mobilebroken.repository.service.ITicketFollowService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.List; import java.util.Objects; /** @@ -48,35 +49,35 @@ public class TicketFollowServiceImpl extends ServiceImpl getUsers(Integer id) { - return lambdaQuery() - .eq(TicketFollow::getTicketId, id) - .list(); + public void follow(AdminFollowRequest request, Integer userId) { + this.remove(new LambdaQueryWrapper() + .eq(TicketFollow::getTicketId, request.getTicketId()) + .eq(TicketFollow::getUserId, userId) + .eq(TicketFollow::getFrom, (byte) 1)); + TicketFollow ticketFollow = new TicketFollow() + .setTicketId(request.getTicketId()) + .setUserId(userId) + .setFavoritesId(request.getFavoritesId()) + .setFrom((byte) 1) + .setCreateTime(LocalDateTime.now()); + save(ticketFollow); } @Override - public void handleAdmin(FollowRequest request, Integer userId) { - if (request.getIsFollow()) { - TicketFollow ticketFollow = lambdaQuery() - .eq(TicketFollow::getTicketId, request.getTicketId()) - .eq(TicketFollow::getUserId, userId) - .eq(TicketFollow::getFrom, (byte) 1) - .one(); - if (Objects.isNull(ticketFollow)) { - TicketFollow follow = new TicketFollow() - .setTicketId(request.getTicketId()) - .setUserId(userId) - .setFrom((byte) 1) - .setCreateTime(LocalDateTime.now()); - save(follow); - } - } else { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(TicketFollow::getTicketId, request.getTicketId()); - lambdaQueryWrapper.eq(TicketFollow::getUserId, userId); - lambdaQueryWrapper.eq(TicketFollow::getFrom, (byte) 1); - this.remove(lambdaQueryWrapper); - } + public void unfollow(Integer userId, Integer ticketId) { + this.remove(new LambdaQueryWrapper() + .eq(TicketFollow::getTicketId, ticketId) + .eq(TicketFollow::getUserId, userId) + .eq(TicketFollow::getFrom, (byte) 1)); + } + + @Override + public void deleteFavorites(Integer userId, Integer favoritesId) { + this.remove(new LambdaQueryWrapper() + .eq(TicketFollow::getFavoritesId, favoritesId) + .eq(TicketFollow::getUserId, userId) + .eq(TicketFollow::getFrom, (byte) 1)); } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java index bebfb7f7..8bcf9d5d 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java @@ -302,4 +302,9 @@ public class TicketServiceImpl extends ServiceImpl impleme List handles=Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList()); return adminUserService.getSimples(handles); } + + @Override + public List getAdminFavorites(Integer favoritesId) { + return baseMapper.getAdminFavorites(favoritesId); + } } diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketFavoritesMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketFavoritesMapper.xml new file mode 100644 index 00000000..947f2d8e --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketFavoritesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml index 81459c80..ac2da95e 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketMapper.xml @@ -213,4 +213,11 @@ ORDER BY t.id DESC + + diff --git a/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGenerator.java b/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGenerator.java index df63cae2..51943365 100644 --- a/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGenerator.java +++ b/nflg-mobilebroken-repository/src/test/java/com/nflg/mobilebroken/repository/CodeGenerator.java @@ -33,13 +33,12 @@ public class CodeGenerator { , Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper")) ) .strategyConfig(builder -> { - builder.addInclude("aaa") //只生成指定表 + builder.addInclude("ticket_favorites") //只生成指定表 .entityBuilder() .enableLombok() .enableChainModel() .enableFileOverride(); builder.controllerBuilder().disable(); - builder.addExclude("admin_menu"); }) .templateEngine(new FreemarkerTemplateEngine()) .execute();