diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/messagecenter/MessageCenterController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/messagecenter/MessageCenterController.java index 48d49727..7f7bbe26 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/messagecenter/MessageCenterController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/messagecenter/MessageCenterController.java @@ -1,37 +1,31 @@ package cn.iocoder.yudao.module.farm.controller.admin.messagecenter; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterRespVO; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterSaveReqVO; -import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; -import jakarta.validation.Valid; -import jakarta.validation.Valid; -import jakarta.servlet.http.HttpServletResponse; -import java.util.List; -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; - -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; - -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import java.io.IOException; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; - +import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageStatisticsRespVO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; import cn.iocoder.yudao.module.farm.service.messagecenter.MessageCenterService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 消息中心") @RestController @@ -90,12 +84,21 @@ public class MessageCenterController { @Operation(summary = "导出消息中心 Excel") @ApiAccessLog(operateType = EXPORT) public void exportMessageCenterExcel(@Valid MessageCenterPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = messageCenterService.getMessageCenterPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "消息中心.xls", "数据", MessageCenterRespVO.class, - BeanUtils.toBean(list, MessageCenterRespVO.class)); + BeanUtils.toBean(list, MessageCenterRespVO.class)); + } + + @GetMapping("/statistics") + @Operation(summary = "获取消息统计信息") + public CommonResult getMessageStatistics( + @Parameter(description = "开始时间") @RequestParam(value = "startTime", required = false) String startTime, + @Parameter(description = "结束时间") @RequestParam(value = "endTime", required = false) String endTime) { + MessageStatisticsRespVO statistics = messageCenterService.getMessageStatistics(startTime, endTime); + return success(statistics); } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java index 89910ea4..60e17503 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java @@ -1,11 +1,16 @@ package cn.iocoder.yudao.module.farm.dal.mysql.messagecenter; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; /** * 消息中心 Mapper @@ -32,4 +37,50 @@ public interface MessageCenterMapper extends BaseMapperX { .orderByDesc(MessageCenterDO::getCreateTime)); } + /** + * 统计总消息数 + */ + @Select("") + Long countMessages(@Param("tenantId") Long tenantId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + + /** + * 统计未读消息数 + */ + @Select("") + Long countUnreadMessages(@Param("tenantId") Long tenantId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + + /** + * 按消息类型统计 + */ + @Select("") + List> countByMessageType(@Param("tenantId") Long tenantId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java index bf426f66..2c0f3091 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.farm.service.messagecenter; +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterSaveReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageStatisticsRespVO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import jakarta.validation.Valid; import java.util.List; @@ -39,10 +39,10 @@ public interface MessageCenterService { void deleteMessageCenter(String id); /** - * 批量删除消息中心 - * - * @param ids 编号 - */ + * 批量删除消息中心 + * + * @param ids 编号 + */ void deleteMessageCenterListByIds(List ids); /** @@ -61,4 +61,13 @@ public interface MessageCenterService { */ PageResult getMessageCenterPage(MessageCenterPageReqVO pageReqVO); + /** + * 获取消息统计信息 + * + * @param startTime 开始时间(可选) + * @param endTime 结束时间(可选) + * @return 消息统计信息 + */ + MessageStatisticsRespVO getMessageStatistics(String startTime, String endTime); + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java index 19504723..53bbcc0f 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java @@ -6,13 +6,17 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageCenterSaveReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.messagecenter.vo.MessageStatisticsRespVO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; import cn.iocoder.yudao.module.farm.dal.mysql.messagecenter.MessageCenterMapper; +import cn.iocoder.yudao.module.farm.enums.MessageTypeEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; @@ -82,4 +86,34 @@ public class MessageCenterServiceImpl implements MessageCenterService { return messageCenterMapper.selectPage(pageReqVO); } + @Override + public MessageStatisticsRespVO getMessageStatistics(String startTime, String endTime) { + // 基础统计 + Long totalCount = messageCenterMapper.countMessages(getLoginUser().getTenantId(), startTime, endTime); + Long unreadCount = messageCenterMapper.countUnreadMessages(getLoginUser().getTenantId(), startTime, endTime); + Long readCount = totalCount - unreadCount; + + // 按消息类型统计 + List messageTypeStats = new ArrayList<>(); + List> typeStats = messageCenterMapper.countByMessageType(getLoginUser().getTenantId(), startTime, endTime); + for (Map stat : typeStats) { + Integer messageType = (Integer) stat.get("message_type"); + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByType(messageType); + messageTypeStats.add(MessageStatisticsRespVO.MessageTypeStatistics.builder() + .messageType(messageType) + .messageTypeName(messageTypeEnum != null ? messageTypeEnum.getName() : "未知") + .count(((Number) stat.get("count")).longValue()) + .unreadCount(((Number) stat.get("unread_count")).longValue()) + .readCount(((Number) stat.get("read_count")).longValue()) + .build()); + } + + return MessageStatisticsRespVO.builder() + .totalCount(totalCount) + .unreadCount(unreadCount) + .readCount(readCount) + .messageTypeStats(messageTypeStats) + .build(); + } + } \ No newline at end of file