From de01a3984869859a9a4a9177481ca2944254db84 Mon Sep 17 00:00:00 2001 From: liwentao Date: Thu, 30 Apr 2026 15:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9B=A2=E8=AF=BE=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/converter/GroupCourseConverter.java | 55 +++++++ .../gym/manage/db/dao/GroupCourseDao.java | 23 +++ .../db/entity/GroupCourseBookingEntity.java | 75 +++++++++ .../manage/db/entity/GroupCourseEntity.java | 148 ++++++++++++++++++ .../db/repository/GroupCourseRepository.java | 57 +++++++ .../manage/sys/core/domain/GroupCourse.java | 146 +++++++++++++++++ .../repository/IGroupCourseRepository.java | 14 ++ .../sys/core/service/IGroupCourseService.java | 11 ++ .../core/service/impl/GroupCourseService.java | 42 +++++ .../groupCourse/GroupCourseHandler.java | 40 +++++ 10 files changed, 611 insertions(+) create mode 100644 gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/converter/GroupCourseConverter.java create mode 100644 gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/dao/GroupCourseDao.java create mode 100644 gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseBookingEntity.java create mode 100644 gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseEntity.java create mode 100644 gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/repository/GroupCourseRepository.java create mode 100644 gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/domain/GroupCourse.java create mode 100644 gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/repository/IGroupCourseRepository.java create mode 100644 gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/IGroupCourseService.java create mode 100644 gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/impl/GroupCourseService.java create mode 100644 gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/handler/groupCourse/GroupCourseHandler.java diff --git a/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/converter/GroupCourseConverter.java b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/converter/GroupCourseConverter.java new file mode 100644 index 0000000..87b66ad --- /dev/null +++ b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/converter/GroupCourseConverter.java @@ -0,0 +1,55 @@ +package cn.novalon.gym.manage.db.converter;/* + * @author:liwentao + * @date:2026/4/26-04-26-13:18 + */ + +import cn.hutool.core.bean.BeanUtil; +import cn.novalon.gym.manage.db.entity.GroupCourseEntity; +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class GroupCourseConverter { + public GroupCourse toDomain(GroupCourseEntity entity){ + if(entity == null){ + return null; + } + GroupCourse groupCourse = new GroupCourse(); + BeanUtil.copyProperties(entity,groupCourse); + log.info("转换bean,entity-domain:",groupCourse); + return groupCourse; + } + + public GroupCourseEntity toEntity(GroupCourse domain){ + if(domain == null){ + return null; + } + GroupCourseEntity entity = new GroupCourseEntity(); + BeanUtil.copyProperties(domain,entity); + log.info("转换bean,domain-entity:",entity); + return entity; + } + + public List toDomainList(List entities){ + if (entities == null) { + return null; + } + return entities.stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } + + public List toEntityList(List groupCourses){ + if (groupCourses == null) { + return null; + } + return groupCourses.stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } +} diff --git a/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/dao/GroupCourseDao.java b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/dao/GroupCourseDao.java new file mode 100644 index 0000000..0855162 --- /dev/null +++ b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/dao/GroupCourseDao.java @@ -0,0 +1,23 @@ +package cn.novalon.gym.manage.db.dao; + +import cn.novalon.gym.manage.db.entity.GroupCourseEntity; +import cn.novalon.gym.manage.db.entity.SysUserEntity; +import org.springframework.data.domain.Sort; +import org.springframework.data.r2dbc.repository.R2dbcRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Repository +public interface GroupCourseDao extends R2dbcRepository { + + Mono findByIdIsAndDeletedAtIsNull(Long id); + + Flux findAll(); + + Flux findAll(Sort sort); + + Flux findAllByDeletedAtIsNull(); + + Flux findAllByDeletedAtIsNull(Sort sort); +} diff --git a/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseBookingEntity.java b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseBookingEntity.java new file mode 100644 index 0000000..f414735 --- /dev/null +++ b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseBookingEntity.java @@ -0,0 +1,75 @@ +package cn.novalon.gym.manage.db.entity; + +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +import java.util.Date; + +/** + * @author:liwentao + * @date:2026/4/25-04-25-17:50 + * 团课预约记录表 + */ + +@Table("group_course_booking") +public class GroupCourseBookingEntity extends BaseEntity { + + //团课id + @Column("course_id") + private Long courseId; + + //用户id + @Column("user_id") + private Long userId; + + //预约时间 + @Column("booking_time") + private Date bookingTime; + + //状态:0-已预约,1-已取消,2-已出席,3-缺席 + @Column("status") + private Long status; + //取消时间 + @Column("cancel_time") + private Date cancelTime; + + public Long getCourseId() { + return courseId; + } + + public void setCourseId(Long courseId) { + this.courseId = courseId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getBookingTime() { + return bookingTime; + } + + public void setBookingTime(Date bookingTime) { + this.bookingTime = bookingTime; + } + + public Long getStatus() { + return status; + } + + public void setStatus(Long status) { + this.status = status; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } +} diff --git a/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseEntity.java b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseEntity.java new file mode 100644 index 0000000..67cc612 --- /dev/null +++ b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/entity/GroupCourseEntity.java @@ -0,0 +1,148 @@ +package cn.novalon.gym.manage.db.entity; +/** + * @author:liwentao + * @date:2026/4/25-04-25-17:34 + * 团课表 + */ + +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +import java.time.LocalDateTime; +import java.util.Date; + +@Table("group_course") +public class GroupCourseEntity extends BaseEntity { + + //课程名称 + @Column("course_name") + private String courseName; + + //教练id + @Column("coach_id") + private Long coachId; + + //课程类型 + @Column("course_type") + private Long courseType; + + //开始时间 + @Column("start_time") + private LocalDateTime startTime; + + //结束时间 + @Column("end_time") + private LocalDateTime endTime; + + //最大参与人数 + @Column("max_members") + private Integer maxMembers; + + //当前参与人数 + @Column("current_members") + private Integer currentMembers; + + //课程状态:0-正常,1-已取消,2-已结束 + @Column("status") + private Long status; + + //上课地点 + @Column("location") + private String location; + + //封面图URL + @Column("cover_image") + private String coverImage; + + //课程描述 + @Column("description") + private String description; + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getCoachId() { + return coachId; + } + + public void setCoachId(Long coachId) { + this.coachId = coachId; + } + + public Long getCourseType() { + return courseType; + } + + public void setCourseType(Long courseType) { + this.courseType = courseType; + } + + public LocalDateTime getStartTime() { + return startTime; + } + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } + + public LocalDateTime getEndTime() { + return endTime; + } + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + } + + public Integer getMaxMembers() { + return maxMembers; + } + + public void setMaxMembers(Integer maxMembers) { + this.maxMembers = maxMembers; + } + + public Integer getCurrentMembers() { + return currentMembers; + } + + public void setCurrentMembers(Integer currentMembers) { + this.currentMembers = currentMembers; + } + + public Long getStatus() { + return status; + } + + public void setStatus(Long status) { + this.status = status; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getCoverImage() { + return coverImage; + } + + public void setCoverImage(String coverImage) { + this.coverImage = coverImage; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/repository/GroupCourseRepository.java b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/repository/GroupCourseRepository.java new file mode 100644 index 0000000..d4846b9 --- /dev/null +++ b/gym-manage-api/manage-db/src/main/java/cn/novalon/gym/manage/db/repository/GroupCourseRepository.java @@ -0,0 +1,57 @@ +package cn.novalon.gym.manage.db.repository; + +import cn.novalon.gym.manage.db.converter.GroupCourseConverter; +import cn.novalon.gym.manage.db.dao.GroupCourseDao; +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import cn.novalon.gym.manage.sys.core.repository.IGroupCourseRepository; +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; + +/** + * @author:liwentao + * @date:2026/4/26-04-26-14:16 + */ +@Repository +public class GroupCourseRepository implements IGroupCourseRepository { + private final GroupCourseDao groupCourseDao; + private final GroupCourseConverter groupCourseConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; + + public GroupCourseRepository(GroupCourseDao groupCourseDao,GroupCourseConverter groupCourseConverter, + R2dbcEntityTemplate r2dbcEntityTemplate){ + this.groupCourseDao = groupCourseDao; + this.groupCourseConverter = groupCourseConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; + } + + @Override + public Mono findByIdAndDeletedAtIsNull(Long id) { + return groupCourseDao.findByIdIsAndDeletedAtIsNull(id) + .map(groupCourseConverter::toDomain); + } + + @Override + public Flux findAll() { + return groupCourseDao.findAll() + .map(groupCourseConverter::toDomain); + } + + public Flux findAll(Sort sort) { + return groupCourseDao.findAll(sort) + .map(groupCourseConverter::toDomain); + } + + @Override + public Flux findByDeletedAtIsNull() { + return groupCourseDao.findAllByDeletedAtIsNull() + .map(groupCourseConverter::toDomain); + } + + public Flux findByDeletedAtIsNull(Sort sort) { + return groupCourseDao.findAllByDeletedAtIsNull(sort) + .map(groupCourseConverter::toDomain); + } +} diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/domain/GroupCourse.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/domain/GroupCourse.java new file mode 100644 index 0000000..11b9949 --- /dev/null +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/domain/GroupCourse.java @@ -0,0 +1,146 @@ +package cn.novalon.gym.manage.sys.core.domain; +/** + * @author:liwentao + * @date:2026/4/26-04-26-13:20 + */ + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.relational.core.mapping.Column; + +import java.time.LocalDateTime; +import java.util.Date; +@Schema(description = "") +public class GroupCourse extends BaseDomain{ + + //课程名称 + @Schema(description = "团课名", example = "Push-up") + private String courseName; + + //教练id + @Schema(description = "教练id", example = "1") + private Long coachId; + + //课程类型 + @Schema(description = "课程类型", example = "1") + private Long courseType; + + //开始时间 + @Schema(description = "开始时间", example = "2026-01-01") + private LocalDateTime startTime; + + //结束时间 + @Schema(description = "结束时间", example = "2026-01-02") + private LocalDateTime endTime; + + //最大参与人数 + @Schema(description = "最大参与人数", example = "20") + private Integer maxMembers; + + //当前参与人数 + @Schema(description = "当前参与人数", example = "2") + private Integer currentMembers; + + //课程状态:0-正常,1-已取消,2-已结束 + @Schema(description = "课程状态", example = "0") + private Long status; + + //上课地点 + @Schema(description = "上课地点", example = "龙泉驿区幸福路") + private String location; + + //封面图URL + @Schema(description = "封面图URL", example = "https://12345.com") + private String coverImage; + + //课程描述 + @Schema(description = "课程描述", example = "从入门到入土") + private String description; + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public Long getCoachId() { + return coachId; + } + + public void setCoachId(Long coachId) { + this.coachId = coachId; + } + + public Long getCourseType() { + return courseType; + } + + public void setCourseType(Long courseType) { + this.courseType = courseType; + } + + public LocalDateTime getStartTime() { + return startTime; + } + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } + + public LocalDateTime getEndTime() { + return endTime; + } + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + } + + public Integer getMaxMembers() { + return maxMembers; + } + + public void setMaxMembers(Integer maxMembers) { + this.maxMembers = maxMembers; + } + + public Integer getCurrentMembers() { + return currentMembers; + } + + public void setCurrentMembers(Integer currentMembers) { + this.currentMembers = currentMembers; + } + + public Long getStatus() { + return status; + } + + public void setStatus(Long status) { + this.status = status; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getCoverImage() { + return coverImage; + } + + public void setCoverImage(String coverImage) { + this.coverImage = coverImage; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/repository/IGroupCourseRepository.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/repository/IGroupCourseRepository.java new file mode 100644 index 0000000..2d020d4 --- /dev/null +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/repository/IGroupCourseRepository.java @@ -0,0 +1,14 @@ +package cn.novalon.gym.manage.sys.core.repository; + +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import org.springframework.data.domain.Sort; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface IGroupCourseRepository { + Mono findByIdAndDeletedAtIsNull(Long id); + Flux findAll(); + Flux findAll(Sort sort); + Flux findByDeletedAtIsNull(); + Flux findByDeletedAtIsNull(Sort sort); +} diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/IGroupCourseService.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/IGroupCourseService.java new file mode 100644 index 0000000..28efd2e --- /dev/null +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/IGroupCourseService.java @@ -0,0 +1,11 @@ +package cn.novalon.gym.manage.sys.core.service; + +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface IGroupCourseService { + Mono findById(Long id); + Flux findAll(); + Flux findAll(boolean includeDeleted); +} diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/impl/GroupCourseService.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/impl/GroupCourseService.java new file mode 100644 index 0000000..2b1fcbf --- /dev/null +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/core/service/impl/GroupCourseService.java @@ -0,0 +1,42 @@ +package cn.novalon.gym.manage.sys.core.service.impl; + +import cn.novalon.gym.manage.sys.audit.service.IAuditLogService; +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import cn.novalon.gym.manage.sys.core.repository.IGroupCourseRepository; +import cn.novalon.gym.manage.sys.core.service.IGroupCourseService; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * @author:liwentao + * @date:2026/4/26-04-26-14:12 + */ +@Service +public class GroupCourseService implements IGroupCourseService { + private final IGroupCourseRepository groupCourseRepository; + private final IAuditLogService auditLogService; + public GroupCourseService(IGroupCourseRepository groupCourseRepository, IAuditLogService auditLogService){ + this.groupCourseRepository = groupCourseRepository; + this.auditLogService = auditLogService; + } + + @Override + public Mono findById(Long id) { + return groupCourseRepository.findByIdAndDeletedAtIsNull(id); + } + + @Override + public Flux findAll() { + return groupCourseRepository.findAll(); + } + + @Override + public Flux findAll(boolean includeDeleted) { + if(includeDeleted){ + return groupCourseRepository.findAll(); + }else{ + return groupCourseRepository.findByDeletedAtIsNull(); + } + } +} diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/handler/groupCourse/GroupCourseHandler.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/handler/groupCourse/GroupCourseHandler.java new file mode 100644 index 0000000..b439351 --- /dev/null +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/handler/groupCourse/GroupCourseHandler.java @@ -0,0 +1,40 @@ +package cn.novalon.gym.manage.sys.handler.groupCourse; + +import cn.novalon.gym.manage.sys.core.domain.GroupCourse; +import cn.novalon.gym.manage.sys.core.service.IGroupCourseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Validator; +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; + +/** + * @author:liwentao + * @date:2026/4/26-04-26-14:30 + */ +@Component +@Tag(name="团课管理",description = "团课相关操作") +public class GroupCourseHandler { + private final IGroupCourseService groupCourseService; + private final Validator validator; + public GroupCourseHandler(IGroupCourseService groupCourseService,Validator validator){ + this.groupCourseService = groupCourseService; + this.validator = validator; + } + + @Operation(summary = "获取所有用户", description = "获取系统中所有用户列表") + public Mono getAllGroupCourse(ServerRequest request){ + boolean includeDeleted = Boolean.valueOf(request.queryParam("includeDeleted").orElse("false")); + return ServerResponse.ok() + .body(groupCourseService.findAll(includeDeleted), GroupCourse.class); + } + + public Mono getGroupCourseById(ServerRequest request){ + Long id = Long.valueOf(request.pathVariable("id")); + return groupCourseService.findById(id) + .flatMap(groupCourse -> ServerResponse.ok().bodyValue(groupCourse)) + .switchIfEmpty(ServerResponse.notFound().build()); + } +}