feat: add CheckinRecord entity and repository

This commit is contained in:
张翔
2026-03-05 13:53:46 +08:00
parent 104fa7e7c8
commit b079bc7aed
2 changed files with 82 additions and 0 deletions
@@ -0,0 +1,54 @@
package com.gym.manage.domain.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Data
@Table("checkin_record")
public class CheckinRecord {
@Id
private Long id;
@Column("tenant_id")
private Long tenantId;
@Column("store_id")
private Long storeId;
@Column("member_id")
private Long memberId;
@Column("checkin_type")
private String checkinType;
@Column("checkin_time")
private LocalDateTime checkinTime;
@Column("checkout_time")
private LocalDateTime checkoutTime;
@Column("device_id")
private String deviceId;
@Column("device_type")
private String deviceType;
@Column("status")
private String status;
@Column("remark")
private String remark;
@Column("created_at")
private LocalDateTime createdAt;
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
}
@@ -0,0 +1,28 @@
package com.gym.manage.domain.repository;
import com.gym.manage.domain.entity.CheckinRecord;
import org.springframework.data.domain.Pageable;
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 CheckinRecordRepository extends R2dbcRepository<CheckinRecord, Long> {
Mono<CheckinRecord> findByIdAndDeletedAtIsNull(Long id);
Flux<CheckinRecord> findByMemberIdAndDeletedAtIsNull(Long memberId, Pageable pageable);
@Query("SELECT * FROM checkin_record WHERE member_id = :memberId " +
"AND DATE(checkin_time) = DATE(:date) AND deleted_at IS NULL " +
"ORDER BY checkin_time DESC LIMIT 1")
Mono<CheckinRecord> findLatestByMemberIdAndDate(Long memberId, LocalDateTime date);
@Query("SELECT COUNT(*) FROM checkin_record WHERE member_id = :memberId " +
"AND checkin_time >= :startTime AND checkin_time <= :endTime AND deleted_at IS NULL")
Mono<Long> countByMemberIdAndTimeRange(Long memberId, LocalDateTime startTime, LocalDateTime endTime);
}