基于mall4j产品的二开项目后端
lee
2024-12-18 efdb99f8cecc4afb592afad79c761081d5d5cf22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.yami.shop.api.controller;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yami.shop.bean.app.dto.NoticeDto;
import com.yami.shop.bean.enums.NoticeType;
import com.yami.shop.bean.model.Notice;
import com.yami.shop.bean.model.NoticeUserLog;
import com.yami.shop.common.enums.StatusEnum;
import com.yami.shop.common.response.ServerResponseEntity;
import com.yami.shop.common.util.PageParam;
import com.yami.shop.security.api.model.YamiUser;
import com.yami.shop.security.api.util.SecurityUtils;
import com.yami.shop.security.common.bo.UserInfoInTokenBO;
import com.yami.shop.security.common.util.AuthUserContext;
import com.yami.shop.service.NoticeService;
import com.yami.shop.service.NoticeUserLogService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import ma.glasnost.orika.MapperFacade;
import org.springframework.web.bind.annotation.*;
 
import java.security.Security;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
 
@RestController
@RequestMapping("/p/notice")
@Tag(name = "用户登录状态的公告管理接口")
@AllArgsConstructor
public class MyNoticeController {
    private final NoticeService noticeService;
    private final NoticeUserLogService noticeUserLogService;
 
    private final MapperFacade mapperFacade;
 
    @GetMapping("/topNoticeList/{shopId}")
    @Operation(summary = "置顶公告列表信息", description = "获取所有置顶公告列表信息")
    @Parameter(name = "shopId", description = "店铺id", required = true)
    public ServerResponseEntity<List<NoticeDto>> getTopNoticeListByShopId(@PathVariable("shopId") Long shopId) {
        List<Notice> noticeList = noticeService.listTopNoticeByShopId(shopId);
        //筛选出立即发送和到时间定时发送的公告
        List<Notice> list = noticeList.stream().filter(noticeVO -> Objects.equals(noticeVO.getImmediatelySend(), 1) || (Objects.equals(noticeVO.getImmediatelySend(), 0) && noticeVO.getSendTime().before(new Date()))).collect(Collectors.toList());
 
        List<NoticeDto> noticeDtoList = mapperFacade.mapAsList(list, NoticeDto.class);
        UserInfoInTokenBO userInfoInTokenBO = AuthUserContext.get();
        List<NoticeDto> result = new ArrayList<>();
        String accountId = "";
        //登录状态显示 指定全部用户和指定用户可见的公告
        if (Objects.nonNull(userInfoInTokenBO)) {
            accountId = userInfoInTokenBO.getUserId();
            String userId = String.valueOf(accountId);
            result = noticeDtoList.stream().filter(notice -> Objects.isNull(notice.getUserIds()) || (Objects.nonNull(notice.getUserIds()) && notice.getUserIds().contains(userId))).collect(Collectors.toList());
        } else {
            //未登录状态只显示 全部用户可见的公告
            result = noticeDtoList.stream().filter(notice -> Objects.isNull(notice.getUserIds())).collect(Collectors.toList());
        }
        return ServerResponseEntity.success(result);
    }
 
    @GetMapping("/info/{id}")
    @Operation(summary = "公告详情", description = "获取公告id公告详情")
    @Parameter(name = "id", description = "公告id", required = true)
    public ServerResponseEntity<NoticeDto> getNoticeById(@PathVariable("id") Long id) {
        Notice notice = noticeService.getNoticeById(id);
        NoticeDto noticeDto = mapperFacade.map(notice, NoticeDto.class);
        return ServerResponseEntity.success(noticeDto);
    }
 
    /**
     * 公告列表
     */
    @GetMapping("/noticeList/{shopId}")
    @Operation(summary = "公告列表信息", description = "获取所有公告列表信息")
    @Parameter(name = "shopId", description = "店铺id", required = true)
    public ServerResponseEntity<IPage<NoticeDto>> pageNotice(@PathVariable("shopId") Long shopId, PageParam<NoticeDto> page) {
        Notice notice = new Notice();
        notice.setShopId(shopId);
        notice.setType(NoticeType.TO_USER.value());
        UserInfoInTokenBO userInfoInTokenBO = AuthUserContext.get();
        notice.setAccountId(Objects.nonNull(userInfoInTokenBO) ? userInfoInTokenBO.getUserId() : null);
        notice.setSendTime(new Date());
        notice.setStatus(StatusEnum.ENABLE.value());
        return ServerResponseEntity.success(noticeService.pageNotice(page, notice));
    }
 
    /**
     * 用户已读公告记录
     */
    @PostMapping("/readNoticeLog")
    @Operation(summary = "用户已读公告记录", description = "用户已读公告记录")
    public ServerResponseEntity readNoticeLog(@RequestBody NoticeDto noticeDto) {
        String userId = SecurityUtils.getUser().getUserId();
        NoticeUserLog noticeUserLog = noticeUserLogService.getOne(Wrappers.lambdaQuery(NoticeUserLog.class)
                .eq(NoticeUserLog::getNoticeId, noticeDto.getId())
                .eq(NoticeUserLog::getUserId, userId));
        if (noticeUserLog != null) {
            return ServerResponseEntity.success();
        }
        noticeUserLog = new NoticeUserLog();
        noticeUserLog.setNoticeId( noticeDto.getId());
        noticeUserLog.setUserId(userId);
        noticeUserLogService.save(noticeUserLog);
        return ServerResponseEntity.success();
    }
 
    /**
     * 查询最新的公告
     */
    @GetMapping("/newNotice")
    @Operation(summary = "查询最新的公告", description = "查询最新的公告")
    public ServerResponseEntity<NoticeDto> getNewNotice() {
        NoticeDto newNotice = noticeService.getNewNotice();
        YamiUser user = SecurityUtils.getUser();
        if (user != null) {
            NoticeUserLog noticeUserLog = noticeUserLogService.getOne(Wrappers.lambdaQuery(NoticeUserLog.class)
                    .eq(NoticeUserLog::getNoticeId, newNotice.getId())
                    .eq(NoticeUserLog::getUserId, user.getUserId()));
            if (noticeUserLog != null) {
                return ServerResponseEntity.success();
            }
        }
        return ServerResponseEntity.success(newNotice);
    }
 
}