package com.xjhs.findmemerchant.entity; import com.xjhs.findmemerchant.common.jpa.AbstractBaseEntity; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.Comment; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * 会员实体(C 端用户) * 对应表:members */ @Getter @Setter @Entity @Table( name = "members", indexes = { @Index(name = "idx_members_phone", columnList = "phone") }, uniqueConstraints = { @UniqueConstraint( name = "idx_merchant_phone", columnNames = {"merchant_id", "phone"} ) } ) public class Member extends AbstractBaseEntity { /** * 手机号 */ @Column(name = "phone", nullable = false, length = 11) @Comment("手机号") private String phone; /** * 昵称 */ @Column(name = "nickname", length = 50) @Comment("昵称") private String nickname; /** * 头像地址 */ @Column(name = "avatar", length = 500) @Comment("头像URL") private String avatar; /** * 累计订单数 */ @Column(name = "total_orders", nullable = false) @Comment("累计订单数") private Integer totalOrders = 0; /** * 累计消费金额 */ @Column(name = "total_amount", nullable = false, precision = 12, scale = 2) @Comment("累计消费金额") private BigDecimal totalAmount = BigDecimal.ZERO; /** * 最后一次下单时间 */ @Column(name = "last_order_at") @Comment("最后下单时间") private LocalDateTime lastOrderAt; // ============ 关联关系 ============ /** * 商户 */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "merchant_id", insertable = false, updatable = false) private Merchant merchant; /** * 拥有的券码 */ @OneToMany(mappedBy = "member", fetch = FetchType.LAZY) private List couponCodes; /** * 订单列表 */ @OneToMany(mappedBy = "member", fetch = FetchType.LAZY) private List orders; // ============ 业务方法 ============ /** * 返回脱敏手机号,例如:138****1234 */ public String maskPhone() { if (phone == null || phone.length() != 11) { return phone; } return phone.substring(0, 3) + "****" + phone.substring(7); } /** * 展示用名称:优先昵称,否则使用脱敏手机号 */ public String getDisplayName() { if (nickname != null && !nickname.isBlank()) { return nickname; } return maskPhone(); } /** * 返回头像URL,若为空则返回默认头像 */ public String getAvatarOrDefault() { if (avatar != null && !avatar.isBlank()) { return avatar; } return "/static/default-avatar.png"; } }