findme-backend-merchant-java/src/main/java/com/xjhs/findmemerchant/entity/Member.java
2026-01-09 12:20:44 +08:00

127 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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", 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")
@Comment("累计订单数")
private Integer totalOrders = 0;
/**
* 累计消费金额
*/
@Column(name = "total_amount", 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<CouponCode> couponCodes;
/**
* 订单列表
*/
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<Order> 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";
}
}