feat: 关注工单支持收藏夹
This commit is contained in:
parent
0112f267e3
commit
7684461953
|
|
@ -96,6 +96,9 @@ public class TicketController extends ControllerBase {
|
|||
@Resource
|
||||
private RedisTemplate<String, String> 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<FavoritesVO> 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<Void> 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<Void> deleteFavorites(@Valid @RequestParam @NotNull Integer favoritesId){
|
||||
ticketFavoritesService.deleteFavorites(AdminUserUtil.getUserId(),favoritesId);
|
||||
return ApiResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 关注工单
|
||||
* @param request 请求信息
|
||||
**/
|
||||
@PostMapping("followTiket")
|
||||
@ApiMark(moduleName = "工单管理", apiName = "关注或取消关注")
|
||||
public ApiResult<Void> followTiket(@Valid @RequestBody FollowRequest request) {
|
||||
ticketFollowService.handleAdmin(request, AdminUserUtil.getUserId());
|
||||
@ApiMark(moduleName = "工单管理", apiName = "关注工单")
|
||||
public ApiResult<Void> followTiket(@Valid @RequestBody AdminFollowRequest request){
|
||||
ticketFollowService.follow(request, AdminUserUtil.getUserId());
|
||||
return ApiResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消关注工单
|
||||
* @param ticketId 工单id
|
||||
**/
|
||||
@PostMapping("unfollowTicket")
|
||||
public ApiResult<Void> unfollowTicket(@Valid @RequestParam @NotNull Integer ticketId){
|
||||
ticketFollowService.unfollow(AdminUserUtil.getUserId(),ticketId);
|
||||
return ApiResult.success();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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<FavoritesVO> children;
|
||||
|
||||
//工单
|
||||
private List<TicketVO> tickets;
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
*
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
|
@ -40,6 +40,11 @@ public class TicketFollow implements Serializable {
|
|||
*/
|
||||
private Integer userId;
|
||||
|
||||
/**
|
||||
* 收藏夹id
|
||||
*/
|
||||
private Integer favoritesId;
|
||||
|
||||
/**
|
||||
* 来源,0:用户端,1:管理端
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
package com.nflg.mobilebroken.repository.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.nflg.mobilebroken.repository.entity.TicketFavorites;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2025
|
||||
*/
|
||||
public interface TicketFavoritesMapper extends BaseMapper<TicketFavorites> {
|
||||
|
||||
}
|
||||
|
|
@ -35,4 +35,6 @@ public interface TicketMapper extends BaseMapper<Ticket> {
|
|||
IPage<AdminTicketVO> searchFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId, IPage<?> page);
|
||||
|
||||
List<AdminTicketVO> searchAllFromAdminAndFollow(AdminTicketSearchRequest request, Integer userId);
|
||||
|
||||
List<TicketVO> getAdminFavorites(Integer favoritesId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2025
|
||||
*/
|
||||
public interface ITicketFavoritesService extends IService<TicketFavorites> {
|
||||
|
||||
FavoritesVO getList(Integer userId,Integer id);
|
||||
|
||||
void addFavorites(AdminFavoritesRequest request, Integer userId);
|
||||
|
||||
void deleteFavorites(Integer userId,Integer favoritesId);
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 工单-关注 服务类
|
||||
|
|
@ -18,7 +17,9 @@ public interface ITicketFollowService extends IService<TicketFollow> {
|
|||
|
||||
void handle(FollowRequest request, Integer userId);
|
||||
|
||||
List<TicketFollow> 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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,4 +50,6 @@ public interface ITicketService extends IService<Ticket> {
|
|||
List<Ticket> getNonComment(int days);
|
||||
|
||||
List<AdminUserSimpleVO> getTicketHandle(Integer id);
|
||||
|
||||
List<TicketVO> getAdminFavorites(Integer favoritesId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author 代码生成器生成
|
||||
* @since 2025
|
||||
*/
|
||||
@Service
|
||||
public class TicketFavoritesServiceImpl extends ServiceImpl<TicketFavoritesMapper, TicketFavorites> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TicketFollowMapper, Tic
|
|||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public List<TicketFollow> getUsers(Integer id) {
|
||||
return lambdaQuery()
|
||||
.eq(TicketFollow::getTicketId, id)
|
||||
.list();
|
||||
public void follow(AdminFollowRequest request, Integer userId) {
|
||||
this.remove(new LambdaQueryWrapper<TicketFollow>()
|
||||
.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<TicketFollow> 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<TicketFollow>()
|
||||
.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<TicketFollow>()
|
||||
.eq(TicketFollow::getFavoritesId, favoritesId)
|
||||
.eq(TicketFollow::getUserId, userId)
|
||||
.eq(TicketFollow::getFrom, (byte) 1));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -302,4 +302,9 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
|
|||
List<Integer> handles=Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
||||
return adminUserService.getSimples(handles);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TicketVO> getAdminFavorites(Integer favoritesId) {
|
||||
return baseMapper.getAdminFavorites(favoritesId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.nflg.mobilebroken.repository.mapper.TicketFavoritesMapper">
|
||||
|
||||
</mapper>
|
||||
|
|
@ -213,4 +213,11 @@
|
|||
<include refid="adminSearchWhereCondition"/>
|
||||
ORDER BY t.id DESC
|
||||
</select>
|
||||
|
||||
<select id="getAdminFavorites" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
|
||||
SELECT t.id,t.no,t.title
|
||||
FROM ticket_follow tf
|
||||
INNER JOIN ticket t ON tf.ticket_id=t.id
|
||||
WHERE tf.`from`=1 AND tf.favorites_id=#{favoritesId}
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue