新增公告后端接口

master
zzy 2026-04-24 00:08:18 +08:00
parent b8157f1149
commit 4738f0fe2d
17 changed files with 1012 additions and 0 deletions

View File

@ -0,0 +1,141 @@
package com.fjrcloud.community.module.community.controller.admin.notice;
import com.fjrcloud.community.framework.apilog.core.annotation.ApiAccessLog;
import com.fjrcloud.community.framework.common.pojo.CommonResult;
import com.fjrcloud.community.framework.common.pojo.PageParam;
import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.framework.common.util.object.BeanUtils;
import com.fjrcloud.community.framework.excel.core.util.ExcelUtils;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticePageReqVO;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticeRespVO;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticeSaveReqVO;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeDO;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeScopeDO;
import com.fjrcloud.community.module.community.dal.mysql.notice.NoticeScopeMapper;
import com.fjrcloud.community.module.community.service.notice.NoticeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import static com.fjrcloud.community.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.fjrcloud.community.framework.common.pojo.CommonResult.success;
/**
* -
*
* @author fjrcloud
*/
@Tag(name = "管理后台 - 通知管理")
@RestController
@RequestMapping("/community/notice")
@Validated
public class NoticeController {
@Resource
private NoticeService noticeService;
@Resource
private NoticeScopeMapper noticeScopeMapper;
@PostMapping("/create")
@Operation(summary = "创建通知")
@PreAuthorize("@ss.hasPermission('community:notice:create')")
public CommonResult<Long> createNotice(@Valid @RequestBody NoticeSaveReqVO createReqVO) {
return success(noticeService.createNotice(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新通知")
@PreAuthorize("@ss.hasPermission('community:notice:update')")
public CommonResult<Boolean> updateNotice(@Valid @RequestBody NoticeSaveReqVO updateReqVO) {
noticeService.updateNotice(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除通知")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('community:notice:delete')")
public CommonResult<Boolean> deleteNotice(@RequestParam("id") Long id) {
noticeService.deleteNotice(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除通知")
@PreAuthorize("@ss.hasPermission('community:notice:delete')")
public CommonResult<Boolean> deleteNoticeList(@RequestParam("ids") List<Long> ids) {
noticeService.deleteNoticeListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得通知")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('community:notice:query')")
public CommonResult<NoticeRespVO> getNotice(@RequestParam("id") Long id) {
NoticeDO notice = noticeService.getNotice(id);
NoticeRespVO respVO = BeanUtils.toBean(notice, NoticeRespVO.class);
// 查询发布范围
List<NoticeScopeDO> scopeList = noticeScopeMapper.selectListByNoticeId(id);
if (scopeList != null && !scopeList.isEmpty()) {
respVO.setCommunityIds(scopeList.stream()
.map(NoticeScopeDO::getCommunityId)
.collect(Collectors.toList()));
}
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得通知分页")
@PreAuthorize("@ss.hasPermission('community:notice:query')")
public CommonResult<PageResult<NoticeRespVO>> getNoticePage(@Valid NoticePageReqVO pageReqVO) {
PageResult<NoticeDO> pageResult = noticeService.getNoticePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, NoticeRespVO.class));
}
@PutMapping("/publish")
@Operation(summary = "发布通知")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('community:notice:publish')")
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('community:notice:revoke')")
public CommonResult<Boolean> revokeNotice(@RequestParam("id") Long id) {
noticeService.revokeNotice(id);
return success(true);
}
@GetMapping("/export-excel")
@Operation(summary = "导出通知 Excel")
@PreAuthorize("@ss.hasPermission('community:notice:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportNoticeExcel(@Valid NoticePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<NoticeDO> list = noticeService.getNoticePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "通知管理.xls", "数据", NoticeRespVO.class,
BeanUtils.toBean(list, NoticeRespVO.class));
}
}

View File

@ -0,0 +1,34 @@
package com.fjrcloud.community.module.community.controller.admin.notice.vo;
import com.fjrcloud.community.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.fjrcloud.community.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* - Request VO
*
* @author fjrcloud
*/
@Schema(description = "管理后台 - 通知管理分页 Request VO")
@Data
public class NoticePageReqVO extends PageParam {
@Schema(description = "公告标题", example = "春节通知")
private String title;
@Schema(description = "状态0-草稿1-已发布2-已过期3-已撤回)", example = "1")
private Integer status;
@Schema(description = "发布类型1-立即发布2-定时发布)", example = "1")
private Integer publishType;
@Schema(description = "发布时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] publishTime;
}

View File

@ -0,0 +1,76 @@
package com.fjrcloud.community.module.community.controller.admin.notice.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* - Response VO
*
* @author fjrcloud
*/
@Schema(description = "管理后台 - 通知管理 Response VO")
@Data
@ExcelIgnoreUnannotated
public class NoticeRespVO {
@Schema(description = "通知编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("编号")
private Long id;
@Schema(description = "公告标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "关于春节期间物业服务安排的通知")
@ExcelProperty("公告标题")
private String title;
@Schema(description = "公告内容(富文本)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("公告内容")
private String content;
@Schema(description = "发布方", requiredMode = Schema.RequiredMode.REQUIRED, example = "物业管理处")
@ExcelProperty("发布方")
private String publisher;
@Schema(description = "附件URL列表", example = "[\"https://xxx.com/file1.pdf\"]")
@ExcelProperty("附件")
private String attachments;
@Schema(description = "发布类型1-立即发布2-定时发布)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("发布类型")
private Integer publishType;
@Schema(description = "发布时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("发布时间")
private LocalDateTime publishTime;
@Schema(description = "结束类型1-长期有效2-定时结束)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("结束类型")
private Integer endType;
@Schema(description = "结束时间")
@ExcelProperty("结束时间")
private LocalDateTime endTime;
@Schema(description = "是否消息推送", example = "true")
@ExcelProperty("消息推送")
private Boolean pushEnabled;
@Schema(description = "状态0-草稿1-已发布2-已过期3-已撤回)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("状态")
private Integer status;
@Schema(description = "浏览次数", example = "100")
@ExcelProperty("浏览次数")
private Integer viewCount;
@Schema(description = "小区ID列表发布范围", example = "[1, 2, 3]")
private List<Long> communityIds;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,60 @@
package com.fjrcloud.community.module.community.controller.admin.notice.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
/**
* - / Request VO
*
* @author fjrcloud
*/
@Schema(description = "管理后台 - 通知管理新增/修改 Request VO")
@Data
public class NoticeSaveReqVO {
@Schema(description = "通知编号", example = "1")
private Long id;
@Schema(description = "公告标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "关于春节期间物业服务安排的通知")
@NotEmpty(message = "公告标题不能为空")
private String title;
@Schema(description = "公告内容(富文本)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "公告内容不能为空")
private String content;
@Schema(description = "发布方", requiredMode = Schema.RequiredMode.REQUIRED, example = "物业管理处")
@NotEmpty(message = "发布方不能为空")
private String publisher;
@Schema(description = "附件URL列表JSON数组", example = "[\"https://xxx.com/file1.pdf\"]")
private String attachments;
@Schema(description = "发布类型1-立即发布2-定时发布)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "发布类型不能为空")
private Integer publishType;
@Schema(description = "发布时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "发布时间不能为空")
private LocalDateTime publishTime;
@Schema(description = "结束类型1-长期有效2-定时结束)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "结束类型不能为空")
private Integer endType;
@Schema(description = "结束时间")
private LocalDateTime endTime;
@Schema(description = "是否消息推送", example = "true")
private Boolean pushEnabled;
@Schema(description = "小区ID列表发布范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2, 3]")
@NotNull(message = "发布范围不能为空")
private List<Long> communityIds;
}

View File

@ -0,0 +1,87 @@
package com.fjrcloud.community.module.community.dal.dataobject.notice;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fjrcloud.community.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* DO
*
* @author fjrcloud
*/
@TableName("comm_notice")
@KeySequence("comm_notice_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NoticeDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String title;
/**
*
*/
private String content;
/**
*
*/
private String publisher;
/**
* URLJSON
*/
private String attachments;
/**
* 1-2-
*/
private Integer publishType;
/**
*
*/
private LocalDateTime publishTime;
/**
* 1-2-
*/
private Integer endType;
/**
*
*/
private LocalDateTime endTime;
/**
*
*/
private Boolean pushEnabled;
/**
* 0-稿1-2-3-
*/
private Integer status;
/**
*
*/
private Integer viewCount;
}

View File

@ -0,0 +1,40 @@
package com.fjrcloud.community.module.community.dal.dataobject.notice;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fjrcloud.community.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
* DO
*
* @author fjrcloud
*/
@TableName("comm_notice_scope")
@KeySequence("comm_notice_scope_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NoticeScopeDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private Long noticeId;
/**
*
*/
private Long communityId;
}

View File

@ -0,0 +1,33 @@
package com.fjrcloud.community.module.community.dal.mysql.notice;
import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.framework.mybatis.core.mapper.BaseMapperX;
import com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticePageReqVO;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* Mapper
*
* @author fjrcloud
*/
@Mapper
public interface NoticeMapper extends BaseMapperX<NoticeDO> {
/**
*
*
* @param reqVO
* @return
*/
default PageResult<NoticeDO> selectPage(NoticePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<NoticeDO>()
.likeIfPresent(NoticeDO::getTitle, reqVO.getTitle())
.eqIfPresent(NoticeDO::getStatus, reqVO.getStatus())
.eqIfPresent(NoticeDO::getPublishType, reqVO.getPublishType())
.betweenIfPresent(NoticeDO::getPublishTime, reqVO.getPublishTime())
.orderByDesc(NoticeDO::getId));
}
}

View File

@ -0,0 +1,55 @@
package com.fjrcloud.community.module.community.dal.mysql.notice;
import com.fjrcloud.community.framework.mybatis.core.mapper.BaseMapperX;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeScopeDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
*
* @author fjrcloud
*/
@Mapper
public interface NoticeScopeMapper extends BaseMapperX<NoticeScopeDO> {
/**
* ID
*
* @param noticeId ID
* @return
*/
default List<NoticeScopeDO> selectListByNoticeId(Long noticeId) {
return selectList(NoticeScopeDO::getNoticeId, noticeId);
}
/**
* ID
*
* @param noticeId ID
* @return
*/
default int deleteByNoticeId(Long noticeId) {
return delete(NoticeScopeDO::getNoticeId, noticeId);
}
/**
*
*
* @param noticeId ID
* @param communityIds ID
* @return
*/
default int insertBatch(@Param("noticeId") Long noticeId, @Param("communityIds") List<Long> communityIds) {
List<NoticeScopeDO> list = communityIds.stream()
.map(communityId -> NoticeScopeDO.builder()
.noticeId(noticeId)
.communityId(communityId)
.build())
.collect(java.util.stream.Collectors.toList());
return insertBatch(list);
}
}

View File

@ -33,5 +33,9 @@ public interface ErrorCodeConstants {
ErrorCode BANNER_NOT_EXISTS = new ErrorCode(2_002_002_007, "banner不存在"); ErrorCode BANNER_NOT_EXISTS = new ErrorCode(2_002_002_007, "banner不存在");
ErrorCode NOTICE_NOT_EXISTS = new ErrorCode(2_004_000_000, "通知不存在");
ErrorCode NOTICE_NOT_DRAFT = new ErrorCode(2_004_000_003, "只有草稿状态的通知才能修改");
ErrorCode MINI_APP_CONFIG_NOT_EXISTS = new ErrorCode(2_003_002_007, "小程序配置不存在"); ErrorCode MINI_APP_CONFIG_NOT_EXISTS = new ErrorCode(2_003_002_007, "小程序配置不存在");
} }

View File

@ -0,0 +1,28 @@
package com.fjrcloud.community.module.community.enums.notice;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*
* @author fjrcloud
*/
@Getter
@AllArgsConstructor
public enum EndTypeEnum {
PERMANENT(1, "长期有效"),
SCHEDULED(2, "定时结束");
/**
*
*/
private final Integer type;
/**
*
*/
private final String desc;
}

View File

@ -0,0 +1,30 @@
package com.fjrcloud.community.module.community.enums.notice;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*
* @author fjrcloud
*/
@Getter
@AllArgsConstructor
public enum NoticeStatusEnum {
DRAFT(0, "草稿"),
PUBLISHED(1, "已发布"),
EXPIRED(2, "已过期"),
REVOKED(3, "已撤回");
/**
*
*/
private final Integer status;
/**
*
*/
private final String desc;
}

View File

@ -0,0 +1,28 @@
package com.fjrcloud.community.module.community.enums.notice;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*
* @author fjrcloud
*/
@Getter
@AllArgsConstructor
public enum PublishTypeEnum {
IMMEDIATE(1, "立即发布"),
SCHEDULED(2, "定时发布");
/**
*
*/
private final Integer type;
/**
*
*/
private final String desc;
}

View File

@ -0,0 +1,31 @@
package com.fjrcloud.community.module.community.job.notice;
import cn.hutool.core.util.StrUtil;
import com.fjrcloud.community.framework.quartz.core.handler.JobHandler;
import com.fjrcloud.community.framework.tenant.core.job.TenantJob;
import com.fjrcloud.community.module.community.service.notice.NoticeService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Job
*
* endTime
*
* @author fjrcloud
*/
@Component
public class NoticeExpireJob implements JobHandler {
@Resource
private NoticeService noticeService;
@Override
@TenantJob
public String execute(String param) {
int count = noticeService.autoExpireNotices();
return StrUtil.format("自动过期通知 {} 个", count);
}
}

View File

@ -0,0 +1,31 @@
package com.fjrcloud.community.module.community.job;
import cn.hutool.core.util.StrUtil;
import com.fjrcloud.community.framework.quartz.core.handler.JobHandler;
import com.fjrcloud.community.framework.tenant.core.job.TenantJob;
import com.fjrcloud.community.module.community.service.notice.NoticeService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Job
*
* publishTime 稿
*
* @author fjrcloud
*/
@Component
public class NoticePublishJob implements JobHandler {
@Resource
private NoticeService noticeService;
@Override
@TenantJob
public String execute(String param) {
int count = noticeService.autoPublishNotices();
return StrUtil.format("自动发布通知 {} 个", count);
}
}

View File

@ -0,0 +1,91 @@
package com.fjrcloud.community.module.community.service.notice;
import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticePageReqVO;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticeSaveReqVO;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeDO;
import javax.validation.Valid;
import java.util.List;
/**
* Service
*
* @author fjrcloud
*/
public interface NoticeService {
/**
*
*
* @param createReqVO
* @return
*/
Long createNotice(@Valid NoticeSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateNotice(@Valid NoticeSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteNotice(Long id);
/**
*
*
* @param ids
*/
void deleteNoticeListByIds(List<Long> ids);
/**
*
*
* @param id
* @return
*/
NoticeDO getNotice(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<NoticeDO> getNoticePage(NoticePageReqVO pageReqVO);
/**
*
*
* @param id ID
*/
void publishNotice(Long id);
/**
*
*
* @param id ID
*/
void revokeNotice(Long id);
/**
*
*
* @return
*/
int autoPublishNotices();
/**
*
*
* @return
*/
int autoExpireNotices();
}

View File

@ -0,0 +1,231 @@
package com.fjrcloud.community.module.community.service.notice;
import com.fjrcloud.community.framework.common.pojo.PageResult;
import com.fjrcloud.community.framework.common.util.object.BeanUtils;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticePageReqVO;
import com.fjrcloud.community.module.community.controller.admin.notice.vo.NoticeSaveReqVO;
import com.fjrcloud.community.module.community.dal.dataobject.notice.NoticeDO;
import com.fjrcloud.community.module.community.dal.mysql.notice.NoticeMapper;
import com.fjrcloud.community.module.community.dal.mysql.notice.NoticeScopeMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.fjrcloud.community.module.community.enums.ErrorCodeConstants.NOTICE_NOT_DRAFT;
import static com.fjrcloud.community.module.community.enums.ErrorCodeConstants.NOTICE_NOT_EXISTS;
/**
* Service
*
* @author fjrcloud
*/
@Service
@Validated
public class NoticeServiceImpl implements NoticeService {
@Resource
private NoticeMapper noticeMapper;
@Resource
private NoticeScopeMapper noticeScopeMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createNotice(NoticeSaveReqVO createReqVO) {
// 插入通知
NoticeDO notice = BeanUtils.toBean(createReqVO, NoticeDO.class);
// 根据发布类型设置状态1-立即发布直接设为已发布2-定时发布设为草稿
if (createReqVO.getPublishType() == 1) {
notice.setStatus(1); // 已发布
notice.setPublishTime(LocalDateTime.now());
} else {
notice.setStatus(0); // 草稿
}
notice.setViewCount(0);
noticeMapper.insert(notice);
// 插入通知小区关联
if (createReqVO.getCommunityIds() != null && !createReqVO.getCommunityIds().isEmpty()) {
noticeScopeMapper.insertBatch(notice.getId(), createReqVO.getCommunityIds());
}
return notice.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateNotice(NoticeSaveReqVO updateReqVO) {
// 校验存在
NoticeDO oldNotice = validateNoticeExists(updateReqVO.getId());
// 如果原状态是已发布、已过期或已撤回,不允许修改
if (oldNotice.getStatus() != 0) {
throw exception(NOTICE_NOT_DRAFT);
}
// 更新通知
NoticeDO updateObj = BeanUtils.toBean(updateReqVO, NoticeDO.class);
// 根据发布类型设置状态1-立即发布直接设为已发布2-定时发布设为草稿
if (updateReqVO.getPublishType() == 1) {
updateObj.setStatus(1); // 已发布
updateObj.setPublishTime(LocalDateTime.now());
} else {
updateObj.setStatus(0); // 草稿
}
noticeMapper.updateById(updateObj);
// 更新通知小区关联:先删除旧的,再插入新的
noticeScopeMapper.deleteByNoticeId(updateReqVO.getId());
if (updateReqVO.getCommunityIds() != null && !updateReqVO.getCommunityIds().isEmpty()) {
noticeScopeMapper.insertBatch(updateReqVO.getId(), updateReqVO.getCommunityIds());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteNotice(Long id) {
// 校验存在
validateNoticeExists(id);
// 删除通知
noticeMapper.deleteById(id);
// 删除通知小区关联
noticeScopeMapper.deleteByNoticeId(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteNoticeListByIds(List<Long> ids) {
// 删除通知
noticeMapper.deleteByIds(ids);
// 删除通知小区关联
for (Long id : ids) {
noticeScopeMapper.deleteByNoticeId(id);
}
}
@Override
public NoticeDO getNotice(Long id) {
return noticeMapper.selectById(id);
}
@Override
public PageResult<NoticeDO> getNoticePage(NoticePageReqVO pageReqVO) {
return noticeMapper.selectPage(pageReqVO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void publishNotice(Long id) {
// 校验存在
NoticeDO notice = validateNoticeExists(id);
// 校验状态
if (notice.getStatus() != 0) {
throw exception(new com.fjrcloud.community.framework.common.exception.ErrorCode(2_004_000_001, "只有草稿状态的通知才能发布"));
}
// 更新状态为已发布
NoticeDO updateObj = new NoticeDO();
updateObj.setId(id);
updateObj.setStatus(1);
updateObj.setPublishTime(LocalDateTime.now());
noticeMapper.updateById(updateObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void revokeNotice(Long id) {
// 校验存在
NoticeDO notice = validateNoticeExists(id);
// 校验状态
if (notice.getStatus() != 1) {
throw exception(new com.fjrcloud.community.framework.common.exception.ErrorCode(2_004_000_002, "只有已发布状态的通知才能撤回"));
}
// 更新状态为已撤回
NoticeDO updateObj = new NoticeDO();
updateObj.setId(id);
updateObj.setStatus(3);
noticeMapper.updateById(updateObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int autoPublishNotices() {
// 查询需要发布的通知:草稿状态 + 发布时间已到
LocalDateTime now = LocalDateTime.now();
List<NoticeDO> notices = noticeMapper.selectList(new com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX<NoticeDO>()
.eq(NoticeDO::getStatus, 0) // 草稿状态
.eq(NoticeDO::getPublishType, 2) // 定时发布
.le(NoticeDO::getPublishTime, now) // 发布时间已到
);
if (notices == null || notices.isEmpty()) {
return 0;
}
// 批量更新状态为已发布
int count = 0;
for (NoticeDO notice : notices) {
NoticeDO updateObj = new NoticeDO();
updateObj.setId(notice.getId());
updateObj.setStatus(1); // 已发布
noticeMapper.updateById(updateObj);
count++;
}
return count;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int autoExpireNotices() {
// 查询需要过期的通知:已发布状态 + 结束类型是定时结束 + 结束时间已到
LocalDateTime now = LocalDateTime.now();
List<NoticeDO> notices = noticeMapper.selectList(new com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX<NoticeDO>()
.eq(NoticeDO::getStatus, 1) // 已发布状态
.eq(NoticeDO::getEndType, 2) // 定时结束
.le(NoticeDO::getEndTime, now) // 结束时间已到
);
if (notices == null || notices.isEmpty()) {
return 0;
}
// 批量更新状态为已过期
int count = 0;
for (NoticeDO notice : notices) {
NoticeDO updateObj = new NoticeDO();
updateObj.setId(notice.getId());
updateObj.setStatus(2); // 已过期
noticeMapper.updateById(updateObj);
count++;
}
return count;
}
/**
*
*
* @param id ID
* @return
*/
private NoticeDO validateNoticeExists(Long id) {
NoticeDO notice = noticeMapper.selectById(id);
if (notice == null) {
throw exception(NOTICE_NOT_EXISTS);
}
return notice;
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fjrcloud.community.module.community.dal.mysql.notice.NoticeMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>