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>
<artifactId>sa-token-spring-boot-starter</artifactId>
</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>
<build>

View File

@ -1,5 +1,7 @@
package com.nflg.mobilebroken.admin;
import cn.dev33.satoken.SaManager;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
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"
, "com.nflg.mobilebroken.starter"})
@EnableDiscoveryClient
@Slf4j
public class AdminApplication {
public static void main(String[] 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.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(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);

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.IAdminUserService;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
@ -45,13 +42,15 @@ public class MessageController extends ControllerBase {
*/
@PostMapping("searchMessages")
@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);
PageUtil.convert(pageData, d -> {
d.setTicketHandleBy(adminUserService.listByIds(StrUtil.split(",", d.getTicketHandleByIds()))
.stream()
.map(AdminUser::getUserName)
.collect(Collectors.toList()));
if (StrUtil.isNotBlank(d.getTicketHandleByIds())) {
d.setTicketHandleBy(adminUserService.listByIds(StrUtil.split(d.getTicketHandleByIds(), ","))
.stream()
.map(AdminUser::getUserName)
.collect(Collectors.toList()));
}
return d;
});
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.request.AdminTicketSearchRequest;
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.DeviceInfoVO;
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.PageUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser;
@ -64,6 +66,32 @@ public class TicketController extends ControllerBase {
@Resource
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 请求参数

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.AppUser;
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.IAppUserService;
import com.nflg.mobilebroken.repository.service.ITicketFollowService;
@ -98,7 +99,11 @@ public class TicketScheduledTasks {
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());
if (CollectionUtil.isNotEmpty(followUserIds)) {
List<AppUser> followUsers = appUserService.listByIds(followUserIds);
@ -108,6 +113,18 @@ public class TicketScheduledTasks {
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) {

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.SaTokenInfo;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.vo.PermissionsVO;
@ -55,7 +54,7 @@ public class AdminController extends ControllerBase {
.setExtra("from", "admin")
.setExtra("name", user.getUserName())
.setExtra("code", user.getUserCode())
.setExtra("roles", StrUtil.join(",", roleCodes)));
.setExtra("roles", roleCodes));
return ApiResult.success(SaTokenAdminUtil.getTokenInfo());
}
@ -76,9 +75,10 @@ public class AdminController extends ControllerBase {
@GetMapping("getPermissions")
public ApiResult<PermissionsVO> getPermissions() {
VUtils.trueThrow(!SaTokenAdminUtil.isLogin()).throwMessage(STATE.LoginError,"请重新登录");
List<String> roles = AdminUserUtil.getRoles();
PermissionsVO vo = new PermissionsVO();
vo.setMenus(adminRoleService.getMenusByRoleCodes(AdminUserUtil.getRoles()));
vo.setButtons(adminRoleService.getButtonsByRoleCodes(AdminUserUtil.getRoles()));
vo.setMenus(adminRoleService.getMenusByRoleCodes(roles));
vo.setButtons(adminRoleService.getButtonsByRoleCodes(roles));
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.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
@ -16,8 +17,8 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.chrono.ChronoLocalDate;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 用户端用户登录
@ -46,8 +47,10 @@ public class AppController extends ControllerBase {
.setExtra("from", "app")
.setExtra("name", user.getName())
.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()));
user.setLastLoginTime(LocalDateTime.now());
appUserService.updateById(user);
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=nacos:
logging.level.root=info
logging.level.org.mybatis=debug
#logging.level.com.alibaba.nacos.client=DEBUG
#logging.level.org.springframework.boot.context.config=DEBUG
#logging.config=classpath:logback-sit.xml

View File

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

View File

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

View File

@ -13,20 +13,20 @@ public class PageData<T> implements Serializable {
//当前页码
@Setter
private long page = 1;
private int page = 1;
//每页数据条数
@Setter
private long pageSize = 20;
private int pageSize = 20;
//总条数
@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;
}

View File

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

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.common.util;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.hutool.core.collection.ListUtil;
import java.util.List;
@ -11,6 +12,7 @@ public class AdminUserUtil {
private static final Map<Integer, List<String>> PERMISSION_MAP = new ConcurrentHashMap<>();
public static Integer getUserId(){
SaTokenInfo tokenValue = SaTokenAdminUtil.getTokenInfo();
if (SaTokenAdminUtil.isLogin()) {
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) {
PageData<T> pageData = new PageData<>();
pageData.setPage(page.getCurrent());
pageData.setPageSize(page.getSize());
pageData.setTotal(page.getTotal());
pageData.setPage((int) page.getCurrent());
pageData.setPageSize((int) page.getSize());
pageData.setTotal((int) page.getTotal());
pageData.setItems(page.getRecords().stream().map(mapper).collect(Collectors.toList()));
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.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 工单-关注
@ -38,6 +39,11 @@ public class TicketFollow implements Serializable {
*/
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);
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())
.page(new Page<>(request.getPage(), request.getPageSize()));
PageData<AdminUserVO> pageData = new PageData<>();
pageData.setPage(page.getCurrent());
pageData.setPageSize(page.getSize());
pageData.setTotal(page.getTotal());
pageData.setPage((int) page.getCurrent());
pageData.setPageSize((int) page.getSize());
pageData.setTotal((int) page.getTotal());
pageData.setItems(page.getRecords().stream().map(u ->
new AdminUserVO()
.setId(u.getId())

View File

@ -11,7 +11,6 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* <p>
@ -26,33 +25,58 @@ public class TicketFollowServiceImpl extends ServiceImpl<TicketFollowMapper, Tic
@Override
public void handle(FollowRequest request, Integer userId) {
if (request.getIsFollow()){
if (request.getIsFollow()) {
TicketFollow ticketFollow = lambdaQuery()
.eq(TicketFollow::getTicketId,request.getTicketId())
.eq(TicketFollow::getUserId,userId)
.eq(TicketFollow::getTicketId, request.getTicketId())
.eq(TicketFollow::getUserId, userId)
.eq(TicketFollow::getFrom, (byte) 0)
.one();
if (Objects.isNull(ticketFollow)){
if (Objects.isNull(ticketFollow)) {
TicketFollow follow = new TicketFollow()
.setTicketId(request.getTicketId())
.setUserId(userId)
.setFrom((byte) 0)
.setCreateTime(LocalDateTime.now());
save(follow);
}
}else {
LambdaQueryWrapper<TicketFollow> lambdaQueryWrapper =new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(TicketFollow::getTicketId,request.getTicketId());
lambdaQueryWrapper.eq(TicketFollow::getUserId,userId);
} else {
LambdaQueryWrapper<TicketFollow> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(TicketFollow::getTicketId, request.getTicketId());
lambdaQueryWrapper.eq(TicketFollow::getUserId, userId);
lambdaQueryWrapper.eq(TicketFollow::getFrom, (byte) 0);
this.remove(lambdaQueryWrapper);
}
}
@Override
public List<Integer> getUsers(Integer id) {
public List<TicketFollow> getUsers(Integer id) {
return lambdaQuery()
.eq(TicketFollow::getTicketId, id)
.list()
.stream()
.map(TicketFollow::getUserId)
.collect(Collectors.toList());
.list();
}
@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">
<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',
m.is_read AS 'isRead'
FROM admin_message m
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}
<if test="request.type != null">
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_menu m ON rmm.menu_id=m.id
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}
</foreach>
UNION
@ -19,7 +19,7 @@
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
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}
</foreach>
</select>
@ -30,7 +30,7 @@
INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id
INNER JOIN admin_menu m ON rmm.menu_id=m.id
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}
</foreach>
</select>
@ -41,7 +41,7 @@
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
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}
</foreach>
</select>

View File

@ -3,7 +3,7 @@
<mapper namespace="com.nflg.mobilebroken.repository.mapper.AppMessageMapper">
<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
INNER JOIN ticket t ON m.ticket_id=t.id
INNER JOIN app_user u ON t.user_id=u.id
@ -11,7 +11,7 @@
ORDER BY m.id
</select>
<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
INNER JOIN ticket t ON m.ticket_id=t.id
INNER JOIN app_user u ON t.user_id=u.id

View File

@ -65,21 +65,21 @@
</sql>
<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
LEFT JOIN app_user u ON t.user_id=u.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}
<include refid="searchWhereCondition"/>
</select>
<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
LEFT JOIN app_user u ON t.user_id=u.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}
<include refid="searchWhereCondition"/>
</select>
@ -143,12 +143,12 @@
<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'
,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
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 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 dictionary_item di ON d.warranty_state=di.id
<include refid="adminSearchWhereCondition"/>
@ -157,12 +157,12 @@
<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'
,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
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 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 dictionary_item di ON d.warranty_state=di.id
<include refid="adminSearchWhereCondition"/>

View File

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

View File

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