feat(todo): 新增问题工单待办数量统计及已读状态管理

- 重构待办事项查询接口,支持返回问题工单待办详情VO
- 增加待办事项实体和VO的已读状态字段
- 实现查询待办列表时自动标记未读待办为已读
- 新增接口获取当前用户已读和未读的待办数量
- 对应Mapper添加获取待办数量SQL查询
- 调整控制层提供待办数量的访问接口
- 删除与问题工单待办无关的旧待办项相关代码和依赖
This commit is contained in:
曹鹏飞 2026-05-13 14:21:45 +08:00
parent 45917f2501
commit 96ab6d14f8
12 changed files with 93 additions and 36 deletions

View File

@ -5,7 +5,8 @@ import com.nflg.qms.admin.service.QmsIssueTicketTodoControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
@ -25,8 +26,16 @@ public class QmsIssueTicketTodoController extends BaseController {
* 查询
*/
@PostMapping("search")
public ApiResult<PageData<QmsTodoItemVO>> search(@Valid @RequestBody QmsTodoItemSearchQO request) {
IPage<QmsTodoItemVO> page = qmsIssueTicketTodoControllerService.search(request);
public ApiResult<PageData<QmsIssueTicketToDoVO>> search(@Valid @RequestBody QmsTodoItemSearchQO request) {
IPage<QmsIssueTicketToDoVO> page = qmsIssueTicketTodoControllerService.search(request);
return ApiResult.success(page);
}
/**
* 获取待办数量
*/
@GetMapping("getCount")
public ApiResult<IssueTicketTodoNotReadNumVO> getCount(){
return ApiResult.success(qmsIssueTicketTodoControllerService.getCount());
}
}

View File

@ -4,12 +4,12 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsIssueTicketProcess;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import com.nflg.wms.repository.service.IQmsIssueTicketToDoService;
import com.nflg.wms.repository.service.IQmsTodoItemService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@ -28,10 +28,11 @@ public class QmsIssueTicketTodoControllerService {
/**
* 分页查询待办事项列表
*/
public IPage<QmsTodoItemVO> search(QmsTodoItemSearchQO request) {
IPage<QmsTodoItemVO> pageData = issueTicketToDoService.search(request);
public IPage<QmsIssueTicketToDoVO> search(QmsTodoItemSearchQO request) {
IPage<QmsIssueTicketToDoVO> pageData = issueTicketToDoService.search(request);
if (CollectionUtil.isNotEmpty(pageData.getRecords())) {
pageData.getRecords().forEach(item -> {
item.setIsRead(true);
if (item.getStatus() != 2) {
item.setCurrentHandleUserName(
StrUtil.join(",",
@ -50,4 +51,8 @@ public class QmsIssueTicketTodoControllerService {
}
return pageData;
}
public IssueTicketTodoNotReadNumVO getCount() {
return issueTicketToDoService.getCount(UserUtil.getUserId());
}
}

View File

@ -0,0 +1,17 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
@Data
public class IssueTicketTodoNotReadNumVO {
/**
* 已读数量
*/
private Integer readNum;
/**
* 未读数量
*/
private Integer unreadNum;
}

View File

@ -8,7 +8,7 @@ import java.time.LocalDateTime;
* 待办事项 信息VO
*/
@Data
public class QmsTodoItemVO {
public class QmsIssueTicketToDoVO {
private Long id;
@ -61,4 +61,9 @@ public class QmsTodoItemVO {
* 类型0=处理主工单1=处理工单子项2=审核工单子项
*/
private Integer type;
/**
* 是否已读
*/
private Boolean isRead;
}

View File

@ -39,4 +39,9 @@ public class QmsIssueTicketToDo implements Serializable {
* 处理人ID
*/
private Long handlerUserId;
/**
* 是否已读
*/
private Boolean isRead;
}

View File

@ -4,7 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO;
import com.nflg.wms.repository.entity.QmsIssueTicketToDo;
/**
@ -12,5 +13,7 @@ import com.nflg.wms.repository.entity.QmsIssueTicketToDo;
*/
public interface QmsIssueTicketToDoMapper extends BaseMapper<QmsIssueTicketToDo> {
IPage<QmsTodoItemVO> search(QmsTodoItemSearchQO request, Long userId, Page<Object> page);
IPage<QmsIssueTicketToDoVO> search(QmsTodoItemSearchQO request, Long userId, Page<Object> page);
IssueTicketTodoNotReadNumVO getCount(Long userId);
}

View File

@ -1,10 +1,6 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.repository.entity.QmsTodoItem;
/**

View File

@ -3,7 +3,8 @@ package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO;
import com.nflg.wms.repository.entity.QmsIssueTicketToDo;
/**
@ -14,7 +15,9 @@ public interface IQmsIssueTicketToDoService extends IService<QmsIssueTicketToDo>
/**
* 分页查询待办事项列表
*/
IPage<QmsTodoItemVO> search(QmsTodoItemSearchQO request);
IPage<QmsIssueTicketToDoVO> search(QmsTodoItemSearchQO request);
void processed(Long id);
IssueTicketTodoNotReadNumVO getCount(Long userId);
}

View File

@ -1,13 +1,8 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.repository.entity.QmsTodoItem;
import java.util.List;
/**
* 待办事项 服务类
*/

View File

@ -1,18 +1,19 @@
package com.nflg.wms.repository.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsIssueTicketToDo;
import com.nflg.wms.repository.entity.QmsTodoItem;
import com.nflg.wms.repository.mapper.QmsIssueTicketToDoMapper;
import com.nflg.wms.repository.service.IQmsIssueTicketToDoService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* 质量问题工单待办 ServiceImpl
@ -23,8 +24,22 @@ public class QmsIssueTicketToDoServiceImpl
implements IQmsIssueTicketToDoService {
@Override
public IPage<QmsTodoItemVO> search(QmsTodoItemSearchQO request) {
return baseMapper.search(request, UserUtil.getUserId(), new Page<>(request.getPage(), request.getPageSize()));
public IPage<QmsIssueTicketToDoVO> search(QmsTodoItemSearchQO request) {
IPage<QmsIssueTicketToDoVO> pageData = baseMapper.search(request, UserUtil.getUserId(), new Page<>(request.getPage(), request.getPageSize()));
if (CollectionUtil.isNotEmpty(pageData.getRecords())) {
List<Long> ticketIds = pageData.getRecords()
.stream()
.filter(todo -> !todo.getIsRead())
.map(QmsIssueTicketToDoVO::getId)
.toList();
if (CollectionUtil.isNotEmpty(ticketIds)) {
lambdaUpdate()
.in(QmsIssueTicketToDo::getTicketId, ticketIds)
.set(QmsIssueTicketToDo::getIsRead, true)
.update();
}
}
return pageData;
}
@Override
@ -36,4 +51,9 @@ public class QmsIssueTicketToDoServiceImpl
.eq(QmsIssueTicketToDo::getHasProcessed, false)
.update();
}
@Override
public IssueTicketTodoNotReadNumVO getCount(Long userId) {
return baseMapper.getCount(userId);
}
}

View File

@ -1,19 +1,11 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.qo.QmsTodoItemSearchQO;
import com.nflg.wms.common.pojo.vo.QmsTodoItemVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsTodoItem;
import com.nflg.wms.repository.mapper.QmsTodoItemMapper;
import com.nflg.wms.repository.service.IQmsTodoItemService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* 待办事项 服务实现类
*/

View File

@ -2,13 +2,14 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.QmsIssueTicketToDoMapper">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.QmsTodoItemVO">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.QmsIssueTicketToDoVO">
SELECT
CASE
WHEN vit."type" = 0 THEN 0
WHEN vit.handler_user_id = #{userId} THEN 1
WHEN vit.approval_user_id = #{userId} THEN 2
END AS type,
itd.is_read,
vit.*
FROM qms_issue_ticket_todo itd
INNER JOIN v_qms_issue_ticket vit ON itd.ticket_id = vit.ticket_id
@ -31,4 +32,10 @@
ORDER BY itd.id DESC
</select>
<select id="getCount" resultType="com.nflg.wms.common.pojo.vo.IssueTicketTodoNotReadNumVO">
SELECT SUM(CASE is_read WHEN true THEN 1 ELSE 0 END) AS "readNum",
SUM(CASE is_read WHEN true THEN 0 ELSE 1 END) AS "unreadNum"
FROM qms_issue_ticket_todo
WHERE handler_user_id = #{userId}
</select>
</mapper>