fix: 活动公告列表回显活动名称并修复取消发布
Made-with: Cursor
This commit is contained in:
parent
b19acbd6d5
commit
c4f4613c49
@ -1,8 +1,11 @@
|
|||||||
package com.competition.modules.biz.contest.controller;
|
package com.competition.modules.biz.contest.controller;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.competition.common.enums.ErrorCode;
|
||||||
import com.competition.common.enums.PublishStatus;
|
import com.competition.common.enums.PublishStatus;
|
||||||
|
import com.competition.common.exception.BusinessException;
|
||||||
import com.competition.common.result.PageResult;
|
import com.competition.common.result.PageResult;
|
||||||
import com.competition.common.result.Result;
|
import com.competition.common.result.Result;
|
||||||
import com.competition.common.util.SecurityUtil;
|
import com.competition.common.util.SecurityUtil;
|
||||||
@ -19,7 +22,9 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Tag(name = "活动公告")
|
@Tag(name = "活动公告")
|
||||||
@RestController
|
@RestController
|
||||||
@ -86,6 +91,7 @@ public class ContestNoticeController {
|
|||||||
.eq(BizContestNotice::getContestId, contestId)
|
.eq(BizContestNotice::getContestId, contestId)
|
||||||
.eq(BizContestNotice::getTenantId, tenantId)
|
.eq(BizContestNotice::getTenantId, tenantId)
|
||||||
.orderByDesc(BizContestNotice::getCreateTime));
|
.orderByDesc(BizContestNotice::getCreateTime));
|
||||||
|
noticeService.fillContestInfo(list);
|
||||||
return Result.success(list);
|
return Result.success(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +117,7 @@ public class ContestNoticeController {
|
|||||||
|
|
||||||
wrapper.orderByDesc(BizContestNotice::getCreateTime);
|
wrapper.orderByDesc(BizContestNotice::getCreateTime);
|
||||||
Page<BizContestNotice> result = noticeService.page(new Page<>(page, pageSize), wrapper);
|
Page<BizContestNotice> result = noticeService.page(new Page<>(page, pageSize), wrapper);
|
||||||
|
noticeService.fillContestInfo(result.getRecords());
|
||||||
return Result.success(PageResult.from(result));
|
return Result.success(PageResult.from(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,23 +125,85 @@ public class ContestNoticeController {
|
|||||||
@RequirePermission("notice:read")
|
@RequirePermission("notice:read")
|
||||||
@Operation(summary = "查询公告详情")
|
@Operation(summary = "查询公告详情")
|
||||||
public Result<BizContestNotice> findDetail(@PathVariable Long id) {
|
public Result<BizContestNotice> findDetail(@PathVariable Long id) {
|
||||||
return Result.success(noticeService.getById(id));
|
BizContestNotice notice = noticeService.getById(id);
|
||||||
|
if (notice != null) {
|
||||||
|
noticeService.fillContestInfo(Collections.singletonList(notice));
|
||||||
|
}
|
||||||
|
return Result.success(notice);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PatchMapping("/{id}")
|
@PatchMapping("/{id}")
|
||||||
@RequirePermission("notice:update")
|
@RequirePermission("notice:update")
|
||||||
@Operation(summary = "更新公告")
|
@Operation(summary = "更新公告(部分字段;publishTime 为 null 或空串表示取消发布并写入数据库 NULL)")
|
||||||
public Result<Void> update(@PathVariable Long id, @RequestBody CreateNoticeDto dto) {
|
public Result<Void> update(@PathVariable Long id, @RequestBody Map<String, Object> body) {
|
||||||
BizContestNotice notice = new BizContestNotice();
|
Long tenantId = SecurityUtil.getCurrentTenantId();
|
||||||
notice.setId(id);
|
BizContestNotice existing = noticeService.getOne(
|
||||||
notice.setTitle(dto.getTitle());
|
new LambdaQueryWrapper<BizContestNotice>()
|
||||||
notice.setContent(dto.getContent());
|
.eq(BizContestNotice::getId, id)
|
||||||
notice.setNoticeType(dto.getNoticeType());
|
.eq(BizContestNotice::getTenantId, tenantId));
|
||||||
notice.setPriority(dto.getPriority());
|
if (existing == null) {
|
||||||
if (StringUtils.hasText(dto.getPublishTime())) {
|
throw BusinessException.of(ErrorCode.NOT_FOUND, "公告不存在");
|
||||||
notice.setPublishTime(parseDateTime(dto.getPublishTime()));
|
|
||||||
}
|
}
|
||||||
noticeService.updateById(notice);
|
|
||||||
|
LambdaUpdateWrapper<BizContestNotice> uw = new LambdaUpdateWrapper<>();
|
||||||
|
uw.eq(BizContestNotice::getId, id);
|
||||||
|
uw.eq(BizContestNotice::getTenantId, tenantId);
|
||||||
|
|
||||||
|
boolean hasUpdate = false;
|
||||||
|
if (body.containsKey("title")) {
|
||||||
|
Object v = body.get("title");
|
||||||
|
if (v != null) {
|
||||||
|
uw.set(BizContestNotice::getTitle, String.valueOf(v));
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (body.containsKey("content")) {
|
||||||
|
Object v = body.get("content");
|
||||||
|
if (v != null) {
|
||||||
|
uw.set(BizContestNotice::getContent, String.valueOf(v));
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (body.containsKey("noticeType")) {
|
||||||
|
Object v = body.get("noticeType");
|
||||||
|
if (v != null) {
|
||||||
|
uw.set(BizContestNotice::getNoticeType, String.valueOf(v));
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (body.containsKey("priority")) {
|
||||||
|
Object v = body.get("priority");
|
||||||
|
if (v instanceof Number) {
|
||||||
|
uw.set(BizContestNotice::getPriority, ((Number) v).intValue());
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (body.containsKey("contestId")) {
|
||||||
|
Object v = body.get("contestId");
|
||||||
|
if (v instanceof Number) {
|
||||||
|
uw.set(BizContestNotice::getContestId, ((Number) v).longValue());
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 仅当请求体包含 publishTime 键时才改发布时间:null / 空串 = 取消发布(必须写入 SQL NULL)
|
||||||
|
if (body.containsKey("publishTime")) {
|
||||||
|
Object v = body.get("publishTime");
|
||||||
|
if (v == null || (v instanceof String && !StringUtils.hasText((String) v))) {
|
||||||
|
uw.set(BizContestNotice::getPublishTime, null);
|
||||||
|
hasUpdate = true;
|
||||||
|
} else if (v instanceof String && StringUtils.hasText((String) v)) {
|
||||||
|
LocalDateTime pt = parseDateTime((String) v);
|
||||||
|
if (pt != null) {
|
||||||
|
uw.set(BizContestNotice::getPublishTime, pt);
|
||||||
|
hasUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasUpdate) {
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
noticeService.getBaseMapper().update(null, uw);
|
||||||
return Result.success();
|
return Result.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,4 +42,9 @@ public class BizContestNotice extends BaseEntity {
|
|||||||
@Schema(description = "发布时间")
|
@Schema(description = "发布时间")
|
||||||
@TableField("publish_time")
|
@TableField("publish_time")
|
||||||
private LocalDateTime publishTime;
|
private LocalDateTime publishTime;
|
||||||
|
|
||||||
|
/** 关联活动(仅查询接口填充,不落库) */
|
||||||
|
@Schema(description = "关联活动")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private BizContest contest;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,5 +3,12 @@ package com.competition.modules.biz.contest.service;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.competition.modules.biz.contest.entity.BizContestNotice;
|
import com.competition.modules.biz.contest.entity.BizContestNotice;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface IContestNoticeService extends IService<BizContestNotice> {
|
public interface IContestNoticeService extends IService<BizContestNotice> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量填充关联活动名称(仅设置 id、contestName,供前端展示)
|
||||||
|
*/
|
||||||
|
void fillContestInfo(List<BizContestNotice> notices);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,54 @@
|
|||||||
package com.competition.modules.biz.contest.service.impl;
|
package com.competition.modules.biz.contest.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.competition.modules.biz.contest.entity.BizContest;
|
||||||
import com.competition.modules.biz.contest.entity.BizContestNotice;
|
import com.competition.modules.biz.contest.entity.BizContestNotice;
|
||||||
import com.competition.modules.biz.contest.mapper.ContestNoticeMapper;
|
import com.competition.modules.biz.contest.mapper.ContestNoticeMapper;
|
||||||
import com.competition.modules.biz.contest.service.IContestNoticeService;
|
import com.competition.modules.biz.contest.service.IContestNoticeService;
|
||||||
|
import com.competition.modules.biz.contest.service.IContestService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class ContestNoticeServiceImpl extends ServiceImpl<ContestNoticeMapper, BizContestNotice> implements IContestNoticeService {
|
public class ContestNoticeServiceImpl extends ServiceImpl<ContestNoticeMapper, BizContestNotice> implements IContestNoticeService {
|
||||||
|
|
||||||
|
private final IContestService contestService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillContestInfo(List<BizContestNotice> notices) {
|
||||||
|
if (notices == null || notices.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Set<Long> contestIds = notices.stream()
|
||||||
|
.map(BizContestNotice::getContestId)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
if (contestIds.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<BizContest> contests = contestService.listByIds(contestIds);
|
||||||
|
Map<Long, BizContest> map = contests.stream()
|
||||||
|
.collect(Collectors.toMap(BizContest::getId, Function.identity(), (a, b) -> a));
|
||||||
|
for (BizContestNotice notice : notices) {
|
||||||
|
Long cid = notice.getContestId();
|
||||||
|
if (cid == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BizContest c = map.get(cid);
|
||||||
|
if (c != null) {
|
||||||
|
BizContest brief = new BizContest();
|
||||||
|
brief.setId(c.getId());
|
||||||
|
brief.setContestName(c.getContestName());
|
||||||
|
notice.setContest(brief);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user