liu
2 天以前 47dd1ecaf0aafa66b9c39fff9c91abc1c611b02c
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package cn.iocoder.yudao.module.wxcp.controller.admin.notice;
 
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.storage.vo.SystemStorageBlobRespVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.notice.vo.WxCpNoticeArticleRespVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.notice.vo.WxCpNoticePageReqVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.notice.vo.WxCpNoticeRespVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.notice.vo.WxCpNoticeSaveReqVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.vo.WxCpPushReqVO;
import cn.iocoder.yudao.module.wxcp.controller.admin.vo.WxCpPushResultVO;
import cn.iocoder.yudao.module.wxcp.dal.dataobject.notice.WxCpNoticeDO;
import cn.iocoder.yudao.module.wxcp.enums.activity.WxCpPushScopeEnum;
import cn.iocoder.yudao.module.wxcp.enums.notice.WxCpNoticeStatusEnum;
import cn.iocoder.yudao.module.wxcp.enums.notice.WxCpNoticeTypeEnum;
import cn.iocoder.yudao.module.wxcp.service.notice.WxCpNoticeService;
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.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
 
import java.util.List;
 
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
/**
 * 管理后台 - 企业微信通知
 *
 * @author 超级管理员
 */
@Tag(name = "管理后台 - 企业微信通知")
@RestController
@RequestMapping("/wxcp/notice")
@Validated
public class WxCpNoticeController {
 
    @Resource
    private WxCpNoticeService noticeService;
 
    @PostMapping("/create")
    @Operation(summary = "创建通知")
    @PreAuthorize("@ss.hasPermission('wxcp:notice:create')")
    public CommonResult<Long> createNotice(@Valid @RequestBody WxCpNoticeSaveReqVO createReqVO) {
        return success(noticeService.createNotice(createReqVO));
    }
 
    @PutMapping("/update")
    @Operation(summary = "修改通知")
    @PreAuthorize("@ss.hasPermission('wxcp:notice:update')")
    public CommonResult<Boolean> updateNotice(@Valid @RequestBody WxCpNoticeSaveReqVO updateReqVO) {
        noticeService.updateNotice(updateReqVO);
        return success(true);
    }
 
    @DeleteMapping("/delete")
    @Operation(summary = "删除通知")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('wxcp:notice:delete')")
    public CommonResult<Boolean> deleteNotice(@RequestParam("id") Long id) {
        noticeService.deleteNotice(id);
        return success(true);
    }
 
    @GetMapping("/get")
    @Operation(summary = "获得通知")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('wxcp:notice:query')")
    public CommonResult<WxCpNoticeRespVO> getNotice(@RequestParam("id") Long id) {
        WxCpNoticeDO notice = noticeService.getNotice(id);
        return success(buildRespVO(notice));
    }
 
    @GetMapping("/page")
    @Operation(summary = "获得通知分页")
    @PreAuthorize("@ss.hasPermission('wxcp:notice:query')")
    public CommonResult<PageResult<WxCpNoticeRespVO>> getNoticePage(@Valid WxCpNoticePageReqVO pageReqVO) {
        PageResult<WxCpNoticeDO> pageResult = noticeService.getNoticePage(pageReqVO);
        return success(BeanUtils.toBean(pageResult, WxCpNoticeRespVO.class, this::fillNames));
    }
 
    @PutMapping("/publish")
    @Operation(summary = "发布通知")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('wxcp:notice:update')")
    public CommonResult<Boolean> publishNotice(@RequestParam("id") Long id) {
        noticeService.publishNotice(id);
        return success(true);
    }
 
    @PutMapping("/revoke")
    @Operation(summary = "撤回通知")
    @Parameter(name = "id", description = "编号", required = true)
    @PreAuthorize("@ss.hasPermission('wxcp:notice:update')")
    public CommonResult<Boolean> revokeNotice(@RequestParam("id") Long id) {
        noticeService.revokeNotice(id);
        return success(true);
    }
 
    @PostMapping("/push")
    @Operation(summary = "推送通知给企业微信成员", description = "支持覆盖推送范围与目标;不传则沿用通知上已配置的值")
    @PreAuthorize("@ss.hasPermission('wxcp:notice:push')")
    public CommonResult<WxCpPushResultVO> pushNotice(@Valid @RequestBody WxCpPushReqVO pushReqVO) {
        return success(noticeService.pushNotice(pushReqVO));
    }
 
    // ==================== 转换辅助 ====================
 
    private WxCpNoticeRespVO buildRespVO(WxCpNoticeDO notice) {
        if (notice == null) {
            return null;
        }
        WxCpNoticeRespVO vo = BeanUtils.toBean(notice, WxCpNoticeRespVO.class);
        fillNames(vo);
        // 素材详情需要回显,列表页不回显以免多查附件表
        vo.setImageAttachmentList(noticeService.getNoticeImageAttachments(notice.getId()));
        vo.setFileAttachmentList(noticeService.getNoticeFileAttachments(notice.getId()));
        vo.setVideoAttachmentList(noticeService.getNoticeVideoAttachments(notice.getId()));
        vo.setImageBlobIds(vo.getImageAttachmentList().stream()
                .map(SystemStorageBlobRespVO::getId).toList());
        vo.setFileBlobIds(vo.getFileAttachmentList().stream()
                .map(SystemStorageBlobRespVO::getId).toList());
        vo.setVideoBlobIds(vo.getVideoAttachmentList().stream()
                .map(SystemStorageBlobRespVO::getId).toList());
        vo.setArticleList(noticeService.getNoticeArticles(notice.getId()).stream().map(article -> {
            WxCpNoticeArticleRespVO item = BeanUtils.toBean(article, WxCpNoticeArticleRespVO.class);
            List<SystemStorageBlobRespVO> covers =
                    noticeService.getNoticeArticleCoverAttachments(article.getId());
            item.setCoverAttachment(covers.isEmpty() ? null : covers.get(0));
            return item;
        }).toList());
        return vo;
    }
 
    private void fillNames(WxCpNoticeRespVO vo) {
        WxCpNoticeStatusEnum status = WxCpNoticeStatusEnum.valueOf(vo.getStatus());
        vo.setStatusName(status != null ? status.getName() : null);
        WxCpNoticeTypeEnum type = WxCpNoticeTypeEnum.valueOf(vo.getNoticeType());
        vo.setNoticeTypeName(type != null ? type.getName() : null);
        WxCpPushScopeEnum scope = WxCpPushScopeEnum.valueOf(vo.getPushScope());
        vo.setPushScopeName(scope != null ? scope.getName() : null);
        // 预览链接只依赖配置,列表页也能直接给出,方便管理员复制发给成员
        vo.setPreviewUrl(noticeService.buildPreviewUrl(vo.getId()));
    }
 
}