diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/NoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/NoticeController.java index 5bb591699..24efe2a1f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/NoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/NoticeController.java @@ -43,7 +43,6 @@ public class NoticeController extends BaseController { } @ApiOperation(value = "公告详情(档口公告、系统公告)", httpMethod = "PUT", response = R.class) - @Log(title = "公告详情", businessType = BusinessType.UPDATE) @GetMapping("/{noticeId}") public R getInfo(@PathVariable Long noticeId) { return R.ok(BeanUtil.toBean(noticeService.getInfo(noticeId), NoticeResVO.class)); @@ -56,7 +55,7 @@ public class NoticeController extends BaseController { return R.ok(noticeService.delete(BeanUtil.toBean(deleteVO, NoticeDeleteDTO.class))); } - @ApiOperation(value = "查询公告列表 ", httpMethod = "POST", response = R.class) + @ApiOperation(value = "档口公告列表、系统公告列表 ", httpMethod = "POST", response = R.class) @PostMapping("/page") public R> page(@Validated @RequestBody NoticePageVO pageVO) { return R.ok(noticeService.page(BeanUtil.toBean(pageVO, NoticePageDTO.class))); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/UserNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/UserNoticeController.java index c86a0b8d5..912511aeb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/UserNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/UserNoticeController.java @@ -1,8 +1,24 @@ package com.ruoyi.web.controller.xkt; +import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.core.controller.XktBaseController; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.Page; +import com.ruoyi.web.controller.xkt.vo.userNotice.UserNoticeAppListResVO; +import com.ruoyi.web.controller.xkt.vo.userNotice.UserNoticeAppTypePageVO; +import com.ruoyi.web.controller.xkt.vo.userNotice.UserNoticePageVO; +import com.ruoyi.xkt.dto.userNotice.UserNoticeAppResDTO; +import com.ruoyi.xkt.dto.userNotice.UserNoticeAppTypePageDTO; +import com.ruoyi.xkt.dto.userNotice.UserNoticePageDTO; +import com.ruoyi.xkt.dto.userNotice.UserNoticeResDTO; +import com.ruoyi.xkt.service.IUserNoticeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 用户所有通知Controller @@ -10,8 +26,30 @@ import org.springframework.web.bind.annotation.RestController; * @author ruoyi * @date 2025-03-26 */ +@Api(tags = "用户所有通知") @RestController +@RequiredArgsConstructor @RequestMapping("/rest/v1/user-notices") public class UserNoticeController extends XktBaseController { + final IUserNoticeService userNoticeService; + + @ApiOperation(value = "PC - 电商卖家消息列表", httpMethod = "POST", response = R.class) + @PostMapping("/pc/page") + public R> pcPage(@Validated @RequestBody UserNoticePageVO pageVO) { + return R.ok(userNoticeService.pcPage(BeanUtil.toBean(pageVO, UserNoticePageDTO.class))); + } + + @ApiOperation(value = "APP - 电商卖家消息列表", httpMethod = "GET", response = R.class) + @GetMapping("/app/list") + public R> appList() { + return R.ok(BeanUtil.copyToList(userNoticeService.appList(), UserNoticeAppListResVO.class)); + } + + @ApiOperation(value = "APP - 获取某一个类型消息列表", httpMethod = "POST", response = R.class) + @PostMapping("/app/type/page") + public R> appTypePage(@Validated @RequestBody UserNoticeAppTypePageVO pageVO) { + return R.ok(userNoticeService.appTypePage(BeanUtil.toBean(pageVO, UserNoticeAppTypePageDTO.class))); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/notice/NoticePageVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/notice/NoticePageVO.java index 2592c9342..c794f843d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/notice/NoticePageVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/notice/NoticePageVO.java @@ -6,17 +6,22 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotNull; + /** * @author liujiang * @version v1.0 * @date 2025/3/27 15:12 */ @EqualsAndHashCode(callSuper = true) -@ApiModel("公告分页查询入参") +@ApiModel("档口消息、系统消息分页查询入参") @Data public class NoticePageVO extends BasePageVO { @ApiModelProperty(value = "公告标题") private String noticeTitle; + @NotNull(message = "ownerType不能为空") + @ApiModelProperty(value = "谁发的公告 1 档口 2 系统") + private Integer ownerType; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppListResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppListResVO.java new file mode 100644 index 000000000..7c36e3645 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppListResVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.userNotice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("用户消息APP返回数据") +@Data +@Accessors(chain = true) +public class UserNoticeAppListResVO { + + @ApiModelProperty(value = "用户通知类型") + private Integer targetNoticeType; + @ApiModelProperty(value = "用户通知类型名称") + private String targetNoticeTypeName; + @ApiModelProperty(value = "公告内容") + private String noticeContent; + @ApiModelProperty(value = "创建时间") + private Date createTime; + @ApiModelProperty(value = "是否已读 0未读 1已读") + private Integer readStatus; + @ApiModelProperty(value = "公告状态 0不提醒 1提醒") + private Integer remindStatus; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppTypePageVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppTypePageVO.java new file mode 100644 index 000000000..f574595fc --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticeAppTypePageVO.java @@ -0,0 +1,25 @@ +package com.ruoyi.web.controller.xkt.vo.userNotice; + +import com.ruoyi.web.controller.xkt.vo.BasePageVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel("用户消息分页查询入参") +@Data +public class UserNoticeAppTypePageVO extends BasePageVO { + + @NotNull(message = "消息接收类型不能为空") + @ApiModelProperty(value = "消息接收类型") + private Integer targetNoticeType; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticePageVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticePageVO.java new file mode 100644 index 000000000..90c67ad77 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/userNotice/UserNoticePageVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.web.controller.xkt.vo.userNotice; + +import com.ruoyi.web.controller.xkt.vo.BasePageVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel("用户消息分页查询入参") +@Data +public class UserNoticePageVO extends BasePageVO { + + @ApiModelProperty(value = "公告标题") + private String noticeTitle; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticePageDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticePageDTO.java index edcee80dd..efc5b6e8f 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticePageDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticePageDTO.java @@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotNull; + /** * @author liujiang * @version v1.0 @@ -18,5 +20,7 @@ public class NoticePageDTO extends BasePageDTO { @ApiModelProperty(value = "公告标题") private String noticeTitle; + @ApiModelProperty(value = "谁发的公告 1 档口 2 系统") + private Integer ownerType; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticeResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticeResDTO.java index a6392bb06..6b194c6df 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticeResDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/notice/NoticeResDTO.java @@ -1,5 +1,6 @@ package com.ruoyi.xkt.dto.notice; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -13,7 +14,7 @@ import java.util.Date; * @version v1.0 * @date 2025/3/27 15:12 */ -@ApiModel("新增公告") +@ApiModel("消息返回数据") @Data @Accessors(chain = true) public class NoticeResDTO { @@ -35,5 +36,7 @@ public class NoticeResDTO { private Date effectEnd; @ApiModelProperty(value = "是否永久生效 1不是 2是") private Integer perpetuity; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserFocusAndFavUserIdDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserFocusAndFavUserIdDTO.java new file mode 100644 index 000000000..5e5e3d0ef --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserFocusAndFavUserIdDTO.java @@ -0,0 +1,23 @@ +package com.ruoyi.xkt.dto.userNotice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("用户关注档口或者收藏商品用户ID列表") +@Data +@Accessors(chain = true) +public class UserFocusAndFavUserIdDTO { + + @ApiModelProperty(value = "用户接收消息类型") + private Integer targetNoticeType; + @ApiModelProperty(value = "用户ID") + private Long userId; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppListResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppListResDTO.java new file mode 100644 index 000000000..406641afa --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppListResDTO.java @@ -0,0 +1,33 @@ +package com.ruoyi.xkt.dto.userNotice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("用户消息APP返回数据") +@Data +@Accessors(chain = true) +public class UserNoticeAppListResDTO { + + @ApiModelProperty(value = "用户通知类型") + private Integer targetNoticeType; + @ApiModelProperty(value = "用户通知类型名称") + private String targetNoticeTypeName; + @ApiModelProperty(value = "公告内容") + private String noticeContent; + @ApiModelProperty(value = "创建时间") + private Date createTime; + @ApiModelProperty(value = "是否已读 0未读 1已读") + private Integer readStatus; + @ApiModelProperty(value = "公告状态 0不提醒 1提醒") + private Integer remindStatus; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppResDTO.java new file mode 100644 index 000000000..c0b97664b --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppResDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.xkt.dto.userNotice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("用户消息APP返回数据") +@Data +@Accessors(chain = true) +public class UserNoticeAppResDTO { + + @ApiModelProperty(value = "公告标题") + private String noticeTitle; + @ApiModelProperty(value = "公告内容") + private String noticeContent; + @ApiModelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppTypePageDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppTypePageDTO.java new file mode 100644 index 000000000..6a7a96189 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeAppTypePageDTO.java @@ -0,0 +1,24 @@ +package com.ruoyi.xkt.dto.userNotice; + +import com.ruoyi.xkt.dto.BasePageDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel("用户消息分页查询入参") +@Data +public class UserNoticeAppTypePageDTO extends BasePageDTO { + + @ApiModelProperty(value = "消息接收类型") + private Integer targetNoticeType; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticePageDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticePageDTO.java new file mode 100644 index 000000000..87df79c0a --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticePageDTO.java @@ -0,0 +1,22 @@ +package com.ruoyi.xkt.dto.userNotice; + +import com.ruoyi.xkt.dto.BasePageDTO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@ApiModel("用户消息分页查询入参") +@Data +public class UserNoticePageDTO extends BasePageDTO { + + @ApiModelProperty(value = "公告标题") + private String noticeTitle; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeResDTO.java new file mode 100644 index 000000000..fe14e2260 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/userNotice/UserNoticeResDTO.java @@ -0,0 +1,41 @@ +package com.ruoyi.xkt.dto.userNotice; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("用户消息返回数据") +@Data +@Accessors(chain = true) +public class UserNoticeResDTO { + + @ApiModelProperty(value = "用户消息ID") + private Long userNoticeId; + @ApiModelProperty(value = "公告ID") + private Long noticeId; + @ApiModelProperty(value = "用户通知类型") + private Integer targetNoticeType; + @ApiModelProperty(value = "用户通知类型名称") + private String targetNoticeTypeName; + @ApiModelProperty(value = "公告标题") + private String noticeTitle; + @ApiModelProperty(value = "公告内容") + private String noticeContent; + @ApiModelProperty(value = "档口id") + private Long storeId; + @ApiModelProperty(value = "生效开始时间") + private Date effectStart; + @ApiModelProperty(value = "生效结束时间") + private Date effectEnd; + @ApiModelProperty(value = "是否永久生效 1不是 2是") + private Integer perpetuity; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/UserNoticeType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/UserNoticeType.java index d75e56f6c..f4430e73d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/enums/UserNoticeType.java +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/UserNoticeType.java @@ -6,7 +6,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 通知公告类型 + * 用户接收通知公告类型 * * @author liujiang * @date 2025-04-02 23:42 @@ -39,6 +39,6 @@ public enum UserNoticeType { return e; } } - throw new ServiceException("通知公告类型不存在!", HttpStatus.ERROR); + throw new ServiceException("用户接收通知公告类型不存在!", HttpStatus.ERROR); } } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserNoticeMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserNoticeMapper.java index be46763a1..770c61eac 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserNoticeMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserNoticeMapper.java @@ -2,6 +2,12 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.UserNotice; +import com.ruoyi.xkt.dto.userNotice.UserNoticeAppListResDTO; +import com.ruoyi.xkt.dto.userNotice.UserNoticeAppResDTO; +import com.ruoyi.xkt.dto.userNotice.UserNoticeResDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户所有通知Mapper接口 @@ -11,4 +17,28 @@ import com.ruoyi.xkt.domain.UserNotice; */ public interface UserNoticeMapper extends BaseMapper { + /** + * 查询用户所有通知列表 + * + * @param userId 用户ID + * @param noticeTitle 公告标题 + * @return 列表 + */ + List selectUserNoticeList(@Param("userId") Long userId, @Param("noticeTitle") String noticeTitle); + + /** + * 查询APP用户所有通知列表 + * + * @param userId 用户ID + * @return 列表 + */ + List appList(Long userId); + + /** + * 查询APP用户指定类型通知列表 + * @param userId 用户ID + * @param targetNoticeType 消息接收类型 + * @return 列表 + */ + List selectAppTypePage(@Param("userId") Long userId, @Param("targetNoticeType") Integer targetNoticeType); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java index de0d2c9f2..a73bec31b 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.UserSubscriptions; import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; import com.ruoyi.xkt.dto.userIndex.UserOverallResDTO; +import com.ruoyi.xkt.dto.userNotice.UserFocusAndFavUserIdDTO; import com.ruoyi.xkt.dto.userSubscriptions.UserSubscPageResDTO; import org.apache.ibatis.annotations.Param; @@ -47,4 +48,12 @@ public interface UserSubscriptionsMapper extends BaseMapper { * @return List */ List selectUserFocusList(Long storeId); + + /** + * 筛选关注档口及收藏商品的用户ID + * @param storeId 档口ID + * @param storeProdId 商品ID + * @return List + */ + List selectFocusAndFavUserIdList(@Param("storeId") Long storeId, @Param("storeProdId") Long storeProdId); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IUserNoticeService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IUserNoticeService.java index d4d3c31e7..e49eb7435 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IUserNoticeService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IUserNoticeService.java @@ -1,6 +1,7 @@ package com.ruoyi.xkt.service; -import com.ruoyi.xkt.domain.UserNotice; +import com.ruoyi.common.core.page.Page; +import com.ruoyi.xkt.dto.userNotice.*; import java.util.List; @@ -12,4 +13,26 @@ import java.util.List; */ public interface IUserNoticeService { + /** + * 查询用户所有通知列表 + * + * @param pageDTO 查询入参 + * @return Page + */ + Page pcPage(UserNoticePageDTO pageDTO); + + /** + * 获取APP用户消息列表 + * + * @return List + */ + List appList(); + + /** + * 获取APP某一个类型消息列表 + * + * @param pageDTO 分页入参 + * @return List + */ + Page appTypePage(UserNoticeAppTypePageDTO pageDTO); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/NoticeServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/NoticeServiceImpl.java index 266a71932..953df27aa 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/NoticeServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/NoticeServiceImpl.java @@ -6,17 +6,16 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.Page; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.xkt.domain.Notice; import com.ruoyi.xkt.domain.UserNotice; -import com.ruoyi.xkt.domain.UserNoticeSetting; import com.ruoyi.xkt.dto.notice.*; import com.ruoyi.xkt.enums.NoticeOwnerType; import com.ruoyi.xkt.enums.NoticeReadType; -import com.ruoyi.xkt.enums.NoticeReceiveType; import com.ruoyi.xkt.enums.UserNoticeType; import com.ruoyi.xkt.mapper.*; import com.ruoyi.xkt.service.INoticeService; @@ -68,11 +67,8 @@ public class NoticeServiceImpl implements INoticeService { // 档口发的公告,则发送给关注档口用户 ? this.userSubMapper.selectUserFocusList(notice.getStoreId()) // 系统发的公告,则发送给所有用户 - : this.userNoticeSetMapper.selectList(new LambdaQueryWrapper() - .eq(UserNoticeSetting::getSysMsgNotice, NoticeReceiveType.RECEIVE.getValue()) - .eq(UserNoticeSetting::getDelFlag, Constants.UNDELETED)).stream() - .map(UserNoticeSetting::getUserId) - .collect(Collectors.toList()); + : this.userMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getDelFlag, Constants.UNDELETED)) + .stream().map(SysUser::getUserId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(userIdList)) { return 0; } @@ -158,7 +154,7 @@ public class NoticeServiceImpl implements INoticeService { @Transactional(readOnly = true) public Page page(NoticePageDTO pageDTO) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(Notice::getDelFlag, Constants.UNDELETED) - .orderByDesc(Notice::getCreateTime); + .eq(Notice::getOwnerType, pageDTO.getOwnerType()).orderByDesc(Notice::getCreateTime); if (StringUtils.isNotBlank(pageDTO.getNoticeTitle())) { queryWrapper.like(Notice::getNoticeTitle, pageDTO.getNoticeTitle()); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java index 9f0d56efd..20331abce 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreProductServiceImpl.java @@ -42,6 +42,7 @@ import com.ruoyi.xkt.dto.storeProductFile.StoreProdFileDTO; import com.ruoyi.xkt.dto.storeProductFile.StoreProdFileResDTO; import com.ruoyi.xkt.dto.storeProductFile.StoreProdMainPicDTO; import com.ruoyi.xkt.dto.userBrowsingHistory.UserBrowsingHisDTO; +import com.ruoyi.xkt.dto.userNotice.UserFocusAndFavUserIdDTO; import com.ruoyi.xkt.enums.*; import com.ruoyi.xkt.mapper.*; import com.ruoyi.xkt.service.IPictureService; @@ -101,6 +102,7 @@ public class StoreProductServiceImpl implements IStoreProductService { final NoticeMapper noticeMapper; final UserNoticeSettingMapper userNoticeSetMapper; final UserNoticeMapper userNoticeMapper; + final UserSubscriptionsMapper userSubMapper; /** * 查询档口商品 @@ -1027,10 +1029,10 @@ public class StoreProductServiceImpl implements IStoreProductService { userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) .setUserId(userId).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) .setTargetNoticeType(UserNoticeType.PRODUCT_DYNAMIC.getValue())); - List focusList = this.userNoticeSetMapper.selectList(new LambdaQueryWrapper() - .isNotNull(UserNoticeSetting::getFocusNotice)); - if (CollectionUtils.isNotEmpty(focusList)) { - focusList.forEach(x -> userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) + List userSubList = this.userSubMapper.selectList(new LambdaQueryWrapper() + .eq(UserSubscriptions::getStoreId, storeProd.getStoreId())); + if (CollectionUtils.isNotEmpty(userSubList)) { + userSubList.forEach(x -> userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) .setUserId(x.getUserId()).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) .setTargetNoticeType(UserNoticeType.FOCUS_STORE.getValue()))); } @@ -1061,14 +1063,12 @@ public class StoreProductServiceImpl implements IStoreProductService { userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) .setUserId(userId).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) .setTargetNoticeType(UserNoticeType.PRODUCT_DYNAMIC.getValue())); - // 关注档口或者收藏商品的用户 - List targetList = this.userNoticeSetMapper.selectList(new LambdaQueryWrapper() - .isNotNull(UserNoticeSetting::getFocusNotice).or().isNotNull(UserNoticeSetting::getFavoriteNotice)); + // 关注档口 或 收藏商品用户 + List targetList = this.userSubMapper.selectFocusAndFavUserIdList(storeProd.getStoreId(), storeProd.getId()); if (CollectionUtils.isNotEmpty(targetList)) { - targetList.forEach(x -> userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) - .setUserId(x.getUserId()).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) - .setTargetNoticeType(Objects.equals(x.getFocusNotice(), NoticeReceiveType.RECEIVE.getValue()) - ? UserNoticeType.FOCUS_STORE.getValue() : UserNoticeType.FAVORITE_PRODUCT.getValue()))); + targetList.forEach(target -> userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) + .setUserId(target.getUserId()).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) + .setTargetNoticeType(target.getTargetNoticeType()))); } if (CollectionUtils.isEmpty(userNoticeList)) { return; @@ -1098,14 +1098,12 @@ public class StoreProductServiceImpl implements IStoreProductService { .setNoticeContent(ObjectUtils.isNotEmpty(store) ? store.getStoreName() : "" + (offSale ? "下架" : "重新上架") + "了货号为: " + storeProd.getProdArtNum() + " 的商品!请及时关注!"); this.noticeMapper.insert(notice); - // 关注档口或者收藏商品的用户 - List targetList = this.userNoticeSetMapper.selectList(new LambdaQueryWrapper() - .isNotNull(UserNoticeSetting::getFocusNotice).or().isNotNull(UserNoticeSetting::getFavoriteNotice)); + // 关注档口 或 收藏商品用户 + List targetList = this.userSubMapper.selectFocusAndFavUserIdList(storeProd.getStoreId(), storeProd.getId()); if (CollectionUtils.isNotEmpty(targetList)) { targetList.forEach(x -> userNoticeList.add(new UserNotice().setNoticeId(notice.getId()) .setUserId(x.getUserId()).setReadStatus(NoticeReadType.UN_READ.getValue()).setVoucherDate(voucherDate) - .setTargetNoticeType(Objects.equals(x.getFocusNotice(), NoticeReceiveType.RECEIVE.getValue()) - ? UserNoticeType.FOCUS_STORE.getValue() : UserNoticeType.FAVORITE_PRODUCT.getValue()))); + .setTargetNoticeType(x.getTargetNoticeType()))); } }); if (CollectionUtils.isEmpty(userNoticeList)) { diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/UserNoticeServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/UserNoticeServiceImpl.java index 71907c77c..0d04303da 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/UserNoticeServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/UserNoticeServiceImpl.java @@ -1,7 +1,23 @@ package com.ruoyi.xkt.service.impl; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.core.page.Page; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.xkt.dto.userNotice.*; +import com.ruoyi.xkt.enums.UserNoticeType; +import com.ruoyi.xkt.mapper.UserNoticeMapper; import com.ruoyi.xkt.service.IUserNoticeService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * 用户所有通知Service业务层处理 @@ -10,6 +26,59 @@ import org.springframework.stereotype.Service; * @date 2025-03-26 */ @Service +@RequiredArgsConstructor public class UserNoticeServiceImpl implements IUserNoticeService { + final UserNoticeMapper userNoticeMapper; + + /** + * 查询用户所有通知列表 + * + * @param pageDTO 查询入参 + * @return Page + */ + @Override + @Transactional(readOnly = true) + public Page pcPage(UserNoticePageDTO pageDTO) { + PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize()); + List list = this.userNoticeMapper.selectUserNoticeList(SecurityUtils.getUserId(), pageDTO.getNoticeTitle()); + list.forEach(x -> x.setTargetNoticeTypeName(UserNoticeType.of(x.getTargetNoticeType()).getLabel())); + return Page.convert(new PageInfo<>(list)); + } + + /** + * 获取APP用户消息列表 + * + * @return List + */ + @Override + @Transactional(readOnly = true) + public List appList() { + List appList = this.userNoticeMapper.appList(SecurityUtils.getUserId()); + if (CollectionUtils.isEmpty(appList)) { + return Collections.emptyList(); + } + return appList.stream().collect(Collectors.groupingBy(UserNoticeAppListResDTO::getTargetNoticeType, + Collectors.maxBy(Comparator.comparing(UserNoticeAppListResDTO::getCreateTime)))) + .values().stream() + .filter(Optional::isPresent) + .map(Optional::get) + .map(x -> x.setTargetNoticeTypeName(UserNoticeType.of(x.getTargetNoticeType()).getLabel())) + .collect(Collectors.toList()); + } + + /** + * 获取APP某一个类型消息列表 + * + * @param pageDTO 分页入参 + * @return List + */ + @Override + @Transactional(readOnly = true) + public Page appTypePage(UserNoticeAppTypePageDTO pageDTO) { + PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize()); + List list = this.userNoticeMapper.selectAppTypePage(SecurityUtils.getUserId(), pageDTO.getTargetNoticeType()); + return Page.convert(new PageInfo<>(list)); + } + } diff --git a/xkt/src/main/resources/mapper/UserNoticeMapper.xml b/xkt/src/main/resources/mapper/UserNoticeMapper.xml index 00a655078..e0877269b 100644 --- a/xkt/src/main/resources/mapper/UserNoticeMapper.xml +++ b/xkt/src/main/resources/mapper/UserNoticeMapper.xml @@ -4,4 +4,71 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml b/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml index de69b05b3..e3219b79c 100644 --- a/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml +++ b/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml @@ -68,5 +68,19 @@ AND uns.focus_notice = 1 + + \ No newline at end of file