feat: 一些调整

This commit is contained in:
曹鹏飞 2025-02-09 23:49:05 +08:00
parent 1a27a98803
commit 14c4d7f2cd
26 changed files with 172 additions and 85 deletions

View File

@ -90,6 +90,14 @@
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId> <artifactId>sa-token-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -1,5 +1,7 @@
package com.nflg.mobilebroken.admin; package com.nflg.mobilebroken.admin;
import cn.dev33.satoken.SaManager;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -11,10 +13,12 @@ import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {"com.nflg.mobilebroken.repository.service", "com.nflg.mobilebroken.admin" @ComponentScan(basePackages = {"com.nflg.mobilebroken.repository.service", "com.nflg.mobilebroken.admin"
, "com.nflg.mobilebroken.starter"}) , "com.nflg.mobilebroken.starter"})
@EnableDiscoveryClient @EnableDiscoveryClient
@Slf4j
public class AdminApplication { public class AdminApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args); SpringApplication.run(AdminApplication.class, args);
log.info("启动成功Sa-Token 配置如下:" + SaManager.getConfig());
} }
} }

View File

@ -27,6 +27,7 @@ public class JacksonConfig {
JavaTimeModule javaTimeModule = new JavaTimeModule(); JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
// objectMapper.registerModule(javaTimeModule);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

View File

@ -13,10 +13,7 @@ import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.service.IAdminMessageService; import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import com.nflg.mobilebroken.repository.service.IAdminUserService; import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
@ -45,13 +42,15 @@ public class MessageController extends ControllerBase {
*/ */
@PostMapping("searchMessages") @PostMapping("searchMessages")
@ApiMark(moduleName = "消息管理", apiName = "搜索消息") @ApiMark(moduleName = "消息管理", apiName = "搜索消息")
public ApiResult<PageData<AdminMessageVO>> searchMessages(@RequestBody AdminMessageSearchRequest request) { public ApiResult<PageData<AdminMessageVO>> searchMessages(@RequestHeader(value = "authorization", required = false) String token, @RequestBody AdminMessageSearchRequest request) {
IPage<AdminMessageVO> pageData = adminMessageService.search(AdminUserUtil.getUserId(), request); IPage<AdminMessageVO> pageData = adminMessageService.search(AdminUserUtil.getUserId(), request);
PageUtil.convert(pageData, d -> { PageUtil.convert(pageData, d -> {
d.setTicketHandleBy(adminUserService.listByIds(StrUtil.split(",", d.getTicketHandleByIds())) if (StrUtil.isNotBlank(d.getTicketHandleByIds())) {
d.setTicketHandleBy(adminUserService.listByIds(StrUtil.split(d.getTicketHandleByIds(), ","))
.stream() .stream()
.map(AdminUser::getUserName) .map(AdminUser::getUserName)
.collect(Collectors.toList())); .collect(Collectors.toList()));
}
return d; return d;
}); });
return ApiResult.success(pageData); return ApiResult.success(pageData);

View File

@ -11,9 +11,11 @@ import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.AdminTicketSearchRequest; import com.nflg.mobilebroken.common.pojo.request.AdminTicketSearchRequest;
import com.nflg.mobilebroken.common.pojo.request.AssignmentTicketRequest; import com.nflg.mobilebroken.common.pojo.request.AssignmentTicketRequest;
import com.nflg.mobilebroken.common.pojo.request.FollowRequest;
import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO; import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO;
import com.nflg.mobilebroken.common.pojo.vo.DeviceInfoVO; import com.nflg.mobilebroken.common.pojo.vo.DeviceInfoVO;
import com.nflg.mobilebroken.common.pojo.vo.TicketPdfVO; import com.nflg.mobilebroken.common.pojo.vo.TicketPdfVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.EecExcelUtil; import com.nflg.mobilebroken.common.util.EecExcelUtil;
import com.nflg.mobilebroken.common.util.PageUtil; import com.nflg.mobilebroken.common.util.PageUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AdminUser;
@ -64,6 +66,32 @@ public class TicketController extends ControllerBase {
@Resource @Resource
private IAdminUserService adminUserService; private IAdminUserService adminUserService;
@Resource
private ITicketFollowService ticketFollowService;
/**
* 获取问题类型
*
* @return 问题类型列表
*/
@GetMapping("getQuestions")
@ApiMark(moduleName = "获取问题类型", apiName = "搜索工单", isPublic = true)
public ApiResult<List<String>> getQuestions() {
return ApiResult.success(Arrays.asList("技术设计问题", "装配工艺问题", "焊接质量问题", "机组装配质量问题", "电控问题", "工况方案问题", "操作不当", "原材料配件质量问题", "QC检验遗漏/误差", "部件/整机外观"));
}
/**
* 关注或取消关注工单
*
* @param request 请求信息
**/
@PostMapping("followTiket")
@ApiMark(moduleName = "关注或取消关注工单", apiName = "搜索工单")
public ApiResult<Void> followTiket(@Valid @RequestBody FollowRequest request) {
ticketFollowService.handleAdmin(request, AdminUserUtil.getUserId());
return ApiResult.success();
}
/** /**
* 搜索工单 * 搜索工单
* @param request 请求参数 * @param request 请求参数

View File

@ -7,6 +7,7 @@ import com.nflg.mobilebroken.common.pojo.dto.UserDTO;
import com.nflg.mobilebroken.repository.entity.AdminUser; import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.AppUser; import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.entity.TicketFollow;
import com.nflg.mobilebroken.repository.service.IAdminUserService; import com.nflg.mobilebroken.repository.service.IAdminUserService;
import com.nflg.mobilebroken.repository.service.IAppUserService; import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.ITicketFollowService; import com.nflg.mobilebroken.repository.service.ITicketFollowService;
@ -98,7 +99,11 @@ public class TicketScheduledTasks {
sendToApp(appUser, subject, StrUtil.format(content, ticket.getTitle())); sendToApp(appUser, subject, StrUtil.format(content, ticket.getTitle()));
} }
//给关注人发提醒 //给关注人发提醒
List<Integer> followUserIds = ticketFollowService.getUsers(ticket.getId()); List<TicketFollow> follows = ticketFollowService.getUsers(ticket.getId());
List<Integer> followUserIds = follows.stream()
.filter(f -> Objects.equals(f.getFrom(), (byte) 0))
.map(TicketFollow::getUserId)
.collect(Collectors.toList());
followUserIds.remove(appUser.getId()); followUserIds.remove(appUser.getId());
if (CollectionUtil.isNotEmpty(followUserIds)) { if (CollectionUtil.isNotEmpty(followUserIds)) {
List<AppUser> followUsers = appUserService.listByIds(followUserIds); List<AppUser> followUsers = appUserService.listByIds(followUserIds);
@ -108,6 +113,18 @@ public class TicketScheduledTasks {
sendToApp(u, subject, StrUtil.format(content, ticket.getTitle())); sendToApp(u, subject, StrUtil.format(content, ticket.getTitle()));
}); });
} }
followUserIds = follows.stream()
.filter(f -> Objects.equals(f.getFrom(), (byte) 1))
.map(TicketFollow::getUserId)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(followUserIds)) {
List<AdminUser> followUsers = adminUserService.listByIds(followUserIds);
String subject = "该问题工单截止目前还未关闭,请跟进处理!";
String content = "工单({})已超时未处理";
followUsers.forEach(u -> {
sendToAdmin(u, subject, StrUtil.format(content, ticket.getTitle()));
});
}
} }
private void sendToAdmin(AdminUser user, String subject, String content) { private void sendToAdmin(AdminUser user, String subject, String content) {

View File

@ -1,19 +0,0 @@
package com.nflg.mobilebroken.auth.config;
import cn.dev33.satoken.jwt.StpLogicJwtForStateless;
import com.nflg.mobilebroken.common.util.SaTokenAdminUtil;
import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
@Configuration
public class SaTokenJwtConfigure {
@PostConstruct
public void setJwtStrategy() {
//设置jwt模式
SaTokenAppUtil.setStpLogic(new StpLogicJwtForStateless(SaTokenAppUtil.TYPE));
SaTokenAdminUtil.setStpLogic(new StpLogicJwtForStateless(SaTokenAdminUtil.TYPE));
}
}

View File

@ -2,7 +2,6 @@ package com.nflg.mobilebroken.auth.controller;
import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.vo.PermissionsVO; import com.nflg.mobilebroken.common.pojo.vo.PermissionsVO;
@ -55,7 +54,7 @@ public class AdminController extends ControllerBase {
.setExtra("from", "admin") .setExtra("from", "admin")
.setExtra("name", user.getUserName()) .setExtra("name", user.getUserName())
.setExtra("code", user.getUserCode()) .setExtra("code", user.getUserCode())
.setExtra("roles", StrUtil.join(",", roleCodes))); .setExtra("roles", roleCodes));
return ApiResult.success(SaTokenAdminUtil.getTokenInfo()); return ApiResult.success(SaTokenAdminUtil.getTokenInfo());
} }
@ -76,9 +75,10 @@ public class AdminController extends ControllerBase {
@GetMapping("getPermissions") @GetMapping("getPermissions")
public ApiResult<PermissionsVO> getPermissions() { public ApiResult<PermissionsVO> getPermissions() {
VUtils.trueThrow(!SaTokenAdminUtil.isLogin()).throwMessage(STATE.LoginError,"请重新登录"); VUtils.trueThrow(!SaTokenAdminUtil.isLogin()).throwMessage(STATE.LoginError,"请重新登录");
List<String> roles = AdminUserUtil.getRoles();
PermissionsVO vo = new PermissionsVO(); PermissionsVO vo = new PermissionsVO();
vo.setMenus(adminRoleService.getMenusByRoleCodes(AdminUserUtil.getRoles())); vo.setMenus(adminRoleService.getMenusByRoleCodes(roles));
vo.setButtons(adminRoleService.getButtonsByRoleCodes(AdminUserUtil.getRoles())); vo.setButtons(adminRoleService.getButtonsByRoleCodes(roles));
return ApiResult.success(vo); return ApiResult.success(vo);
} }
} }

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.auth.controller;
import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.util.SaTokenAppUtil; import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
@ -16,8 +17,8 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.chrono.ChronoLocalDate; import java.time.chrono.ChronoLocalDate;
import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 用户端用户登录 * 用户端用户登录
@ -46,8 +47,10 @@ public class AppController extends ControllerBase {
.setExtra("from", "app") .setExtra("from", "app")
.setExtra("name", user.getName()) .setExtra("name", user.getName())
.setExtra("email", user.getEmail()) .setExtra("email", user.getEmail())
.setExtra("companys", Arrays.asList(1, 2)) .setExtra("companys", StrUtil.split(user.getCompanyId(), ",").stream().map(Integer::valueOf).collect(Collectors.toList()))
.setExtra("isPrimary", user.getIsPrimary())); .setExtra("isPrimary", user.getIsPrimary()));
user.setLastLoginTime(LocalDateTime.now());
appUserService.updateById(user);
return ApiResult.success(StpUtil.getTokenInfo()); return ApiResult.success(StpUtil.getTokenInfo());
} }

View File

@ -8,6 +8,7 @@ spring.servlet.multipart.max-request-size=500MB
#spring.config.import=classpath:application-${spring.profiles.active}.properties,nacos: #spring.config.import=classpath:application-${spring.profiles.active}.properties,nacos:
#spring.config.import=nacos: #spring.config.import=nacos:
logging.level.root=info logging.level.root=info
logging.level.org.mybatis=debug
#logging.level.com.alibaba.nacos.client=DEBUG #logging.level.com.alibaba.nacos.client=DEBUG
#logging.level.org.springframework.boot.context.config=DEBUG #logging.level.org.springframework.boot.context.config=DEBUG
#logging.config=classpath:logback-sit.xml #logging.config=classpath:logback-sit.xml

View File

@ -46,7 +46,6 @@ public class MessageController extends ControllerBase {
/** /**
* 设置消息已读 * 设置消息已读
*
* @param ids 消息id列表 * @param ids 消息id列表
*/ */
@PostMapping("setReaded") @PostMapping("setReaded")

View File

@ -33,7 +33,7 @@ public class ApiResult<T> implements Serializable {
data.setItems(value);; data.setItems(value);;
data.setPage(query.getPage()); data.setPage(query.getPage());
data.setPageSize(query.getPageSize()); data.setPageSize(query.getPageSize());
data.setTotal(total); data.setTotal((int) total);
vo.code = STATE.Success.getState(); vo.code = STATE.Success.getState();
vo.type = STATE.Success.getType(); vo.type = STATE.Success.getType();
vo.setResult(data); vo.setResult(data);
@ -43,9 +43,9 @@ public class ApiResult<T> implements Serializable {
public static <T> ApiResult<PageData<T>> success(IPage<T> page) { public static <T> ApiResult<PageData<T>> success(IPage<T> page) {
ApiResult<PageData<T>> vo = new ApiResult<>(); ApiResult<PageData<T>> vo = new ApiResult<>();
PageData<T> pageData = new PageData<>(); PageData<T> pageData = new PageData<>();
pageData.setPage(page.getCurrent()); pageData.setPage((int) page.getCurrent());
pageData.setPageSize(page.getSize()); pageData.setPageSize((int) page.getSize());
pageData.setTotal(page.getTotal()); pageData.setTotal((int) page.getTotal());
pageData.setItems(page.getRecords()); pageData.setItems(page.getRecords());
vo.setCode(STATE.Success.getState()); vo.setCode(STATE.Success.getState());
vo.setType(STATE.Success.getType()); vo.setType(STATE.Success.getType());

View File

@ -13,20 +13,20 @@ public class PageData<T> implements Serializable {
//当前页码 //当前页码
@Setter @Setter
private long page = 1; private int page = 1;
//每页数据条数 //每页数据条数
@Setter @Setter
private long pageSize = 20; private int pageSize = 20;
//总条数 //总条数
@Setter @Setter
private long total = 0; private int total = 0;
//总页数 //总页数
private long totalPages; private int totalPages;
public long getTotalPages(){ public int getTotalPages() {
return total % pageSize == 0 ? total / pageSize : total / pageSize + 1; return total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
} }

View File

@ -12,6 +12,8 @@ import java.util.List;
@Accessors(chain = true) @Accessors(chain = true)
public class AdminMessageVO { public class AdminMessageVO {
private Integer id;
//任务id //任务id
private Integer ticketId; private Integer ticketId;

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.common.util; package com.nflg.mobilebroken.common.util;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import java.util.List; import java.util.List;
@ -11,6 +12,7 @@ public class AdminUserUtil {
private static final Map<Integer, List<String>> PERMISSION_MAP = new ConcurrentHashMap<>(); private static final Map<Integer, List<String>> PERMISSION_MAP = new ConcurrentHashMap<>();
public static Integer getUserId(){ public static Integer getUserId(){
SaTokenInfo tokenValue = SaTokenAdminUtil.getTokenInfo();
if (SaTokenAdminUtil.isLogin()) { if (SaTokenAdminUtil.isLogin()) {
return SaTokenAdminUtil.getLoginIdAsInt(); return SaTokenAdminUtil.getLoginIdAsInt();
} }

View File

@ -10,9 +10,9 @@ public class PageUtil {
public static <T, U> PageData<T> convert(IPage<U> page, Function<? super U, ? extends T> mapper) { public static <T, U> PageData<T> convert(IPage<U> page, Function<? super U, ? extends T> mapper) {
PageData<T> pageData = new PageData<>(); PageData<T> pageData = new PageData<>();
pageData.setPage(page.getCurrent()); pageData.setPage((int) page.getCurrent());
pageData.setPageSize(page.getSize()); pageData.setPageSize((int) page.getSize());
pageData.setTotal(page.getTotal()); pageData.setTotal((int) page.getTotal());
pageData.setItems(page.getRecords().stream().map(mapper).collect(Collectors.toList())); pageData.setItems(page.getRecords().stream().map(mapper).collect(Collectors.toList()));
return pageData; return pageData;
} }

View File

@ -3,12 +3,13 @@ package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* <p> * <p>
* 工单-关注 * 工单-关注
@ -38,6 +39,11 @@ public class TicketFollow implements Serializable {
*/ */
private Integer userId; private Integer userId;
/**
* 来源0用户端1管理端
*/
private Byte from;
/** /**
* 关注时间 * 关注时间
*/ */

View File

@ -18,5 +18,7 @@ public interface ITicketFollowService extends IService<TicketFollow> {
void handle(FollowRequest request, Integer userId); void handle(FollowRequest request, Integer userId);
List<Integer> getUsers(Integer id); List<TicketFollow> getUsers(Integer id);
void handleAdmin(FollowRequest request, Integer userId);
} }

View File

@ -117,9 +117,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.like(StrUtil.isNotBlank(request.getUserName()), AdminUser::getUserName, request.getUserName()) .like(StrUtil.isNotBlank(request.getUserName()), AdminUser::getUserName, request.getUserName())
.page(new Page<>(request.getPage(), request.getPageSize())); .page(new Page<>(request.getPage(), request.getPageSize()));
PageData<AdminUserVO> pageData = new PageData<>(); PageData<AdminUserVO> pageData = new PageData<>();
pageData.setPage(page.getCurrent()); pageData.setPage((int) page.getCurrent());
pageData.setPageSize(page.getSize()); pageData.setPageSize((int) page.getSize());
pageData.setTotal(page.getTotal()); pageData.setTotal((int) page.getTotal());
pageData.setItems(page.getRecords().stream().map(u -> pageData.setItems(page.getRecords().stream().map(u ->
new AdminUserVO() new AdminUserVO()
.setId(u.getId()) .setId(u.getId())

View File

@ -11,7 +11,6 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@ -30,11 +29,13 @@ public class TicketFollowServiceImpl extends ServiceImpl<TicketFollowMapper, Tic
TicketFollow ticketFollow = lambdaQuery() TicketFollow ticketFollow = lambdaQuery()
.eq(TicketFollow::getTicketId, request.getTicketId()) .eq(TicketFollow::getTicketId, request.getTicketId())
.eq(TicketFollow::getUserId, userId) .eq(TicketFollow::getUserId, userId)
.eq(TicketFollow::getFrom, (byte) 0)
.one(); .one();
if (Objects.isNull(ticketFollow)) { if (Objects.isNull(ticketFollow)) {
TicketFollow follow = new TicketFollow() TicketFollow follow = new TicketFollow()
.setTicketId(request.getTicketId()) .setTicketId(request.getTicketId())
.setUserId(userId) .setUserId(userId)
.setFrom((byte) 0)
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
save(follow); save(follow);
} }
@ -42,17 +43,40 @@ public class TicketFollowServiceImpl extends ServiceImpl<TicketFollowMapper, Tic
LambdaQueryWrapper<TicketFollow> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TicketFollow> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(TicketFollow::getTicketId, request.getTicketId()); lambdaQueryWrapper.eq(TicketFollow::getTicketId, request.getTicketId());
lambdaQueryWrapper.eq(TicketFollow::getUserId, userId); lambdaQueryWrapper.eq(TicketFollow::getUserId, userId);
lambdaQueryWrapper.eq(TicketFollow::getFrom, (byte) 0);
this.remove(lambdaQueryWrapper); this.remove(lambdaQueryWrapper);
} }
} }
@Override @Override
public List<Integer> getUsers(Integer id) { public List<TicketFollow> getUsers(Integer id) {
return lambdaQuery() return lambdaQuery()
.eq(TicketFollow::getTicketId, id) .eq(TicketFollow::getTicketId, id)
.list() .list();
.stream() }
.map(TicketFollow::getUserId)
.collect(Collectors.toList()); @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);
}
} }
} }

View File

@ -3,12 +3,12 @@
<mapper namespace="com.nflg.mobilebroken.repository.mapper.AdminMessageMapper"> <mapper namespace="com.nflg.mobilebroken.repository.mapper.AdminMessageMapper">
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO"> <select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO">
SELECT t.id AS 'ticketId',t.`no` AS 'ticketNo',m.content,m.type,m.create_time AS 'createTime', SELECT m.id,t.id AS 'ticketId',t.`no` AS 'ticketNo',m.content,m.type,m.create_time AS 'createTime',
u.`name` AS 'createUserName',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleByIds', u.`name` AS 'createUserName',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleByIds',
m.is_read AS 'isRead' m.is_read AS 'isRead'
FROM admin_message m FROM admin_message m
INNER JOIN ticket t ON m.ticket_id=t.id INNER JOIN ticket t ON m.ticket_id=t.id
INNER JOIN admin_user u ON t.user_id=u.id INNER JOIN app_user u ON t.user_id=u.id
WHERE m.user_id=#{userId} WHERE m.user_id=#{userId}
<if test="request.type != null"> <if test="request.type != null">
AND m.type=#{request.type} AND m.type=#{request.type}

View File

@ -8,7 +8,7 @@
INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id
INNER JOIN admin_menu m ON rmm.menu_id=m.id INNER JOIN admin_menu m ON rmm.menu_id=m.id
WHERE m.`enable`=1 AND r.`enable`=1 AND r.`code` IN WHERE m.`enable`=1 AND r.`enable`=1 AND r.`code` IN
<foreach collection="roleCodes" item="code" open="('" close="')" separator="','"> <foreach collection="roleCodes" item="code" open="(" close=")" separator=",">
#{code} #{code}
</foreach> </foreach>
UNION UNION
@ -19,7 +19,7 @@
INNER JOIN admin_menu_button_api_map mbam ON mb.id=mbam.button_id INNER JOIN admin_menu_button_api_map mbam ON mb.id=mbam.button_id
INNER JOIN admin_api a ON mbam.api_id=a.id INNER JOIN admin_api a ON mbam.api_id=a.id
WHERE rbm.role_id=1 AND r.`enable`=1 AND r.`code` IN WHERE rbm.role_id=1 AND r.`enable`=1 AND r.`code` IN
<foreach collection="roleCodes" item="code" open="('" close="')" separator="','"> <foreach collection="roleCodes" item="code" open="(" close=")" separator=",">
#{code} #{code}
</foreach> </foreach>
</select> </select>
@ -30,7 +30,7 @@
INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id
INNER JOIN admin_menu m ON rmm.menu_id=m.id INNER JOIN admin_menu m ON rmm.menu_id=m.id
WHERE m.`enable`=1 AND r.`enable`=1 AND r.`code` IN WHERE m.`enable`=1 AND r.`enable`=1 AND r.`code` IN
<foreach collection="roleCodes" item="code" open="('" close="')" separator="','"> <foreach collection="roleCodes" item="code" open="(" close=")" separator=",">
#{code} #{code}
</foreach> </foreach>
</select> </select>
@ -41,7 +41,7 @@
INNER JOIN admin_role_button_map rbm ON r.id=rbm.role_id INNER JOIN admin_role_button_map rbm ON r.id=rbm.role_id
INNER JOIN admin_menu_button mb ON rbm.button_id=mb.id INNER JOIN admin_menu_button mb ON rbm.button_id=mb.id
WHERE rbm.role_id=1 AND r.`enable`=1 AND r.`code` IN WHERE rbm.role_id=1 AND r.`enable`=1 AND r.`code` IN
<foreach collection="roleCodes" item="code" open="('" close="')" separator="','"> <foreach collection="roleCodes" item="code" open="(" close=")" separator=",">
#{code} #{code}
</foreach> </foreach>
</select> </select>

View File

@ -3,7 +3,7 @@
<mapper namespace="com.nflg.mobilebroken.repository.mapper.AppMessageMapper"> <mapper namespace="com.nflg.mobilebroken.repository.mapper.AppMessageMapper">
<select id="getNotReadMessage" resultType="com.nflg.mobilebroken.common.pojo.vo.AppMessageVO"> <select id="getNotReadMessage" resultType="com.nflg.mobilebroken.common.pojo.vo.AppMessageVO">
SELECT t.id AS 'ticketId',t.`no` AS 'ticketNo',t.title AS 'ticketTitle',m.content,m.create_time AS 'createTime',u.`name` AS 'ticketCreateBy',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleBy',m.is_read AS 'isRead' SELECT m.id,t.id AS 'ticketId',t.`no` AS 'ticketNo',t.title AS 'ticketTitle',m.content,m.create_time AS 'createTime',u.`name` AS 'ticketCreateBy',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleBy',m.is_read AS 'isRead'
FROM app_message m FROM app_message m
INNER JOIN ticket t ON m.ticket_id=t.id INNER JOIN ticket t ON m.ticket_id=t.id
INNER JOIN app_user u ON t.user_id=u.id INNER JOIN app_user u ON t.user_id=u.id
@ -11,7 +11,7 @@
ORDER BY m.id ORDER BY m.id
</select> </select>
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.AppMessageVO"> <select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.AppMessageVO">
SELECT t.id AS 'ticketId',t.`no` AS 'ticketNo',t.title AS 'ticketTitle',m.content,m.create_time AS 'createTime',u.`name` AS 'ticketCreateBy',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleBy',m.is_read AS 'isRead' SELECT m.id,t.id AS 'ticketId',t.`no` AS 'ticketNo',t.title AS 'ticketTitle',m.content,m.create_time AS 'createTime',u.`name` AS 'ticketCreateBy',t.create_time AS 'ticketCreateTime',t.handle AS 'ticketHandleBy',m.is_read AS 'isRead'
FROM app_message m FROM app_message m
INNER JOIN ticket t ON m.ticket_id=t.id INNER JOIN ticket t ON m.ticket_id=t.id
INNER JOIN app_user u ON t.user_id=u.id INNER JOIN app_user u ON t.user_id=u.id

View File

@ -65,21 +65,21 @@
</sql> </sql>
<select id="searchMy" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO"> <select id="searchMy" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.*,a.`name` AS 'areaName',IF(tf.id IS NULL, false, true) AS 'followed',u.`name` AS 'createBy' SELECT t.*,a.`name` AS 'areaName',IF(tf.id IS NULL, false, true) AS 'followed',u.`name` AS 'createBy',IF(tf.id IS NULL, false, true) AS 'followed'
FROM ticket t FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a ON u.area_id=a.id LEFT JOIN app_area a ON u.area_id=a.id
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=0
WHERE t.user_id=#{userId} WHERE t.user_id=#{userId}
<include refid="searchWhereCondition"/> <include refid="searchWhereCondition"/>
</select> </select>
<select id="searchFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO"> <select id="searchFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.TicketVO">
SELECT t.*,a.`name` AS 'areaName',true AS 'followed',u.`name` AS 'createBy' SELECT t.*,a.`name` AS 'areaName',true AS 'followed',u.`name` AS 'createBy',true AS 'followed'
FROM ticket t FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN app_area a ON u.area_id=a.id LEFT JOIN app_area a ON u.area_id=a.id
LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id LEFT JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.from=0
WHERE tf.user_id=#{userId} WHERE tf.user_id=#{userId}
<include refid="searchWhereCondition"/> <include refid="searchWhereCondition"/>
</select> </select>
@ -143,12 +143,12 @@
<select id="searchFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO"> <select id="searchFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName' SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName'
,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime' ,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc' ,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc',IF(tf.id IS NULL, false, true) AS 'followed'
FROM ticket t FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN t_base_customer c ON u.company_id=c.id LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id LEFT JOIN app_area a ON u.area_id=a.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1 LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1
LEFT JOIN dictionary_item di ON d.warranty_state=di.id LEFT JOIN dictionary_item di ON d.warranty_state=di.id
<include refid="adminSearchWhereCondition"/> <include refid="adminSearchWhereCondition"/>
@ -157,12 +157,12 @@
<select id="searchAllFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO"> <select id="searchAllFromAdminAndFollow" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO">
SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName' SELECT t.id,t.`no`,t.title,t.state,t.urgency,t.component,t.question,t.solution,a.`name` AS 'areaName'
,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime' ,c.agency_company_name AS 'companyName',u.`name` AS 'createUserName',t.device_no AS 'deviceNo',t.use_time AS 'useTime'
,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc' ,t.create_time AS 'createTime',t.handle,t.solve_time AS 'solveTime',di.name AS 'warrantyStatusDesc',IF(tf.id IS NULL, false, true) AS 'followed'
FROM ticket t FROM ticket t
LEFT JOIN app_user u ON t.user_id=u.id LEFT JOIN app_user u ON t.user_id=u.id
LEFT JOIN t_base_customer c ON u.company_id=c.id LEFT JOIN t_base_customer c ON u.company_id=c.id
LEFT JOIN app_area a ON u.area_id=a.id LEFT JOIN app_area a ON u.area_id=a.id
INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} INNER JOIN ticket_follow tf ON t.id=tf.ticket_id AND tf.user_id=#{userId} AND tf.from=1
LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1 LEFT JOIN device d ON t.device_no=d.device_no AND d.data_valid_state=1
LEFT JOIN dictionary_item di ON d.warranty_state=di.id LEFT JOIN dictionary_item di ON d.warranty_state=di.id
<include refid="adminSearchWhereCondition"/> <include refid="adminSearchWhereCondition"/>

View File

@ -105,6 +105,10 @@
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.83</version> <version>1.2.83</version>
</dependency> </dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -1,6 +1,9 @@
package com.nflg.mobilebroken.starter.config; package com.nflg.mobilebroken.starter.config;
import cn.dev33.satoken.jwt.StpLogicJwtForStateless;
import cn.dev33.satoken.strategy.SaAnnotationStrategy; import cn.dev33.satoken.strategy.SaAnnotationStrategy;
import com.nflg.mobilebroken.common.util.SaTokenAdminUtil;
import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
@ -13,5 +16,8 @@ public class SaTokenAnnotationConfigure {
public void rewriteSaStrategy() { public void rewriteSaStrategy() {
// 重写Sa-Token的注解处理器增加注解合并功能 // 重写Sa-Token的注解处理器增加注解合并功能
SaAnnotationStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation; SaAnnotationStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation;
//设置jwt模式
SaTokenAppUtil.setStpLogic(new StpLogicJwtForStateless(SaTokenAppUtil.TYPE));
SaTokenAdminUtil.setStpLogic(new StpLogicJwtForStateless(SaTokenAdminUtil.TYPE));
} }
} }