新增团课推荐功能
This commit was merged in pull request #29.
This commit is contained in:
+42
@@ -0,0 +1,42 @@
|
||||
package cn.novalon.gym.manage.groupcourse.dao;
|
||||
|
||||
import cn.novalon.gym.manage.groupcourse.entity.GroupCourseRecommendEntity;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.r2dbc.repository.Modifying;
|
||||
import org.springframework.data.r2dbc.repository.Query;
|
||||
import org.springframework.data.r2dbc.repository.R2dbcRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Repository
|
||||
public interface GroupCourseRecommendDao extends R2dbcRepository<GroupCourseRecommendEntity, Long> {
|
||||
|
||||
Mono<GroupCourseRecommendEntity> findByIdAndDeletedAtIsNull(Long id);
|
||||
|
||||
Flux<GroupCourseRecommendEntity> findAllByDeletedAtIsNull();
|
||||
|
||||
Flux<GroupCourseRecommendEntity> findAllByDeletedAtIsNull(Sort sort);
|
||||
|
||||
Flux<GroupCourseRecommendEntity> findByCourseIdAndDeletedAtIsNull(Long courseId);
|
||||
|
||||
Mono<GroupCourseRecommendEntity> findByCourseIdAndDeletedAtIsNullAndIsActiveTrue(Long courseId);
|
||||
|
||||
Flux<GroupCourseRecommendEntity> findByIsActiveTrueAndDeletedAtIsNull();
|
||||
|
||||
Flux<GroupCourseRecommendEntity> findByIsActiveTrueAndDeletedAtIsNull(Sort sort);
|
||||
|
||||
@Modifying
|
||||
@Query("UPDATE group_course_recommend SET is_active = :isActive, updated_at = :updatedAt WHERE id = :id AND deleted_at IS NULL")
|
||||
Mono<Integer> updateActiveStatus(Long id, Boolean isActive, LocalDateTime updatedAt);
|
||||
|
||||
@Modifying
|
||||
@Query("UPDATE group_course_recommend SET deleted_at = :deletedAt WHERE id = :id")
|
||||
Mono<Integer> softDelete(Long id, LocalDateTime deletedAt);
|
||||
|
||||
@Modifying
|
||||
@Query("UPDATE group_course_recommend SET deleted_at = :deletedAt WHERE course_id = :courseId")
|
||||
Mono<Integer> softDeleteByCourseId(Long courseId, LocalDateTime deletedAt);
|
||||
}
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
package cn.novalon.gym.manage.groupcourse.domain;
|
||||
|
||||
import cn.novalon.gym.manage.sys.core.domain.BaseDomain;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
public class GroupCourseRecommend extends BaseDomain {
|
||||
|
||||
@Schema(description = "团课ID", example = "1")
|
||||
private Long courseId;
|
||||
|
||||
@Schema(description = "推荐标题", example = "本周热门课程")
|
||||
private String recommendTitle;
|
||||
|
||||
@Schema(description = "推荐内容", example = "这是一门非常棒的课程,快来参加吧!")
|
||||
private String recommendContent;
|
||||
|
||||
@Schema(description = "推荐理由", example = "教练专业,课程内容丰富")
|
||||
private String recommendReason;
|
||||
|
||||
@Schema(description = "优先级(数字越大优先级越高)", example = "10")
|
||||
private Integer priority;
|
||||
|
||||
@Schema(description = "是否启用", example = "true")
|
||||
private Boolean isActive;
|
||||
|
||||
@Schema(description = "团课信息")
|
||||
private GroupCourse groupCourse;
|
||||
|
||||
public Long getCourseId() {
|
||||
return courseId;
|
||||
}
|
||||
|
||||
public void setCourseId(Long courseId) {
|
||||
this.courseId = courseId;
|
||||
}
|
||||
|
||||
public String getRecommendTitle() {
|
||||
return recommendTitle;
|
||||
}
|
||||
|
||||
public void setRecommendTitle(String recommendTitle) {
|
||||
this.recommendTitle = recommendTitle;
|
||||
}
|
||||
|
||||
public String getRecommendContent() {
|
||||
return recommendContent;
|
||||
}
|
||||
|
||||
public void setRecommendContent(String recommendContent) {
|
||||
this.recommendContent = recommendContent;
|
||||
}
|
||||
|
||||
public String getRecommendReason() {
|
||||
return recommendReason;
|
||||
}
|
||||
|
||||
public void setRecommendReason(String recommendReason) {
|
||||
this.recommendReason = recommendReason;
|
||||
}
|
||||
|
||||
public Integer getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void setPriority(Integer priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
public Boolean getIsActive() {
|
||||
return isActive;
|
||||
}
|
||||
|
||||
public void setIsActive(Boolean isActive) {
|
||||
this.isActive = isActive;
|
||||
}
|
||||
|
||||
public GroupCourse getGroupCourse() {
|
||||
return groupCourse;
|
||||
}
|
||||
|
||||
public void setGroupCourse(GroupCourse groupCourse) {
|
||||
this.groupCourse = groupCourse;
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
package cn.novalon.gym.manage.groupcourse.entity;
|
||||
|
||||
import cn.novalon.gym.manage.db.entity.BaseEntity;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Table("group_course_recommend")
|
||||
public class GroupCourseRecommendEntity extends BaseEntity {
|
||||
|
||||
@Column("course_id")
|
||||
private Long courseId;
|
||||
|
||||
@Column("recommend_title")
|
||||
private String recommendTitle;
|
||||
|
||||
@Column("recommend_content")
|
||||
private String recommendContent;
|
||||
|
||||
@Column("recommend_reason")
|
||||
private String recommendReason;
|
||||
|
||||
@Column("priority")
|
||||
private Integer priority;
|
||||
|
||||
@Column("is_active")
|
||||
private Boolean isActive;
|
||||
|
||||
public Long getCourseId() {
|
||||
return courseId;
|
||||
}
|
||||
|
||||
public void setCourseId(Long courseId) {
|
||||
this.courseId = courseId;
|
||||
}
|
||||
|
||||
public String getRecommendTitle() {
|
||||
return recommendTitle;
|
||||
}
|
||||
|
||||
public void setRecommendTitle(String recommendTitle) {
|
||||
this.recommendTitle = recommendTitle;
|
||||
}
|
||||
|
||||
public String getRecommendContent() {
|
||||
return recommendContent;
|
||||
}
|
||||
|
||||
public void setRecommendContent(String recommendContent) {
|
||||
this.recommendContent = recommendContent;
|
||||
}
|
||||
|
||||
public String getRecommendReason() {
|
||||
return recommendReason;
|
||||
}
|
||||
|
||||
public void setRecommendReason(String recommendReason) {
|
||||
this.recommendReason = recommendReason;
|
||||
}
|
||||
|
||||
public Integer getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void setPriority(Integer priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
public Boolean getIsActive() {
|
||||
return isActive;
|
||||
}
|
||||
|
||||
public void setIsActive(Boolean isActive) {
|
||||
this.isActive = isActive;
|
||||
}
|
||||
}
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
package cn.novalon.gym.manage.groupcourse.handler;
|
||||
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
||||
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseRecommendService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.reactive.function.server.ServerRequest;
|
||||
import org.springframework.web.reactive.function.server.ServerResponse;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
@Tag(name = "团课推荐管理", description = "团课推荐相关操作")
|
||||
public class GroupCourseRecommendHandler {
|
||||
|
||||
private final IGroupCourseRecommendService recommendService;
|
||||
|
||||
public GroupCourseRecommendHandler(IGroupCourseRecommendService recommendService) {
|
||||
this.recommendService = recommendService;
|
||||
}
|
||||
|
||||
@Operation(summary = "获取所有团课推荐", description = "获取系统中所有团课推荐列表,支持按优先级排序")
|
||||
public Mono<ServerResponse> getAllRecommendations(ServerRequest request) {
|
||||
String sortBy = request.queryParam("sortBy").orElse("priority");
|
||||
String sortOrder = request.queryParam("sortOrder").orElse("desc");
|
||||
|
||||
return ServerResponse.ok()
|
||||
.body(recommendService.findAll(sortBy, sortOrder), GroupCourseRecommend.class);
|
||||
}
|
||||
|
||||
@Operation(summary = "获取所有启用的团课推荐", description = "获取系统中所有已启用的团课推荐列表(按优先级排序)")
|
||||
public Mono<ServerResponse> getAllActiveRecommendations(ServerRequest request) {
|
||||
return ServerResponse.ok()
|
||||
.body(recommendService.findAllActive(), GroupCourseRecommend.class);
|
||||
}
|
||||
|
||||
@Operation(summary = "根据ID获取团课推荐", description = "根据ID获取团课推荐详情")
|
||||
public Mono<ServerResponse> getRecommendationById(ServerRequest request) {
|
||||
Long id = Long.valueOf(request.pathVariable("id"));
|
||||
return recommendService.findById(id)
|
||||
.flatMap(recommend -> ServerResponse.ok().bodyValue(recommend))
|
||||
.switchIfEmpty(ServerResponse.notFound().build());
|
||||
}
|
||||
|
||||
@Operation(summary = "根据团课ID获取推荐", description = "根据团课ID获取该团课的推荐信息")
|
||||
public Mono<ServerResponse> getRecommendationsByCourseId(ServerRequest request) {
|
||||
Long courseId = Long.valueOf(request.pathVariable("courseId"));
|
||||
return ServerResponse.ok()
|
||||
.body(recommendService.findByCourseId(courseId), GroupCourseRecommend.class);
|
||||
}
|
||||
|
||||
@Operation(summary = "创建团课推荐", description = "创建新的团课推荐")
|
||||
public Mono<ServerResponse> createRecommendation(ServerRequest request) {
|
||||
return request.bodyToMono(GroupCourseRecommend.class)
|
||||
.flatMap(recommend -> {
|
||||
if (recommend.getCourseId() == null) {
|
||||
Map<String, Object> error = new HashMap<>();
|
||||
error.put("success", false);
|
||||
error.put("message", "团课ID不能为空");
|
||||
return ServerResponse.badRequest().bodyValue(error);
|
||||
}
|
||||
|
||||
return recommendService.create(recommend)
|
||||
.flatMap(r -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", true);
|
||||
response.put("message", "团课推荐创建成功");
|
||||
response.put("data", r);
|
||||
return ServerResponse.ok().bodyValue(response);
|
||||
})
|
||||
.onErrorResume(error -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", false);
|
||||
response.put("message", error.getMessage());
|
||||
return ServerResponse.badRequest().bodyValue(response);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "更新团课推荐", description = "更新指定团课推荐信息")
|
||||
public Mono<ServerResponse> updateRecommendation(ServerRequest request) {
|
||||
Long id = Long.valueOf(request.pathVariable("id"));
|
||||
|
||||
return request.bodyToMono(GroupCourseRecommend.class)
|
||||
.flatMap(recommend -> {
|
||||
return recommendService.update(id, recommend)
|
||||
.flatMap(r -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", true);
|
||||
response.put("message", "团课推荐更新成功");
|
||||
response.put("data", r);
|
||||
return ServerResponse.ok().bodyValue(response);
|
||||
})
|
||||
.onErrorResume(error -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", false);
|
||||
response.put("message", error.getMessage());
|
||||
return ServerResponse.badRequest().bodyValue(response);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "删除团课推荐", description = "删除指定团课推荐(软删除)")
|
||||
public Mono<ServerResponse> deleteRecommendation(ServerRequest request) {
|
||||
Long id = Long.valueOf(request.pathVariable("id"));
|
||||
|
||||
return recommendService.delete(id)
|
||||
.then(Mono.defer(() -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", true);
|
||||
response.put("message", "团课推荐删除成功");
|
||||
return ServerResponse.ok().bodyValue(response);
|
||||
}))
|
||||
.onErrorResume(error -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", false);
|
||||
response.put("message", error.getMessage());
|
||||
return ServerResponse.badRequest().bodyValue(response);
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "启用团课推荐", description = "启用指定团课推荐")
|
||||
public Mono<ServerResponse> enableRecommendation(ServerRequest request) {
|
||||
Long id = Long.valueOf(request.pathVariable("id"));
|
||||
|
||||
return recommendService.enable(id)
|
||||
.flatMap(r -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", true);
|
||||
response.put("message", "团课推荐启用成功");
|
||||
response.put("data", r);
|
||||
return ServerResponse.ok().bodyValue(response);
|
||||
})
|
||||
.onErrorResume(error -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", false);
|
||||
response.put("message", error.getMessage());
|
||||
return ServerResponse.badRequest().bodyValue(response);
|
||||
});
|
||||
}
|
||||
|
||||
@Operation(summary = "禁用团课推荐", description = "禁用指定团课推荐")
|
||||
public Mono<ServerResponse> disableRecommendation(ServerRequest request) {
|
||||
Long id = Long.valueOf(request.pathVariable("id"));
|
||||
|
||||
return recommendService.disable(id)
|
||||
.flatMap(r -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", true);
|
||||
response.put("message", "团课推荐禁用成功");
|
||||
response.put("data", r);
|
||||
return ServerResponse.ok().bodyValue(response);
|
||||
})
|
||||
.onErrorResume(error -> {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("success", false);
|
||||
response.put("message", error.getMessage());
|
||||
return ServerResponse.badRequest().bodyValue(response);
|
||||
});
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package cn.novalon.gym.manage.groupcourse.repository;
|
||||
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public interface IGroupCourseRecommendRepository {
|
||||
|
||||
Mono<GroupCourseRecommend> findById(Long id);
|
||||
|
||||
Flux<GroupCourseRecommend> findAll();
|
||||
|
||||
Flux<GroupCourseRecommend> findAll(String sortBy, String sortOrder);
|
||||
|
||||
Flux<GroupCourseRecommend> findAllActive();
|
||||
|
||||
Flux<GroupCourseRecommend> findByCourseId(Long courseId);
|
||||
|
||||
Mono<GroupCourseRecommend> findActiveByCourseId(Long courseId);
|
||||
|
||||
Mono<GroupCourseRecommend> save(GroupCourseRecommend recommend);
|
||||
|
||||
Mono<GroupCourseRecommend> update(GroupCourseRecommend recommend);
|
||||
|
||||
Mono<Void> deleteById(Long id);
|
||||
|
||||
Mono<Void> deleteByCourseId(Long courseId);
|
||||
|
||||
Mono<GroupCourseRecommend> updateActiveStatus(Long id, Boolean isActive);
|
||||
}
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
package cn.novalon.gym.manage.groupcourse.repository.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.novalon.gym.manage.groupcourse.dao.GroupCourseRecommendDao;
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
||||
import cn.novalon.gym.manage.groupcourse.entity.GroupCourseRecommendEntity;
|
||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRecommendRepository;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Repository
|
||||
public class GroupCourseRecommendRepository implements IGroupCourseRecommendRepository {
|
||||
|
||||
private final GroupCourseRecommendDao recommendDao;
|
||||
private final R2dbcEntityTemplate r2dbcEntityTemplate;
|
||||
|
||||
public GroupCourseRecommendRepository(GroupCourseRecommendDao recommendDao,
|
||||
R2dbcEntityTemplate r2dbcEntityTemplate) {
|
||||
this.recommendDao = recommendDao;
|
||||
this.r2dbcEntityTemplate = r2dbcEntityTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> findById(Long id) {
|
||||
return recommendDao.findByIdAndDeletedAtIsNull(id)
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAll() {
|
||||
return recommendDao.findAllByDeletedAtIsNull()
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAll(String sortBy, String sortOrder) {
|
||||
Sort.Direction direction = "asc".equalsIgnoreCase(sortOrder)
|
||||
? Sort.Direction.ASC
|
||||
: Sort.Direction.DESC;
|
||||
Sort sort = Sort.by(direction, sortBy);
|
||||
return recommendDao.findAllByDeletedAtIsNull(sort)
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAllActive() {
|
||||
return recommendDao.findByIsActiveTrueAndDeletedAtIsNull(Sort.by(Sort.Direction.DESC, "priority"))
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findByCourseId(Long courseId) {
|
||||
return recommendDao.findByCourseIdAndDeletedAtIsNull(courseId)
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> findActiveByCourseId(Long courseId) {
|
||||
return recommendDao.findByCourseIdAndDeletedAtIsNullAndIsActiveTrue(courseId)
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> save(GroupCourseRecommend recommend) {
|
||||
GroupCourseRecommendEntity entity = toEntity(recommend);
|
||||
entity.setCreatedAt(LocalDateTime.now());
|
||||
entity.setUpdatedAt(LocalDateTime.now());
|
||||
if (entity.getPriority() == null) {
|
||||
entity.setPriority(0);
|
||||
}
|
||||
if (entity.getIsActive() == null) {
|
||||
entity.setIsActive(true);
|
||||
}
|
||||
|
||||
return recommendDao.save(entity)
|
||||
.map(this::toDomain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> update(GroupCourseRecommend recommend) {
|
||||
GroupCourseRecommendEntity entity = toEntity(recommend);
|
||||
entity.setUpdatedAt(LocalDateTime.now());
|
||||
|
||||
return r2dbcEntityTemplate.update(entity)
|
||||
.then(findById(recommend.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> deleteById(Long id) {
|
||||
return recommendDao.softDelete(id, LocalDateTime.now())
|
||||
.then();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> deleteByCourseId(Long courseId) {
|
||||
return recommendDao.softDeleteByCourseId(courseId, LocalDateTime.now())
|
||||
.then();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> updateActiveStatus(Long id, Boolean isActive) {
|
||||
return recommendDao.updateActiveStatus(id, isActive, LocalDateTime.now())
|
||||
.flatMap(updated -> {
|
||||
if (updated > 0) {
|
||||
return findById(id);
|
||||
}
|
||||
return Mono.empty();
|
||||
});
|
||||
}
|
||||
|
||||
private GroupCourseRecommend toDomain(GroupCourseRecommendEntity entity) {
|
||||
if (entity == null) {
|
||||
return null;
|
||||
}
|
||||
GroupCourseRecommend recommend = new GroupCourseRecommend();
|
||||
BeanUtil.copyProperties(entity, recommend);
|
||||
return recommend;
|
||||
}
|
||||
|
||||
private GroupCourseRecommendEntity toEntity(GroupCourseRecommend domain) {
|
||||
if (domain == null) {
|
||||
return null;
|
||||
}
|
||||
GroupCourseRecommendEntity entity = new GroupCourseRecommendEntity();
|
||||
BeanUtil.copyProperties(domain, entity);
|
||||
if (domain.getId() != null) {
|
||||
entity.markNotNew();
|
||||
}
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package cn.novalon.gym.manage.groupcourse.service;
|
||||
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public interface IGroupCourseRecommendService {
|
||||
|
||||
Mono<GroupCourseRecommend> findById(Long id);
|
||||
|
||||
Flux<GroupCourseRecommend> findAll();
|
||||
|
||||
Flux<GroupCourseRecommend> findAll(String sortBy, String sortOrder);
|
||||
|
||||
Flux<GroupCourseRecommend> findAllActive();
|
||||
|
||||
Flux<GroupCourseRecommend> findByCourseId(Long courseId);
|
||||
|
||||
Mono<GroupCourseRecommend> create(GroupCourseRecommend recommend);
|
||||
|
||||
Mono<GroupCourseRecommend> update(Long id, GroupCourseRecommend recommend);
|
||||
|
||||
Mono<Void> delete(Long id);
|
||||
|
||||
Mono<GroupCourseRecommend> enable(Long id);
|
||||
|
||||
Mono<GroupCourseRecommend> disable(Long id);
|
||||
}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
package cn.novalon.gym.manage.groupcourse.service.impl;
|
||||
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourse;
|
||||
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRecommendRepository;
|
||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
||||
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseRecommendService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Service
|
||||
public class GroupCourseRecommendService implements IGroupCourseRecommendService {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(GroupCourseRecommendService.class);
|
||||
|
||||
private final IGroupCourseRecommendRepository recommendRepository;
|
||||
private final IGroupCourseRepository groupCourseRepository;
|
||||
|
||||
public GroupCourseRecommendService(IGroupCourseRecommendRepository recommendRepository,
|
||||
IGroupCourseRepository groupCourseRepository) {
|
||||
this.recommendRepository = recommendRepository;
|
||||
this.groupCourseRepository = groupCourseRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> findById(Long id) {
|
||||
return recommendRepository.findById(id)
|
||||
.flatMap(this::fillGroupCourseInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAll() {
|
||||
return recommendRepository.findAll()
|
||||
.flatMap(this::fillGroupCourseInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAll(String sortBy, String sortOrder) {
|
||||
return recommendRepository.findAll(sortBy, sortOrder)
|
||||
.flatMap(this::fillGroupCourseInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findAllActive() {
|
||||
return recommendRepository.findAllActive()
|
||||
.flatMap(this::fillGroupCourseInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<GroupCourseRecommend> findByCourseId(Long courseId) {
|
||||
return recommendRepository.findByCourseId(courseId)
|
||||
.flatMap(this::fillGroupCourseInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> create(GroupCourseRecommend recommend) {
|
||||
if (recommend.getCourseId() == null) {
|
||||
return Mono.error(new RuntimeException("团课ID不能为空"));
|
||||
}
|
||||
|
||||
return groupCourseRepository.findByIdAndDeletedAtIsNull(recommend.getCourseId())
|
||||
.switchIfEmpty(Mono.error(new RuntimeException("团课不存在")))
|
||||
.flatMap(course -> {
|
||||
return recommendRepository.save(recommend)
|
||||
.doOnSuccess(r -> logger.info("团课推荐创建成功 - id={}, courseId={}", r.getId(), r.getCourseId()))
|
||||
.doOnError(error -> logger.error("团课推荐创建失败 - error: {}", error.getMessage()));
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> update(Long id, GroupCourseRecommend recommend) {
|
||||
return recommendRepository.findById(id)
|
||||
.switchIfEmpty(Mono.error(new RuntimeException("团课推荐不存在")))
|
||||
.flatMap(existing -> {
|
||||
if (recommend.getRecommendTitle() != null) {
|
||||
existing.setRecommendTitle(recommend.getRecommendTitle());
|
||||
}
|
||||
if (recommend.getRecommendContent() != null) {
|
||||
existing.setRecommendContent(recommend.getRecommendContent());
|
||||
}
|
||||
if (recommend.getRecommendReason() != null) {
|
||||
existing.setRecommendReason(recommend.getRecommendReason());
|
||||
}
|
||||
if (recommend.getPriority() != null) {
|
||||
existing.setPriority(recommend.getPriority());
|
||||
}
|
||||
if (recommend.getIsActive() != null) {
|
||||
existing.setIsActive(recommend.getIsActive());
|
||||
}
|
||||
if (recommend.getCourseId() != null) {
|
||||
existing.setCourseId(recommend.getCourseId());
|
||||
}
|
||||
|
||||
return recommendRepository.update(existing);
|
||||
})
|
||||
.doOnSuccess(r -> logger.info("团课推荐更新成功 - id={}", id))
|
||||
.doOnError(error -> logger.error("团课推荐更新失败 - id={}, error: {}", id, error.getMessage()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> delete(Long id) {
|
||||
return recommendRepository.findById(id)
|
||||
.switchIfEmpty(Mono.error(new RuntimeException("团课推荐不存在")))
|
||||
.flatMap(recommend -> {
|
||||
return recommendRepository.deleteById(id)
|
||||
.doOnSuccess(v -> logger.info("团课推荐删除成功 - id={}", id))
|
||||
.doOnError(error -> logger.error("团课推荐删除失败 - id={}, error: {}", id, error.getMessage()));
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> enable(Long id) {
|
||||
return recommendRepository.updateActiveStatus(id, true)
|
||||
.switchIfEmpty(Mono.error(new RuntimeException("团课推荐不存在")))
|
||||
.doOnSuccess(r -> logger.info("团课推荐启用成功 - id={}", id))
|
||||
.doOnError(error -> logger.error("团课推荐启用失败 - id={}, error: {}", id, error.getMessage()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<GroupCourseRecommend> disable(Long id) {
|
||||
return recommendRepository.updateActiveStatus(id, false)
|
||||
.switchIfEmpty(Mono.error(new RuntimeException("团课推荐不存在")))
|
||||
.doOnSuccess(r -> logger.info("团课推荐禁用成功 - id={}", id))
|
||||
.doOnError(error -> logger.error("团课推荐禁用失败 - id={}, error: {}", id, error.getMessage()));
|
||||
}
|
||||
|
||||
private Mono<GroupCourseRecommend> fillGroupCourseInfo(GroupCourseRecommend recommend) {
|
||||
if (recommend.getCourseId() == null) {
|
||||
return Mono.just(recommend);
|
||||
}
|
||||
|
||||
return groupCourseRepository.findByIdAndDeletedAtIsNull(recommend.getCourseId())
|
||||
.map(course -> {
|
||||
recommend.setGroupCourse(course);
|
||||
return recommend;
|
||||
})
|
||||
.defaultIfEmpty(recommend);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user