From 8865f971f82b5117fb472603efd88eb15e67d85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 19 Dec 2025 14:01:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(message):=20=E5=AE=9E=E7=8E=B0=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=9C=AA=E8=AF=BB=E6=95=B0=E9=87=8F=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AdminMessage实体新增key字段用于唯一标识消息 - AdminMessageServiceImpl新增getNotReadMessageCount1方法,按key聚合未读消息 - AppMessageServiceImpl新增getNotReadMessageCount1方法,按ticketId聚合未读消息 - 新增AdminNotReadMessageCountVO和AdminNotReadTicketMessageCountVO数据结构 - 新增AppNotReadMessageCountVO和AppNotReadTicketMessageCountVO数据结构 - AdminMessageService和AppMessageService接口新增getNotReadMessageCount1方法声明 - Admin端和App端消息控制器新增获取未读消息数量接口getNotReadMessageCount1 - 修正工单解决方案相关消息的SubType枚举及接口调用 - 优化TicketSolutionServiceImpl中工单解决方案分组逻辑,改为按dictionaryItemId分组 --- .../admin/controller/MessageController.java | 11 +++++++ .../cfs/controller/MessageController.java | 11 +++++++ .../common/constant/MessageSubType.java | 5 ++- .../pojo/vo/AdminNotReadMessageCountVO.java | 18 ++++++++++ .../vo/AdminNotReadTicketMessageCountVO.java | 18 ++++++++++ .../pojo/vo/AppNotReadMessageCountVO.java | 19 +++++++++++ .../vo/AppNotReadTicketMessageCountVO.java | 13 ++++++++ .../gongfu/controller/TicketController.java | 19 ++--------- .../repository/entity/AdminMessage.java | 11 +++++-- .../service/IAdminMessageService.java | 3 ++ .../service/IAppMessageService.java | 3 ++ .../service/impl/AdminMessageServiceImpl.java | 33 ++++++++++++++++--- .../service/impl/AppMessageServiceImpl.java | 27 ++++++++++++++- .../impl/TicketSolutionServiceImpl.java | 6 ++-- 14 files changed, 168 insertions(+), 29 deletions(-) create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadMessageCountVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadTicketMessageCountVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadMessageCountVO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadTicketMessageCountVO.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java index b246cee9..b9c8a852 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java @@ -9,6 +9,7 @@ import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.request.MessageConfigRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadMessageCountVO; import com.nflg.mobilebroken.common.pojo.vo.MessageConfigVO; import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.PageUtil; @@ -158,6 +159,16 @@ public class MessageController extends ControllerBase { return ApiResult.success(adminMessageService.getNotReadMessageCount(AdminUserUtil.getUserId())); } + /** + * 获取未读消息数量(新) + * @return 未读消息数量 + */ + @GetMapping("getNotReadMessageCount1") + @ApiMark(moduleName = "消息管理", apiName = "获取未读消息数量1") + public ApiResult getNotReadMessageCount1() { + return ApiResult.success(adminMessageService.getNotReadMessageCount1(AdminUserUtil.getUserId())); + } + /** * 获取消息配置 * @return 消息配置 diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java index 20da0433..7896cb1f 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java @@ -6,7 +6,9 @@ import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.request.AppMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.request.MessageConfigRequest; import com.nflg.mobilebroken.common.pojo.vo.AppMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AppNotReadMessageCountVO; import com.nflg.mobilebroken.common.pojo.vo.MessageConfigVO; +import com.nflg.mobilebroken.common.util.AdminUserUtil; import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.repository.service.IAppMessageService; import org.springframework.data.redis.core.HashOperations; @@ -83,6 +85,15 @@ public class MessageController extends ControllerBase { return ApiResult.success(appMessageService.getNotReadMessageCount(AppUserUtil.getUserId(),AppUserUtil.getFrom())); } + /** + * 获取未读消息数量(新) + * @return 未读消息数量 + */ + @GetMapping("getNotReadMessageCount1") + public ApiResult getNotReadMessageCount1() { + return ApiResult.success(appMessageService.getNotReadMessageCount1(AdminUserUtil.getUserId(), AppUserUtil.getFrom())); + } + /** * 获取消息配置 * @return 消息配置 diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/MessageSubType.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/MessageSubType.java index 519ce116..77b93874 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/MessageSubType.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/MessageSubType.java @@ -38,7 +38,10 @@ public enum MessageSubType { //派工单完成 DispatchComplate(14, "派工单完成"), //派工单延期审核结果 - DispatchAuditResult(15, "派工单延期审核结果"); + DispatchAuditResult(15, "派工单延期审核结果"), + //工单解决方案审核 + TicketSolutionAuditResult(16, "工单解决方案审核结果"), + ; private final Integer state; private final String description; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadMessageCountVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadMessageCountVO.java new file mode 100644 index 00000000..8e890b6b --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadMessageCountVO.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class AdminNotReadMessageCountVO { + + /** + * 未读消息总数量 + */ + private Integer count; + + private List items; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadTicketMessageCountVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadTicketMessageCountVO.java new file mode 100644 index 00000000..5d71bae7 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminNotReadTicketMessageCountVO.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class AdminNotReadTicketMessageCountVO { + + /** + * 来源,0:工单;1:代理商账户审核;2:派工单;3:工服工单 + */ + private Integer source; + + private Long sourceId; + + private Integer count; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadMessageCountVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadMessageCountVO.java new file mode 100644 index 00000000..5ad8e72c --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadMessageCountVO.java @@ -0,0 +1,19 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class AppNotReadMessageCountVO { + + + /** + * 未读消息总数量 + */ + private Integer count; + + private List ticketItems; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadTicketMessageCountVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadTicketMessageCountVO.java new file mode 100644 index 00000000..dc142ac1 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AppNotReadTicketMessageCountVO.java @@ -0,0 +1,13 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class AppNotReadTicketMessageCountVO { + + private Long ticketId; + + private Integer count; +} diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java index 22900674..a5f61c53 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java @@ -860,22 +860,7 @@ public class TicketController extends ControllerBase { @PostMapping("saveSolutionMeasures") @ApiMark(moduleName = "工单管理", apiName = "保存工单解决方案措施") public ApiResult saveSolutionMeasures(@Valid @RequestBody SolutionMeasuresSaveRequest request) { - GongfuTicket ticket = ticketSolutionService.saveSolutionMeasures1(request); - List auditIds = deviceTypeService.getCqms(ticket.getDeviceNo()); - auditIds.forEach(uid -> { - adminMessageService.add( - new AdminMessage() - .setNo(ticket.getNo()) - .setTitle(ticket.getTitle()) - .setUserId(uid) - .setSourceId(ticket.getId()) - .setSource(3) - .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketSolutionAudit.getState()) - .setIsRead(false) - .setCreateTime(LocalDateTime.now()) - ); - }); + ticketSolutionService.saveSolutionMeasures1(request); return ApiResult.success(); } @@ -896,7 +881,7 @@ public class TicketController extends ControllerBase { .setSourceId(ticket.getId()) .setSource(3) .setType(MessageType.WorkOrderAssignment.getState()) - .setSubType(MessageSubType.TicketSolutionAudit.getState()) + .setSubType(MessageSubType.TicketSolutionAuditResult.getState()) .setIsRead(false) .setCreateTime(LocalDateTime.now()) ); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminMessage.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminMessage.java index aebb1d52..3b92bcca 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminMessage.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/AdminMessage.java @@ -1,6 +1,7 @@ package com.nflg.mobilebroken.repository.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Getter; @@ -12,9 +13,8 @@ import java.time.LocalDateTime; /** *

- * - *

* + *

* @author 代码生成器生成 * @since 2025 */ @@ -73,4 +73,11 @@ public class AdminMessage implements Serializable { * 创建时间 */ private LocalDateTime createTime; + + @TableField(exist = false) + private String key; + + public String getKey() { + return userId + "|" + source + "|" + sourceId; + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java index cbd3fd29..ad91b6bd 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadMessageCountVO; import com.nflg.mobilebroken.repository.entity.AdminMessage; import java.util.List; @@ -31,4 +32,6 @@ public interface IAdminMessageService extends IService { Integer getNotReadMessageCount(Integer userId); void remove(Integer source, Integer sourceId, Integer userId, Integer subType); + + AdminNotReadMessageCountVO getNotReadMessageCount1(Integer userId); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java index fa83d3dd..5d5c41e7 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.request.AppMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AppMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AppNotReadMessageCountVO; import com.nflg.mobilebroken.repository.entity.AppMessage; import java.util.List; @@ -29,4 +30,6 @@ public interface IAppMessageService extends IService { void add(AppMessage message); Integer getNotReadMessageCount(Integer userId,String from); + + AppNotReadMessageCountVO getNotReadMessageCount1(Integer userId, String from); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java index 07c66d38..edb873d0 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadMessageCountVO; +import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadTicketMessageCountVO; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.mapper.AdminMessageMapper; import com.nflg.mobilebroken.repository.service.IAdminMessageService; @@ -16,12 +18,12 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; /** *

- * 服务实现类 + * 服务实现类 *

- * * @author 曹鹏飞 * @since 2025-01-23 */ @@ -57,7 +59,7 @@ public class AdminMessageServiceImpl extends ServiceImpl() .eq(AdminMessage::getIsRead, false) .eq(AdminMessage::getSubType, message.getSubType()) @@ -72,8 +74,8 @@ public class AdminMessageServiceImpl extends ServiceImpl(1, num)); } - private void setUnreadMessageCount(Integer userId){ - Integer count= Math.toIntExact(lambdaQuery() + private void setUnreadMessageCount(Integer userId) { + Integer count = Math.toIntExact(lambdaQuery() .eq(AdminMessage::getIsRead, false) .eq(AdminMessage::getUserId, userId) .count()); @@ -98,4 +100,25 @@ public class AdminMessageServiceImpl extends ServiceImpl datas = lambdaQuery() + .eq(AdminMessage::getIsRead, false) + .eq(AdminMessage::getUserId, userId) + .list(); + return new AdminNotReadMessageCountVO() + .setCount(datas.size()) + .setItems(datas.stream() + .collect(Collectors.groupingBy(AdminMessage::getKey)) + .values() + .stream() + .map(items -> new AdminNotReadTicketMessageCountVO() + .setSource(items.get(0).getSource()) + .setSourceId(items.get(0).getSourceId()) + .setCount(items.size()) + ) + .collect(Collectors.toList()) + ); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java index 78cc31a2..207f9c47 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java @@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.pojo.request.AppMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AppMessageVO; +import com.nflg.mobilebroken.common.pojo.vo.AppNotReadMessageCountVO; +import com.nflg.mobilebroken.common.pojo.vo.AppNotReadTicketMessageCountVO; import com.nflg.mobilebroken.repository.entity.AppMessage; import com.nflg.mobilebroken.repository.mapper.AppMessageMapper; import com.nflg.mobilebroken.repository.service.IAdminUserService; @@ -90,8 +92,10 @@ public class AppMessageServiceImpl extends ServiceImpl() .eq(AppMessage::getIsRead, false) .eq(AppMessage::getSubType, message.getSubType()) + .eq(AppMessage::getTicketId, message.getTicketId()) .eq(AppMessage::getUserId, message.getUserId()) - .eq(AppMessage::getUserPlatform, message.getUserPlatform())); + .eq(AppMessage::getUserPlatform, message.getUserPlatform()) + ); save(message); setUnreadMessageCount(message.getUserId(), message.getUserPlatform()); } @@ -114,4 +118,25 @@ public class AppMessageServiceImpl extends ServiceImpl datas = lambdaQuery() + .eq(AppMessage::getIsRead, false) + .eq(AppMessage::getUserId, userId) + .eq(AppMessage::getUserPlatform, from) + .list(); + return new AppNotReadMessageCountVO() + .setCount(datas.size()) + .setTicketItems(datas.stream() + .collect(Collectors.groupingBy(AppMessage::getTicketId)) + .values() + .stream() + .map(items -> new AppNotReadTicketMessageCountVO() + .setTicketId(items.get(0).getTicketId()) + .setCount(items.size()) + ) + .collect(Collectors.toList()) + ); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionServiceImpl.java index 909b2bac..6bb675c4 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionServiceImpl.java @@ -65,7 +65,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl solutions = lambdaQuery().eq(TicketSolution::getTicketId, ticketId).orderByAsc(TicketSolution::getId).list(); - Map> groupedSolutions = solutions.stream().collect(Collectors.groupingBy(TicketSolution::getDictionaryItemName, LinkedHashMap::new, Collectors.toList())); + Map> groupedSolutions = solutions.stream().collect(Collectors.groupingBy(TicketSolution::getDictionaryItemId, LinkedHashMap::new, Collectors.toList())); SolutionMeasuresVO vo = new SolutionMeasuresVO(); if (SaTokenAdminUtil.isLogin()) { if (ticket.getType() == 0) { @@ -92,7 +92,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl new SolutionMeasuresItemVO() - .setName(ks.getKey()) + .setName(ks.getValue().get(0).getDictionaryItemName()) .setItems(ks.getValue().stream().map(v -> new SolutionMeasuresDataItemVO() .setId(Long.valueOf(v.getId())) .setName(v.getDescription()) @@ -104,7 +104,7 @@ public class TicketSolutionServiceImpl extends ServiceImpl values = groupedSolutions.get(it.getName()); + List values = groupedSolutions.get(it.getId()); if (CollectionUtil.isEmpty(values)) { items.add(new SolutionMeasuresItemVO().setId(it.getId()).setName(it.getName()).setItems(Collections.emptyList())); } else {